diff --git a/dist/index.html b/dist/index.html index 34cc534..5dda4ca 100644 --- a/dist/index.html +++ b/dist/index.html @@ -9,8 +9,8 @@ - - + + - - + + + \ No newline at end of file diff --git a/dist/v-1454172424320/js/maps/app.js.map b/dist/v-1454172424320/js/maps/app.js.map deleted file mode 100644 index 0f94de2..0000000 --- a/dist/v-1454172424320/js/maps/app.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["app.js"],"names":["configure","i18nInit","init","module","modules","pluginsWithModule","taiga","this","taigaContribPlugins","window","generateHash","components","_","map","x","JSON","stringify","hex_sha1","join","generateUniqueSessionIdentifier","date","randomNumber","Date","getTime","Math","floor","random","sessionId","$routeProvider","$locationProvider","$httpProvider","$provide","$tgEventsProvider","$compileProvider","$translateProvider","$translatePartialLoaderProvider","$animateProvider","authHttpIntercept","decorators","defaultHeaders","loaderIntercept","originalWhen","preferedLangCode","userInfo","versionCheckHttpIntercept","classNameFilter","when","path","route","resolve","angular","extend","languageLoad","$q","$translate","deferred","defer","then","promise","call","templateUrl","controller","controllerAs","loader","title","description","joyride","reloadOnSearch","access","requiresLogin","section","redirectTo","params","pslug","disableHeader","mobileViewport","otherwise","html5Mode","enabled","requireBase","Content-Type","Accept-Language","taigaConfig","defaultLanguage","X-Session-Id","defaults","headers","patch","post","put","get","useApplyAsync","setSessionId","$location","$navUrls","$lightboxService","httpResponseError","response","nextUrl","status","config","cancelable","closeAll","replace","url","indexOf","encodeURIComponent","search","reject","responseError","factory","interceptors","push","loaderService","request","logRequest","requestError","rejection","logResponse","$injector","data","version","element","injector","invoke","_this","$confirm","versionErrorMsg","instant","notify","checksley","updateValidators","linewidth","val","width","lines","valid","nl2br","split","every","line","length","debugInfoEnabled","debugInfo","localStorage","parse","lang","addPart","useLoader","urlTemplate","_version","useSanitizeValueStrategy","addInterpolation","preferredLanguage","fallbackLanguage","getDecorators","each","decorator","provider","messages","moment","locale","defaultMessage","type","email","urlstrict","number","digits","dateIso","alphanum","phone","notnull","notblank","required","regexp","min","max","range","minlength","maxlength","rangelength","mincheck","maxcheck","rangecheck","equalto","updateMessages","$log","$rootscope","$auth","$events","$analytics","appMetaService","projectService","navigationBarService","un","user","debug","contribPlugins","adminPlugins","where","$on","e","ctx","language","Promise","setScheduler","cb","$evalAsync","setupConnection","isAuthenticated","getUser","initialize","event","next","start","setSection","setProjectBySlug","cleanProject","setAll","addMobileViewport","removeMobileViewport","enableHeader","filter","plugin","value","concat","run","TaigaBase","TaigaController","TaigaService","child","parent","ctor","constructor","key","hasProp","prototype","__super__","hasOwnProperty","bind","fn","me","apply","arguments","superClass","onInitialDataError","xhr","location","navUrls","q","Base","Service","Controller","bindMethods","bindOnce","cancelTimeout","debounce","debounceLeading","defineImmutableProperty","groupBy","isImage","joinStr","mixOf","replaceTags","scopeDefer","sizeFormat","slugify","startswith","stripTags","timeout","toString","toggleText","trim","truncate","unslugify","item","i","l","slice","str","breakTag","object","dependencies","methods","keys","forIn","bindAll","scope","attr","continuation","delBind","$eval","$watch","Mixed","base","method","mixin","mixins","name","ref","char","capitalize","texts","nextTextPosition","text","coll","pred","len","result","wait","setTimeout","timeoutVar","clearTimeout","func","$apply","isNumber","isString","isPlainObject","isUndefined","leading","trailing","str1","str2","startsWith","maxLength","suffix","out","String","substring","lastIndexOf","input","precision","size","units","isNaN","parseFloat","isFinite","log","pow","toFixed","exception","pattern","RegExp","tags","obj","Object","defineProperty","fn_result","isFunction","isObject","removeKeys","chain","flatten","reduce","cartesianProduct","reduceRight","a","b","y","match","oldImmutable","newImmutable","pathObj","forEach","newValue","toJS","FiltersMixin","PageMixin","fillUsersAndRoles","users","roles","activeUsers","computableRoles","is_active","sortBy","activeUsersById","id","usersById","project","members","uniq","contains","loadUsersAndRoles","all","rs","projects","usersList","projectId","rolesList","results","selectFilter","load","existing","compact","isInCurrentRouteParams","noreload","replaceFilter","replaceAllFilters","filters","unselectFilter","newValues","parsedValues","isEmpty","AuthService","CancelAccountDirective","ChangeEmailDirective","ChangePasswordFromRecoveryDirective","ForgotPasswordDirective","InvitationDirective","LoginDirective","PublicRegisterMessageDirective","RegisterDirective","rootscope","storage","model","http","urls","translate","currentUserService","themeService","userModel","_currentTheme","_getUserTheme","setUserdata","$inject","userData","Immutable","fromJS","getAttrs","setUser","theme","_setTheme","newTheme","use","_setLocales","make_model","auth","set","clear","remove","setToken","token","getToken","removeToken","login","clone","auth_token","logout","removeUser","register","getInvitation","invitations","acceptInvitiationWithNewUser","acceptInvitiationWithExistingUser","forgotPassword","changePasswordFromRecovery","changeEmail","cancelAccount","service","$config","$routeParams","templates","template","templateFn","publicRegisterEnabled","console","restrict","directive","link","$scope","$el","$attrs","form","onError","onSuccess","submit","Form","find","decodeURIComponent","loginFormType","preventDefault","validate","username","password","on","prerenderReady","off","onErrorSubmit","onSuccessSubmit","onlyOneErrorElement","trackEvent","_error_message","error","setErrors","success","$params","tokenInParams","loginForm","onErrorSubmitLogin","onErrorSubmitRegister","onSuccessSubmitLogin","onSuccessSubmitRegister","registerForm","submitLogin","submitRegister","invitation","dataLogin","project_slug","project_name","dataRegister","escape","$repo","$model","email_token","queryOne","cancel_token","TaigaMainDirective","$window","onresize","$broadcast","home","not-found","permission-denied","discover","discover-search","forgot-password","change-password","change-email","cancel-account","create-project","profile","user-profile","project-backlog","project-taskboard","project-kanban","project-issues","project-search","project-userstories-detail","project-tasks-detail","project-issues-detail","project-wiki","project-wiki-page","project-team","project-admin-home","project-admin-project-profile-details","project-admin-project-profile-default-values","project-admin-project-profile-modules","project-admin-project-profile-export","project-admin-project-profile-reports","project-admin-project-values-status","project-admin-project-values-points","project-admin-project-values-priorities","project-admin-project-values-severities","project-admin-project-values-types","project-admin-project-values-custom-fields","project-admin-memberships","project-admin-roles","project-admin-third-parties-webhooks","project-admin-third-parties-github","project-admin-third-parties-gitlab","project-admin-third-parties-bitbucket","project-admin-contrib","user-settings-user-profile","user-settings-user-change-password","user-settings-user-avatar","user-settings-mail-notifications","$navurls","update","AnimationFrame","Capslock","CheckPermissionDirective","ClassPermissionDirective","DataPickerConfig","LimitLineLengthDirective","ProjectUrl","Qqueue","SelectedText","Template","ToggleCommentDirective","i18n","previousMonth","nextMonth","months","weekdays","weekdaysShort","isRTL","firstDay","parseInt","format","$document","getSelection","selection","createRange","render","permission","removeClass","unObserve","unwatch","addClass","tgCheckPermission","$observe","checkPermissions","tgClassPermissionWatchAction","unbindWatcher","className","negation","my_permissions","classes","add","animationFrame","performAnimation","tail","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","time","shift","slug","is_backlog_activated","is_kanban_activated","is_wiki_activated","is_issues_activated","maxColsPerLine","code","keyCode","index","lastPromise","qqueue","bindAdd","args","$templateCache","lodash","tmp","hideIcon","open","showIcon","warningIcon","$","fadeOut","currentTarget","append","fadeIn","toLowerCase","EventsProvider","EventsService","win","liveAnnouncementService1","rootScope","liveAnnouncementService","processMessage","subscriptions","connected","pendingMessages","missedHeartbeats","heartbeatInterval","WebSocket","info","loc","scheme","stopExistingConnection","protocol","ltrim","host","ws","addEventListener","onOpen","onMessage","onClose","removeEventListener","stopHeartBeatMessages","close","notifications","subscribe","show","desc","$digest","startHeartBeatMessages","heartbeatIntervalTime","maxMissedHeartbeats","setInterval","error1","Error","sendMessage","cmd","message","clearInterval","processHeartBeatPongMessage","serialize","msg","send","routingKey","subscription","routing_key","callback","unsubscribe","$get","$win","$conf","$rootScope","FeedbackDirective","$loading","feedbackService","openLightbox","submitButton","currentLoading","target","create","feedback","finish","focus","RelatedTaskAssignedToInlineEditionDirective","RelatedTaskCreateButtonDirective","RelatedTaskCreateFormDirective","RelatedTaskRowDirective","RelatedTasksDirective","$compile","$template","templateEdit","templateView","renderEdit","renderView","saveTask","task","subject","save","html","$modelValue","perms","modify_task","delete_task","select","askOnDelete","askResponse","$emit","ngModel","require","$tgmodel","newTask","assigned_to","createTask","default_task_status","newRelatedTaskFormOpen","us","$rs","loadTasks","tasks","list","usId","$ctrl","autoSave","notAutoSave","updateRelatedTask","member","imgurl","photo","full_name_display","tgRelatedTaskAssignedToInlineEdition","unbind","userId","updatedRelatedTask","ResourcesService","initResources","initUrls","auth-register","by_username","users-password-recovery","users-change-password-from-recovery","users-change-password","users-change-email","users-cancel-account","user-stats","user-liked","user-voted","user-watched","user-contacts","permissions","notify-policies","user-storage","memberships","bulk-create-memberships","resolver","project-templates","project-modules","bulk-update-projects-order","project-like","project-unlike","project-watch","project-unwatch","userstory-statuses","points","task-statuses","issue-statuses","issue-types","priorities","severities","milestones","userstories","bulk-create-us","bulk-update-us-backlog-order","bulk-update-us-sprint-order","bulk-update-us-kanban-order","userstories-filters","userstory-upvote","userstory-downvote","userstory-watch","userstory-unwatch","bulk-create-tasks","bulk-update-task-taskboard-order","task-upvote","task-downvote","task-watch","task-unwatch","issues","bulk-create-issues","issues-filters","issue-upvote","issue-downvote","issue-watch","issue-unwatch","wiki","wiki-restore","wiki-links","history/us","history/issue","history/task","history/wiki","attachments/us","attachments/issue","attachments/task","attachments/wiki_page","custom-attributes/userstory","custom-attributes/issue","custom-attributes/task","custom-attributes-values/userstory","custom-attributes-values/issue","custom-attributes-values/task","webhooks","webhooks-test","webhooklogs","webhooklogs-resend","userstories-csv","tasks-csv","issues-csv","timeline-profile","timeline-user","timeline-project","exporter","importer","locales","applications","application-tokens","stats-discover","$urls","providers","toArray","SearchBoxDirective","SearchController","SearchDirective","scope1","repo","loadSearchData","sectionName","loadInitialData","projectName","projectDescription","searchTerm","t","searchResults","term","loadFilters","defered","loadProject","getBySlug","issueStatusById","issue_statuses","taskStatusById","task_statuses","severityById","priorityById","usStatusById","us_statuses","loading","_loadSearchData","_promise","abort","$route","reload","$templatecache","$routeparams","linkTable","activeSectionName","applyAutoTab","getActiveSection","lastSearchResults","markSectionTabActive","renderFilterTabs","renderTableContent","tabsDom","maxVal","selectedSection","wikipages","oldElements","oldScope","children","$destroy","$new","parseHTML","activeSection","sectionData","searchText","AnalyticsService","doc","conf","initialized","accountId","pageEvent","trackRoutes","ignoreFirstPageLoad","injectAnalytics","ga","getUrl","trackPage","s","o","g","r","m","createElement","getElementsByTagName","async","src","parentNode","insertBefore","document","page","category","action","label","BindScope","jQuery","CompileHtmlDirective","attrs","tgCompileHtml","oldValue","contents","AssignedToDirective","BlockButtonDirective","CreatedByDisplayDirective","DateRangeDirective","DateSelectorDirective","DeleteButtonDirective","EditableDescriptionDirective","EditableSubjectDirective","EditableWysiwyg","ListItemAssignedtoDirective","ListItemIssueStatusDirective","ListItemPriorityDirective","ListItemSeverityDirective","ListItemTaskStatusDirective","ListItemTypeDirective","ListItemUsStatusDirective","SprintProgressBarDirective","TgMainTitleDirective","TgProgressBarDirective","WatchersDirective","renderRange","first","second","endDate","initDate","prettyDate","tgDateRange","valFirst","valSecond","datePickerConfigService","selectedDate","datePickerConfig","merge","field","onSelect","picker","setDate","Pikaday","renderProgress","percentage","visual_percentage","hasClass","css","tgSprintProgressbar","sprint","closedPoints","totalPoints","closed_points","total_points","round","owner","owner_extra_info","created_date","$qqueue","deleteWatcher","isEditable","renderWatchers","ref1","requiredPerm","watchers","$setViewValue","watcherId","revert","watcherIds","pull","$currentUserService","renderAssignedTo","assignedObject","fullName","isIocaine","isUnassigned","assigned_to_extra_info","is_iocaine","fullNameVisible","ask","instance","is_blocked","onDeleteGoToUrl","onDeleteTitle","subtitle","hide","click","$selectedText","noDescriptionMegEditMode","noDescriptionMegReadMode","is","href","scrollTop","offset","top","noDescriptionMsg","attachmentsService","attachmentsFullService","isInEditMode","uploadFile","file","addAttachment","getIn","textarea","dataTransfer","promises","stopPropagation","originalEvent","files","markItUp","replaceWith","tgListitemUsStatus","tgListitemTaskStatus","tgListitemAssignedto","issue","tgListitemIssueStatus","issueTypeById","domNode","color","tgListitemType","priority","tgListitemPriority","severity","tgListitemSeverity","el","tgProgressBar","i18nSectionName","ConfirmService","NOTIFICATION_MSG","light-error","lightboxService","lightboxSelector","ok","askChoice","choices","replacement","warning","choicesField","selected","stop","percent","body","selector","tsem","CustomAttributeValueDirective","CustomAttributesValuesController","CustomAttributesValuesDirective","DATE_TYPE","MULTILINE_TYPE","TEXT_TYPE","TYPE_CHOICES","confirm","objectId","customAttributes","customAttributesValues","loadCustomAttributesValues","getAttributeValue","attribute","attributeValue","attributes_values","updateAttributeValue","attributesValues","$templates","$storage","collapsedHash","$ctrls","collapsed","hash","requiredEditionPerm","setFocusAndSelectOnInputField","edit","editable","isValid","tgCustomAttributeValue","EstimationsService","LbUsEstimationDirective","UsEstimationDirective","$tgEstimationsService","estimationProcess","onSelectedPointForRole","roleId","pointId","mainTemplate","calculateTotalPoints","calculateRoles","EstimationProcess","pointsTemplate","$el1","us1","project1","bindClickEvents","pointsById","notNullValues","values","v","k","acc","num","role","pointObj","renderPointsSelector","siblings","popover","horizontalList","maxPointLength","pop","point","some","horizontal","closest","height","clientHeight","defaultFilter","momentFormat","momentFromNow","yesNoFilter","defaultValue","without_suffix","fromNow","HistoryController","HistoryDirective","IGNORED_FIELDS","userstories.userstory","tasks.task","issues.issue","loadHistory","history","changeModel","historyEntry","historyResult","j","len1","values_diff","description_diff","description_html","blocked_note_diff","blocked_note","blocked_note_html","comments","comment","deleteComment","activityId","undeleteComment","templateActivity","templateBase","templateBaseEntries","templateChangeAttachment","templateChangeDiff","templateChangeGeneric","templateChangeList","templateChangePoints","templateDeletedComment","countChanges","formatChange","getHumanizedFieldName","getPrettyDateFormat","renderActivity","renderAttachmentEntry","renderChange","renderChangeEntries","renderChangeEntry","renderChangesHelperText","renderComment","renderComments","renderCustomAttributesEntry","renderHistory","showAllActivity","showAllComments","humanizedFieldNames","content","is_closed","finish_date","milestone","user_story","client_requirement","team_requirement","attachments","is_deprecated","order","backlog_order","sprint_order","kanban_order","taskboard_order","us_order","change","isArray","changes","diff","filename","from","to","outerHTML","customAttrsChanges","added","removed","difference","ref2","delete_comment_date","delete_comment_user","deleteCommentDate","deleteCommentUser","comment_html","canRestoreComment","pk","avatar","userFullName","userProfileUrl","creationDate","created_at","changesText","mode","deleteCommentActionTitle","canDeleteComment","entries","totalEntries","showMore","totalComments","last","totalChanges","parents","toggleClass","ngmodel","ImportProjectButtonDirective","trigger","errorMsg","error_message","AssignedToLightboxDirective","AttachmentPreviewLightboxDirective","BlockLightboxDirective","BlockingMessageInputDirective","CreateBulkUserstoriesDirective","CreateEditUserstoryDirective","LightboxDirective","LightboxKeyboardNavigationService","LightboxService","WatchersLightboxDirective","docEl","lightboxContent","not","one","which","removeAttr","lightboxEl","dispatch","activeElement","prev","$tgrepo","block","unblock","finishCallback","watch","attachmentsToAdd","attachmentsToDelete","createAttachments","deleteAttachments","resetAttachments","createEditUs","isNew","List","attachment","deleteAttachment","statusList","usStatusList","is_archived","upload","broadcastEvent","keydown","statusId","bulk","bulkCreate","lightboxKeyboardNavigationService","closeLightbox","filterUsers","normalizeString","selectedItem","selectedUser","usersTemplate","string","normalizedString","toUpperCase","partial","assignedToId","searchingText","usersSearch","getFilteredUsers","_filterUsers","Loader","LoaderDirective","tgLoader","onStart","onEnd","autoClose","lastResponseDate","pageLoaded","requestCount","startLoadTime","minTime","force","endTime","timeoutValue","intervalAuto","auto","LoadingDirective","TgLoadingService","spinner","settings","removeClasses","classess","timeoutId","tgLoading","showLoading","RelatedTaskStatusDirective","UsStatusDirective","usStatusDom","usStatusDomParent","tgUsStatus","onUpdate","statuses","selectionTemplate","updateTaskStatus","taskStatusDom","taskStatusDomParent","tgRelatedTaskStatus","closePopover","isVisible","docViewBottom","docViewLeft","docViewRight","docViewTop","docViewWidth","elemBottom","elemLeft","elemRight","elemTop","elemWidth","display","visibility","left","ExceptionHandlerFactory","ravenConfig","Raven","install","cause","captureException","ColorizeTagsDirective","LbTagLineDirective","TagLineDirective","TagsDirective","formatter","parser","$formatters","$parsers","backlog","kanban","taskboard","srcTags","tgColorizeTagsType","sort","tag","tags_colors","tgColorizeTags","COMMA_KEY","ENTER_KEY","templateTags","addValue","deleteValue","hideSaveButton","renderTags","resetInput","saveInputTag","showSaveButton","tagsColors","style","autocomplete","fromCharCode","positioningFunction","position","elements","menu","source","my","using","ui","ESC_KEY","hideAddTagButton","hideAddTagButtonText","hideInput","renderInReadModeOnly","showAddTagButton","showAddTagButtonText","showInput","blur","MarkitupDirective","previewTemplate","addLine","cancelablePromise","closePreviewMode","markdownTitle","prepareUrlFormatting","preview","previewDomNode","renderMarkItUp","setCaretPosition","urlFormatting","class","markItUpDomNode","markdownDomNode","mdrender","markdown","caretPosition","scrollRelation","totalLines","createTextRange","move","selectionStart","setSelectionRange","scrollHeight","nline","cursorPosition","indices","regex","exec","donotparse","endIndex","startIndex","heading","n","placeHolder","markdownSettings","nameSpace","onShiftEnter","keepDefault","openWith","onEnter","afterInsert","cursorLine","emptyListItem","lastLine","markdownCaretPositon","newLineContent","markupSet","closeWith","separator","beforeInsert","markItUpRemove","textcomplete","cache","searchProps","searchTypes","prop","res","count","BacklogFiltersDirective","templateSelected","currentFiltersType","getFiltersType","initializeSelectedFilters","reloadUserstories","renderFilters","renderSelectedFilters","selectQFilter","selectedFilters","showCategories","showFilters","toggleFilterSelection","f","loadUserstories","generateFilters","currentFilters","CreateEditSprint","createSprint","getLastSprint","hasErrors","resetSprint","estimated_start","estimated_finish","newSprint","copy","setAttr","sprintsCounter","__all__","milestonesCounter","openSprints","sortedSprints","sprints","closed","estimatedFinish","estimatedStart","lastSprint","lastSprintNameDom","reset","editSprint","BacklogController","BacklogDirective","BurndownBacklogGraphDirective","TgBacklogProgressBarDirective","ToggleBurndownVisibility","UsPointsDirective","UsRolePointsSelectorDirective","params1","events","analytics","rs2","showTags","activeFilters","showGraphPlaceholder","initializeEventHandlers","getShowTags","loadProjectStats","loadSprints","loadClosedSprints","moveUs","unloadClosedSprints","initializeSubscription","routingKey1","routingKey2","toggleShowTags","storeShowTags","toggleActiveFilters","stats","defined_points","completedPercentage","total_milestones","closedSprints","totalClosedMilestones","user_stories","closedSprintsById","totalMilestones","totalOpenMilestones","reverse","sprintsById","currentSprint","findCurrentSprint","restoreFilters","selectedStatuses","selectedTags","oldSelectedTags","oldSelectedStatuses","filtersQ","filtersQOld","filterGrp","resetFilters","httpParams","getUrlFilters","storeQueryParams","listUnassigned","setSearchDataFilters","loadBacklog","closedMilestones","total_closed_milestones","prepareBulkUpdateData","uses","us_id","resortUserStories","items","isModified","usList","newUsIndex","newSprintId","len2","movedFromClosedSprint","movedToClosedSprint","oldSprintId","splice","Array","bulkUpdateBacklogOrder","bulkUpdateSprintOrder","len3","isFilterSelected","searchdata","urlfilters","results1","pick","filtersData","choicesFiltersFormat","tagsFilterFormat","byIdObject","markSelectedFilters","isSelected","omit","updateUserStoryStatus","editUserStory","$event","getByRef","deleteUserStory","without","addNewUs","default_us_status","addNewSprint","currentDate","end","doomLineTemplate","linkDoomLine","linkFilters","linkToolbar","showHideFilter","showHideTags","addDoomLineDom","getUsItems","reloadDoomLine","removeDoomlineDom","current_sum","domElement","assigned_points","before","rowElements","checkSelected","getUsToMove","lastChecked","moveToCurrentSprint","moveToLatestSprint","moveUssToSprint","shiftPressed","ussDom","itemScope","selectedUss","extraPoints","totalExtraPoints","ussCurrent","union","saveAll","moveToSprintDom","selectedUsDom","shiftKey","current","nextAll","prevAll","nextUntil","prevUntil","elm","ussToMove","hideText","showText","sidebar","filtersSearch","disableSelection","numberOfRoles","roleName","rolScope","$tgTemplate","rolesTemplate","bindClickElements","filteringRoleId","renderRolesSelector","selectedRoleId","updatingSelectedRoleId","tgBacklogUsPoints","popRolesDom","firstLoad","toggleGraph","isBurndownGraphCollapsed","redrawChart","dataToDraw","client_increment_line","colors","evolution_line","milestonesRange","optimal_line","options","team_increment_line","zero_line","ml","zip","fillColor","optimal","evolution","grid","borderWidth","right","bottom","borderColor","hoverable","xaxis","ticks","axisLabel","axisLabelUseCanvas","axisLabelFontSizePixels","axisLabelFontFamily","axisLabelPadding","tickFormatter","axis","yaxis","series","shadowSize","fill","radius","lineWidth","tooltip","tooltipOpts","xval","yval","flotItem","seriesIndex","sprintName","abs","empty","plot","adjustPercentaje","projectPointsPercentaje","closedPointsPercentaje","adjusted","tgBacklogProgressBar","definedPoints","BacklogEmptySortableDirective","BacklogSortableDirective","SprintSortableDirective","deleteElement","$tgConfirm","getUsIndex","filterError","sortable","cancel","connectWith","dropOnEmpty","placeholder","scroll","disableHorizontalScroll","tolerance","itemIndex","itemUs","forcePlaceholderSize","BacklogSprintDirective","BacklogSprintHeaderDirective","ToggleExcludeClosedSprintsVisualization","slideOptions","sprintTableMinHeight","toggleSprint","duration","easing","sprintArrow","sprintTable","tgBacklogSprint","slideToggle","compiledTemplate","estimatedDateRange","taskboardUrl","templateScope","assign","excludeClosedSprints","loadingElm","after","SprintGraphDirective","days","day","unshift","d","optimal_points","open_points","tickSize","daysNames","formattedDate","roundedValue","CreateBulkTasksDirective","CreateEditTaskDirective","sprintId","TaskboardController","TaskboardDirective","TaskboardSquishColumnDirective","TaskboardTaskDirective","TaskboardUserDirective","rs1","_setMeta","startDate","completedPoints","completedPointsSum","totalPointsSum","openTasks","totalTasks","total_tasks","loadTaskboard","taskMove","refreshTagsColors","loadSprintStats","loadSprint","pointsList","roleById","taskStatusList","remainingPointsSum","remainingTasks","completed_points","completed_tasks","usTasks","isPlaceholder","sslug","refreshTasksOrder","resortTasks","bulkUpdateTaskTaskboardOrder","task_id","addNewTask","editTaskAssignedTo","tableBodyDom","tableHeaderDom","scrollLeft","$rs2","editingTask","avatarWidth","maxColumnWidth","getCeilWidth","recalculateStatusColumnWidth","recalculateTaskboardWidth","refreshTaskboardTableWidth","setStatusColumnWidth","statusesFolded","getStatusColumnModes","usFolded","getUsRowModes","foldStatus","storeStatusColumnModes","foldUs","storeUsRowModes","tasksMatrixSize","sqrt","column","columnWidths","columns","totalWidth","outerWidth","total","statusFoldedWidth","clickable","username_label","TaskboardSortableDirective","itemEl","newParentScope","oldParentScope","tdom","handle","itemTask","newStatusId","newUsId","oldStatusId","oldUsId","parentEl","st","KanbanArchivedStatusHeaderDirective","KanbanArchivedStatusIntroDirective","KanbanController","KanbanDirective","KanbanSquishColumnDirective","KanbanUserDirective","KanbanUserstoryDirective","KanbanWipLimitDirective","defaultViewMode","viewModes","statusViewModes","onAssignedToChanged","loadUserStoriesForStatus","hideUserStoriesForStatus","changeUsAssignedTo","userid","status__is_archived","listAll","usByStatus","us_archived","loadKanban","generateStatusViewModes","storedStatusViewModes","getStatusViewModes","storeStatusViewModes","updateStatusViewMode","newViewMode","isMaximized","isMinimized","itemsToSave","bulkUpdateKanbanOrder","hideArchivedText","showArchivedText","hidden","tgKanbanArchivedStatusHeader","userStories","hiddenUserStoriexText","updateIntroText","tgKanbanArchivedStatusIntro","isArchived","userStoriesLoaded","editingUserStory","getTemplateUrl","updateTableWidth","folds","redrawWipLimit","tgKanbanWipLimit","wip_limit","wtid","tgKanbanUserAvatar","KanbanSortableDirective","IssueDetailController","IssuePriorityButtonDirective","IssueSeverityButtonDirective","IssueStatusButtonDirective","IssueStatusDisplayDirective","IssueTypeButtonDirective","PromoteIssueToUsButtonDirective","issueRef","issueref","initializeOnDeleteGoToUrl","ref3","issueSubject","issueStatus","statusById","issueType","typeById","issueSeverity","issuePriority","issueDescription","loadIssue","issue_types","typeList","severityList","priorityList","issueId","commentModel","neighbors","previous","previousUrl","onUpvote","upvote","onDownvote","downvote","onWatch","onUnwatch","typees","severityes","priorityes","generated_from_issue","CreateBulkIssuesDirective","CreateIssueDirective","default_issue_status","default_issue_type","default_priority","default_severity","IssueAssignedToInlineEditionDirective","IssueStatusInlineEditionDirective","IssuesController","IssuesDirective","IssuesFiltersDirective","loadIssues","getFilters","storeFilters","issueStatusList","issueTypes","getUrlFilter","loadMyFilters","getMyFilters","removeNotExistingFiltersFromUrl","currentSearch","existingValues","filterName","filterValue","splittedValues","intersection","myFilters","types","assignedTo","createdBy","usersFiltersFormat","unknownOption","reformatedUsers","unknownItem","full_name","u","owners","loadIssuesRequests","urlFilters","models","paginatedBy","saveCurrentFiltersTo","newFilter","storeMyFilters","deleteMyFilter","addNewIssue","addIssuesInBulk","linkOrdering","linkPagination","$pagEl","afterCurrent","atBegin","atEnd","beforeCurrent","getNumPages","renderPagination","numPages","cpage","pages","showPrevious","showNext","pagenum","colHeadElement","currentOrder","icon","finalOrder","newOrder","reloadIssues","unwatchIssues","filterId","customFilterName","loadPromise","currentfilterstype","updateIssueStatus","issueStatusDom","issueStatusDomParent","tgIssueStatusInlineEdition","updateIssue","tgIssueAssignedToInlineEdition","updatedIssue","UsClientRequirementButtonDirective","UsStatusButtonDirective","UsStatusDisplayDirective","UsTeamRequirementButtonDirective","UserStoryDetailController","usRef","usref","closedTasks","progressPercentage","userStoryRef","userStorySubject","userStoryStatus","userStoryPoints","userStoryDescription","userStoryClosedTasks","userStoryTotalTasks","userStoryProgressPercentage","loadUs","kanbanStaus","noMilestone","order_by","canEdit","isRequired","TaskDetailController","TaskIsIocaineButtonDirective","TaskStatusButtonDirective","TaskStatusDisplayDirective","taskRef","taskref","taskSubject","taskStatus","taskDescription","loadTask","taskId","loadUserStory","LeaveProjectDirective","TeamController","TeamFiltersDirective","TeamMemberCurrentUserDirective","TeamMemberStatsDirective","TeamMembersDirective","membersFilter","setRole","filtersRole","loadMembers","totals","currentUser","issuesEnabled","tasksEnabled","wikiEnabled","loadMemberStats","memberStats","vals","statsKey","sum","_processStats","_processStat","stat","singleStat","leave","confirm_leave_project_text","leave_project_text","projectid","EditableWikiContentDirective","WikiDetailController","WikiSummaryDirective","projectSlug","wikiSlug","wikiTitle","linksVisible","wikiPageName","wikiPageContent","totalEditions","editions","lastModifiedDate","modified_date","loadWiki","wikiId","loadWikiLinks","listLinks","wikiLinks","selectedWikiLink","checkLinksPerms","last_modifier","imgUrl","wikiPage","cancelEdition","disableEdition","getSelectedText","switchToEditMode","switchToReadMode","button","WikiNavDirective","addWikiLinkPermission","deleteWikiLinkPermission","linkId","linkSlug","newLink","CreateMembersDirective","MAX_MEMBERSHIP_FIELDSETS","extraTextTemplate","createFieldSet","resetForm","roleList","fieldSet","prepend","lastActionButton","newFieldSet","invitation_extra_text","memberWrappers","destroy","mw","memberWrapper","role_id","bulkCreateMemberships","MembershipsController","MembershipsDirective","MembershipsRowActionsDirective","MembershipsRowAdminCheckboxDirective","MembershipsRowAvatarDirective","MembershipsRowRoleSelectorDirective","i_am_owner","httpFilters","membership","is_user_active","addNewMembers","pending","user_email","tgMembershipsRowAvatar","inputId","tgMembershipsRowAdminCheckbox","is_owner","selectedRole","tgMembershipsRowRoleSelector","newRole","activedTemplate","pendingTemplate","tgMembershipsRowActions","resendInvitation","defaultMsg","AdminNavigationDirective","tgAdminNavigation","CsvExporterController","CsvExporterIssuesController","CsvExporterTasksController","CsvExporterUserstoriesController","CsvIssueDirective","CsvTaskDirective","CsvUsDirective","ProjectDefaultValuesDirective","ProjectExportDirective","ProjectLogoDirective","ProjectLogoModelDirective","ProjectModulesDirective","ProjectProfileController","ProjectProfileDirective","prioritiesList","severitiesList","issueTypesList","openDeleteLightbox","newUrl","fetchProject","loadProjects","isVideoconferenceActivated","videoconferences","videoconferences_extra_data","asyn_message","buttonsEl","dump_ready_text","hideButtons","hideResult","hideSpinner","loading_msg","loading_title","resultEl","resultMessageEl","resultTitleEl","setAsyncMessage","setAsyncTitle","setLoadingMessage","setLoadingTitle","setSyncMessage","setSyncTitle","showButtons","showErrorMode","showExportResultAsyncMode","showExportResultSyncMode","showLoadingMode","showResult","showSpinner","spinnerEl","syn_message","dumpUrl","_generateUuid","setCsvUuid","csvUrl","resolveAbsolute","csvUuid","uuid","regenerateUuid","sectionTitle","showSizeInfo","logoAttachment","changeLogo","removeLogo","$parse","modelSetter","tgProjectLogoModel","ColorSelectionDirective","ProjectCustomAttributesController","ProjectCustomAttributesDirective","ProjectValuesController","ProjectValuesDirective","ProjectValuesSectionController","moveValue","loadValues","resource","listValues","maxValueOrder","itemValue","linkDragAndDrop","linkValue","goToBottomList","initializeNewValue","initializeTextTranslations","objName","saveNewValue","saveValue","valueType","objname","addNewElementText","table","formEl","row","editionRow","option","onSucces","moveTo","moveCustomAttributes","deleteCustomAttribute","saveCustomAttribute","createCustomAttribute","loadCustomAttributes","maxOrder","attrValues","attrModel","newIndex","idx","cancelCreate","cancelUpdate","hideAddButton","hideCancelButton","hideCreateForm","hideEditForm","resetNewAttr","revertChangesInCustomAttribute","showAddButton","showCancelButton","showCreateForm","showEditForm","sortableEl","itemAttr","newAttr","EditRoleDirective","NewRoleDirective","RolePermissionsDirective","RolesController","RolesDirective","_disableComputable","_enableComputable","anyComputableRole","computable","loadRoles","public_permission","external_user","public_permissions","askOnError","askOnSuccess","toggleComputable","toggleView","toggle","DEFAULT_PERMISSIONS","insertPosition","baseTemplate","categoryTemplate","resumeTemplate","generateCategoriesFromRole","renderCategory","renderPermissions","renderResume","categories","isPermissionEditable","issuePermissions","milestonePermissions","setActivePermissions","setActivePermissionsPerCategory","taskPermissions","userStoryPermissions","wikiPermissions","active","is_private","cat","activePermissions","getActivePermissions","categoryId","anon_permissions","BitbucketController","BitbucketWebhooksDirective","GithubController","GithubWebhooksDirective","GitlabController","GitlabWebhooksDirective","NewWebhookDirective","SelectInputText","ValidOriginIpsDirective","WebhookDirective","WebhooksController","loadWebhooks","openHistory","showEditMode","showVisualizationMode","updateLogs","updateShowHideHistoryText","webhook","tgWebhook","validStatus","prettySentHeaders","pairs","request_headers","arg","header","prettySentData","request_data","created","logs_counter","logs","historyElement","textElement","test","resend","addWebhookDOMNode","formDOMNode","loadModules","github","gitlab","bitbucket","saveAttribute","$ngModel","CreateProject","DeleteProjectDirective","$projectUrl","$cacheFactory","removeAll","error_field","error_step","selectors","creation_template","head","step","fields","projectToDelete","BindHtmlDirective","BindOnceAltDirective","BindOnceBindDirective","BindOnceHrefDirective","BindOnceHtmlDirective","BindOnceRefDirective","BindOnceSrcDirective","BindOnceTitleDirective","BindTitleDirective","tgBoBind","tgBoHtml","tgBoRef","tgBoSrc","tgBoHref","tgBoAlt","tgBoTitle","tgTitleHtml","tgBindHtml","ConfigurationService","has","ContribController","currentPlugin","FiltersStorageService","HttpService","cacheFactory","locationFactory","lastRoute","Model","ModelService","dataTypes","_attrs","_name","_dataTypes","setAttrs","_modifiedAttrs","_isModified","applyCasts","attrName","castMethod","castName","casts","getIdAttrName","getName","getter","self","setter","substr","enumerable","configurable","isAttributeModified","markSaved","desSerialize","sdata","ddata","$http","$gmUrls","$gmStorage","cls","int","float","NavigationUrlsDirective","NavigationUrlsService","formatUrl","replacer","bindOnceP","parseNav","param","tgNavGetParams","tgNav","fullUrl","getURLParams","getURLParamsStr","metaKey","ctrlKey","RepositoryService","model1","resolveUrlForModel","idAttrName","resolveUrlForAttributeModel","extraParams","_data","_status","refresh","queryMany","httpOptions","enablePagination","queryOneAttribute","queryOneRaw","queryPaginated","queryOnePaginatedRaw","wikipage","StorageService","_default","serializedValue","getItem","setItem","removeItem","UrlsService","fmt","mainUrl","rtrim","resourceProvider","_get","userstory","_list","filtersHashSuffix","hashSuffix","myFiltersHashSuffix","getQueryParams","listInAllProjects","project_id","bulk_issues","ns","innerPromise","hashSuffixStatusColumnModes","hashSuffixStatusViewModes","listByUser","bulk_memberships","notifyPolicies","listByMember","memberId","bulkUpdateOrder","bulkData","regenerate_userstories_csv_uuid","regenerate_issues_csv_uuid","regenerate_tasks_csv_uuid","statusUpdater","complete","failed","maxFileSize","uploadComplete","uploadFailed","uploadProgress","fileName","fileSize","evt","loaded","uploadedSize","totalSize","responseText","FormData","XMLHttpRequest","setRequestHeader","transformRequest","identity","deferredAbort","get_all","noop","hashSuffixUsRowModes","userStoryId","sprint_id","bulk_tasks","changeAvatar","removeAvatar","changePassword","currentPassword","newPassword","current_password","userSettings","contacts","status_id","bulk_stories","webhookId","webhooklogId","UserChangePasswordController","UserChangePasswordDirective","ctrl","newPassword1","newPassword2","DeleteUserDirective","TaigaAvatarModelDirective","UserAvatarDirective","UserProfileDirective","UserSettingsController","getLan","getTheme","maxFileSizeMsg","availableThemes","avatarAttachment","tgAvatarModel","UserSettingsNavigationDirective","tgUserSettingsNavigation","UserNotificationsController","UserNotificationsDirective","UserNotificationsListDirective","policy","policyIndex","prev_level","notify_level","AttachmentLinkDirective","lightboxFactory","tgAttachmentLink","AttachmentGalleryDirective","bindToController","onDelete","AttachmentController","editMode","mergeIn","AttachmentDirective","AttachmentsDropDirective","eventAttr","tgAttachmentsDrop","AttachmentsFullController","deprecatedsCount","attachmentsVisible","deprecatedsVisible","uploadingAttachments","objId","setMode","toggleDeprecatedsVisible","addAttachments","loadAttachments","toDeleteAttachment","errorMessage","reorderAttachment","updateAttachment","toUpdateAttachment","AttachmentsFullDirective","AttachmentsFullService","_attachments","_deprecatedsCount","_attachmentsVisible","_deprecatedsVisible","regenerate","it","uploading","Map","oldIndex","findIndex","setIn","oldAttachment","AttachmentsSimpleController","onAdd","AttachmentsSimpleDirective","AttachmentSortableDirective","tgAttachmentsSortable","containment","helper","AutoSelectDirective","$timeout","FileChangeDirective","tgFileChange","JoyRideDirective","joyRideService","initJoyrRide","intro","unsuscribe","introJs","oncomplete","onexit","disableJoyRide","setOptions","exitOnEsc","exitOnOverlayClick","showStepNumbers","nextLabel","prevLabel","skipLabel","doneLabel","disableInteraction","setOption","loadJoyRideConfig","exit","JoyRideService","checkPermissionsService","getConfig","dashboard","steps","check","joyRide","joyRides","LiveAnnouncementDirective","defineProperties","LiveAnnouncementService","COLORS","IMAGES","LOGOS","ProjectLogoSrcDirective","modulo","_getDefaultProjectLogo","logo","murmurhash3_32_gc","projectLogo","ProjectMenuController","_getActiveSection","_setVideoConference","_setMenuPermissions","videoconferenceUrl","_videoConferenceUrl","indexBacklog","indexKanban","oldSectionName","sectionsBreadcrumb","baseUrl","ProjectMenuDirective","projectChange","vm","fixed","TermsOfServiceAndPrivacyPolicyNoticeDirective","privacyPolicyUrl","termsOfServiceUrl","VoteButtonController","isMouseOver","showTextWhenMouseIsOver","showTextWhenMouseIsLeave","toggleVote","is_voter","_downvote","_upvote","VoteButtonDirective","WatchButtonController","openWatchers","getPerms","toggleWatch","is_watcher","_unwatch","_watch","WatchButtonDirective","attributes","environment","DiscoverHomeOrderByController","is_open","week","month","year","currentText","currentOrderBy","orderBy","onChange","DiscoverHomeOrderByDirective","DiscoverSearchBarController","discoverProjectsService","projectsCount","fetchStats","submitFilter","DiscoverSearchBarDirective","DiscoverSearchListHeaderController","like_is_open","activity_is_open","openLike","setOrderBy","openActivity","DiscoverSearchListHeaderDirective","FeaturedProjectsController","featured","fetchFeatured","FeaturedProjectsDirective","HighlightedDirective","highlighted","MostActiveController","mostActive","getOrderBy","fetch","fetchMostActive","MostActiveDirective","MostLikedController","mostLiked","fetchMostLiked","MostLikedDirective","DiscoverHomeController","onSubmit","DiscoverSearchController","routeParams","searchResult","nextSearchPage","loadingGlobal","loadingList","loadingPagination","resetSearchList","fetchByGlobalSearch","fetchByOrderBy","getFilter","fetchSearch","is_looking_for_people","onChangeFilter","updateParams","onChangeOrder","DiscoverSearchDirective","DiscoverProjectsService","projectsService","_mostLiked","_mostActive","_featured","_searchResult","_projectsCount","decorate","_decorate","_nextSearchPage","getProjects","is_featured","ExternalAppController","externalAppsService","xhrError","loginUrl","createApplicationToken","_getApplicationToken","_redirect","_applicationId","application","_state","state","_user","_application","loginWithAnotherUserUrl","applicationToken","getApplicationToken","back","authorizeApplicationToken","ExternalAppsService","applicationId","externalapps","FeedbackService","sendFeedback","DutyDirective","navurls","duty","getDutyType","HomeController","HomeService","_attachProjectInfoToWorkInProgress","workInProgress","projectsById","_attachProjectInfoToDuty","_duties","watching","objType","getWorkInProgress","assignedIssuesPromise","assignedTasksPromise","assignedUserStoriesPromise","params_us","projectsPromise","watchingIssuesPromise","watchingTasksPromise","watchingUserStoriesPromise","getProjectsByUserId","p","status__is_closed","HomeProjectListDirective","newProject","WorkingOnController","homeService","_setAssignedTo","elem","_setWatching","WorkingOnDirective","DropdownProjectListDirective","DropdownUserDirective","authService","configService","locationService","navUrlsService","isFeedbackEnabled","NavigationBarDirective","isEnabledHeader","NavigationBarService","enabledHeader","ProfileBarController","userService","loadStats","getStats","ProfileBarDirective","isCurrentUser","ProfileContactsController","loadContacts","getContacts","ProfileContactsDirective","FavItemDirective","itemType","FavsBaseController","ProfileLikedController","ProfileVotedController","ProfileWatchedController","_init","enableFilterByAll","enableFilterByProjects","enableFilterByUserStories","enableFilterByTasks","enableFilterByIssues","enableFilterByTextQuery","_resetList","scrollDisabled","_page","_enableLoadingSpinner","isLoading","_disableLoadingSpinner","_enableScroll","_disableScroll","_checkIfHasMorePages","hasNext","_checkIfHasNoResults","hasNoResults","loadItems","_getItems","filterByTextQuery","showAll","showProjectsOnly","showUserStoriesOnly","showTasksOnly","showIssuesOnly","getLiked","getVoted","getWatched","ProfileLikedDirective","ProfileVotedDirective","ProfileWatchedDirective","ProfileHints","hintKey","HINTS","hint","linkText","ProfileProjectsController","attachUserContactsToProjects","ProfileProjectsDirective","ProfileTabDirective","transclude","tab","tabIcon","tabActive","tabDisabled","addTab","ProfileTabsController","tabs","toggleTab","ProfileTabsDirective","ProfileController","getUserByUserName","notFound","userUsername","LikeProjectButtonController","likeButtonService","toggleLike","_unlike","_like","like","unlike","LikeProjectButtonDirective","LikeProjectButtonService","_getProjectIndex","_updateProjects","isFan","projectIndex","totalFans","is_fan","total_fans","setProjects","_updateCurrentProject","setProject","likeProject","unlikeProject","SortProjectsDirective","opacity","sortData","sorted_project_ids","bulkUpdateProjectsOrder","WatchProjectButtonController","watchButtonService","showWatchOptions","toggleWatcherOptions","closeWatcherOptions","notifyLevel","WatchProjectButtonDirective","WatchProjectButtonService","isWatcher","totalWatchers","total_watchers","watchProject","unwatchProject","ProjectsListingController","ProjectController","activeMembers","setfn","metas","ProjectsService","projectUrl","getProjectBySlug","getProjectStats","paginate","colorized_tags","Resource","urlsService","urlname","object_id","x-disable-pagination","progressMessage","progressPercent","pagination","paginateResponseService","x-lazy-pagination","getTimeline","only_relevant","Resources","services","serviceFn","serviceName","serviceProperty","warm","getUserStorage","setUserStorage","createUserStorage","getUserByUsername","getProfileTimeline","getUserTimeline","AppMetaService","_set","meta","setTitle","setDescription","setTwitterMetas","origin","setOpenGraphMetas","listener","_listener","$watchCollection","AttachmentsService","getMaxFileSize","maxFileSizeFormated","sizeError","saveError","ChekcPermissionsService","CurrentUserService","storageService","_projects","_projectsById","_joyride","_loadUserInfo","LightboxFactory","compile","scopeAttrs","PaginateResponse","paginateResponse","ProjectService","_project","_section","_sectionsBreadcrumb","_activeMembers","hasPermission","ScopeEvent","scopes","_searchDuplicatedScopes","$id","_create","duplicatedScopeName","_tgEmitter","EventEmitter2","removeAllListeners","emitter","ThemeService","themeName","stylesheetEl","UserService","pageNumber","objectType","textQuery","contactsFiltered","contact","contactId","permissionDenied","UserTimelineAttachmentDirective","validFileExtensions","extension","is_image","templateHtml","UserTimelineItemTitle","sce","_fieldTranslationKey","_params","timeline","title_attr","_getLink","_getUsernameSpan","field_name","new_value","sprint_name","us_name","event_us","_getTimelineObj","_getDetailObjUrl","obj_name","role_name","keySeq","_translateTitleParams","parent_userstory","_getParams","timeline_type","translate_params","getTitle","paramsKeys","translation","UserTimelineType","timelineType","hasIn","getType","UserTimelineItemDirective","UserTimelinePaginationSequence","generate","getContent","minItems","UserTimelineController","userTimelineService","timelineList","getProjectTimeline","loadTimeline","UserTimelineDirective","UserTimelineService","userTimelinePaginationSequenceService","userTimelineItemType","userTimelineItemTitle","_valid_fields","_invalid","fieldKey","value_diff","_isInValidTimeline","invalid","_parseEventType","event_type","_getTimelineObject","_attachExtraInfoToTimelineEntry","_parseTimeline","newdata","newItem","blocked","moveInBacklog","deleteIn","_addEntyAttributes","filterNot"],"mappings":"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","file":"app.js","sourceRoot":"/source/","sourcesContent":["\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: app.coffee\n */\n\n(function() {\n var configure, i18nInit, init, module, modules, pluginsWithModule, taiga;\n\n this.taiga = taiga = {};\n\n this.taigaContribPlugins = this.taigaContribPlugins || window.taigaContribPlugins || [];\n\n taiga.generateHash = function(components) {\n if (components == null) {\n components = [];\n }\n components = _.map(components, function(x) {\n return JSON.stringify(x);\n });\n return hex_sha1(components.join(\":\"));\n };\n\n taiga.generateUniqueSessionIdentifier = function() {\n var date, randomNumber;\n date = (new Date()).getTime();\n randomNumber = Math.floor(Math.random() * 0x9000000);\n return taiga.generateHash([date, randomNumber]);\n };\n\n taiga.sessionId = taiga.generateUniqueSessionIdentifier();\n\n configure = function($routeProvider, $locationProvider, $httpProvider, $provide, $tgEventsProvider, $compileProvider, $translateProvider, $translatePartialLoaderProvider, $animateProvider) {\n var authHttpIntercept, decorators, defaultHeaders, loaderIntercept, originalWhen, preferedLangCode, userInfo, versionCheckHttpIntercept;\n $animateProvider.classNameFilter(/^(?:(?!ng-animate-disabled).)*$/);\n originalWhen = $routeProvider.when;\n $routeProvider.when = function(path, route) {\n route.resolve || (route.resolve = {});\n angular.extend(route.resolve, {\n languageLoad: [\n \"$q\", \"$translate\", function($q, $translate) {\n var deferred;\n deferred = $q.defer();\n $translate().then(function() {\n return deferred.resolve();\n });\n return deferred.promise;\n }\n ]\n });\n return originalWhen.call($routeProvider, path, route);\n };\n $routeProvider.when(\"/\", {\n templateUrl: \"home/home.html\",\n controller: \"Home\",\n controllerAs: \"vm\",\n loader: true,\n title: \"HOME.PAGE_TITLE\",\n loader: true,\n description: \"HOME.PAGE_DESCRIPTION\",\n joyride: \"dashboard\"\n });\n $routeProvider.when(\"/discover\", {\n templateUrl: \"discover/discover-home/discover-home.html\",\n controller: \"DiscoverHome\",\n controllerAs: \"vm\",\n title: \"PROJECT.NAVIGATION.DISCOVER\",\n loader: true\n });\n $routeProvider.when(\"/discover/search\", {\n templateUrl: \"discover/discover-search/discover-search.html\",\n title: \"PROJECT.NAVIGATION.DISCOVER\",\n loader: true,\n controller: \"DiscoverSearch\",\n controllerAs: \"vm\",\n reloadOnSearch: false\n });\n $routeProvider.when(\"/projects/\", {\n templateUrl: \"projects/listing/projects-listing.html\",\n access: {\n requiresLogin: true\n },\n title: \"PROJECTS.PAGE_TITLE\",\n description: \"PROJECTS.PAGE_DESCRIPTION\",\n loader: true,\n controller: \"ProjectsListing\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/project/:pslug/\", {\n templateUrl: \"projects/project/project.html\",\n loader: true,\n controller: \"Project\",\n controllerAs: \"vm\",\n section: \"project-timeline\"\n });\n $routeProvider.when(\"/project/:pslug/search\", {\n templateUrl: \"search/search.html\",\n reloadOnSearch: false,\n section: \"search\",\n loader: true\n });\n $routeProvider.when(\"/project/:pslug/backlog\", {\n templateUrl: \"backlog/backlog.html\",\n loader: true,\n section: \"backlog\",\n joyride: \"backlog\"\n });\n $routeProvider.when(\"/project/:pslug/kanban\", {\n templateUrl: \"kanban/kanban.html\",\n loader: true,\n section: \"kanban\",\n joyride: \"kanban\"\n });\n $routeProvider.when(\"/project/:pslug/taskboard/:sslug\", {\n templateUrl: \"taskboard/taskboard.html\",\n loader: true,\n section: \"backlog\"\n });\n $routeProvider.when(\"/project/:pslug/us/:usref\", {\n templateUrl: \"us/us-detail.html\",\n loader: true,\n section: \"backlog-kanban\"\n });\n $routeProvider.when(\"/project/:pslug/task/:taskref\", {\n templateUrl: \"task/task-detail.html\",\n loader: true,\n section: \"backlog-kanban\"\n });\n $routeProvider.when(\"/project/:pslug/wiki\", {\n redirectTo: function(params) {\n return \"/project/\" + params.pslug + \"/wiki/home\";\n }\n });\n $routeProvider.when(\"/project/:pslug/wiki/:slug\", {\n templateUrl: \"wiki/wiki.html\",\n loader: true,\n section: \"wiki\"\n });\n $routeProvider.when(\"/project/:pslug/team\", {\n templateUrl: \"team/team.html\",\n loader: true,\n section: \"team\"\n });\n $routeProvider.when(\"/project/:pslug/issues\", {\n templateUrl: \"issue/issues.html\",\n loader: true,\n section: \"issues\"\n });\n $routeProvider.when(\"/project/:pslug/issue/:issueref\", {\n templateUrl: \"issue/issues-detail.html\",\n loader: true,\n section: \"issues\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/details\", {\n templateUrl: \"admin/admin-project-profile.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/default-values\", {\n templateUrl: \"admin/admin-project-default-values.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/modules\", {\n templateUrl: \"admin/admin-project-modules.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/export\", {\n templateUrl: \"admin/admin-project-export.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/reports\", {\n templateUrl: \"admin/admin-project-reports.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/status\", {\n templateUrl: \"admin/admin-project-values-status.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/points\", {\n templateUrl: \"admin/admin-project-values-points.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/priorities\", {\n templateUrl: \"admin/admin-project-values-priorities.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/severities\", {\n templateUrl: \"admin/admin-project-values-severities.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/types\", {\n templateUrl: \"admin/admin-project-values-types.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/custom-fields\", {\n templateUrl: \"admin/admin-project-values-custom-fields.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/memberships\", {\n templateUrl: \"admin/admin-memberships.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/roles\", {\n templateUrl: \"admin/admin-roles.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/third-parties/webhooks\", {\n templateUrl: \"admin/admin-third-parties-webhooks.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/third-parties/github\", {\n templateUrl: \"admin/admin-third-parties-github.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/third-parties/gitlab\", {\n templateUrl: \"admin/admin-third-parties-gitlab.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/third-parties/bitbucket\", {\n templateUrl: \"admin/admin-third-parties-bitbucket.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/contrib/:plugin\", {\n templateUrl: \"contrib/main.html\"\n });\n $routeProvider.when(\"/user-settings/user-profile\", {\n templateUrl: \"user/user-profile.html\"\n });\n $routeProvider.when(\"/user-settings/user-change-password\", {\n templateUrl: \"user/user-change-password.html\"\n });\n $routeProvider.when(\"/user-settings/mail-notifications\", {\n templateUrl: \"user/mail-notifications.html\"\n });\n $routeProvider.when(\"/change-email/:email_token\", {\n templateUrl: \"user/change-email.html\"\n });\n $routeProvider.when(\"/cancel-account/:cancel_token\", {\n templateUrl: \"user/cancel-account.html\"\n });\n $routeProvider.when(\"/profile\", {\n templateUrl: \"profile/profile.html\",\n loader: true,\n access: {\n requiresLogin: true\n },\n controller: \"Profile\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/profile/:slug\", {\n templateUrl: \"profile/profile.html\",\n loader: true,\n controller: \"Profile\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/login\", {\n templateUrl: \"auth/login.html\",\n title: \"LOGIN.PAGE_TITLE\",\n description: \"LOGIN.PAGE_DESCRIPTION\",\n disableHeader: true\n });\n $routeProvider.when(\"/register\", {\n templateUrl: \"auth/register.html\",\n title: \"REGISTER.PAGE_TITLE\",\n description: \"REGISTER.PAGE_DESCRIPTION\",\n disableHeader: true\n });\n $routeProvider.when(\"/forgot-password\", {\n templateUrl: \"auth/forgot-password.html\",\n title: \"FORGOT_PASSWORD.PAGE_TITLE\",\n description: \"FORGOT_PASSWORD.PAGE_DESCRIPTION\",\n disableHeader: true\n });\n $routeProvider.when(\"/change-password/:token\", {\n templateUrl: \"auth/change-password-from-recovery.html\",\n title: \"CHANGE_PASSWORD.PAGE_TITLE\",\n description: \"CHANGE_PASSWORD.PAGE_TITLE\",\n disableHeader: true\n });\n $routeProvider.when(\"/invitation/:token\", {\n templateUrl: \"auth/invitation.html\",\n title: \"INVITATION.PAGE_TITLE\",\n description: \"INVITATION.PAGE_DESCRIPTION\",\n disableHeader: true\n });\n $routeProvider.when(\"/external-apps\", {\n templateUrl: \"external-apps/external-app.html\",\n title: \"EXTERNAL_APP.PAGE_TITLE\",\n description: \"EXTERNAL_APP.PAGE_DESCRIPTION\",\n controller: \"ExternalApp\",\n controllerAs: \"vm\",\n disableHeader: true,\n mobileViewport: true\n });\n $routeProvider.when(\"/error\", {\n templateUrl: \"error/error.html\"\n });\n $routeProvider.when(\"/not-found\", {\n templateUrl: \"error/not-found.html\"\n });\n $routeProvider.when(\"/permission-denied\", {\n templateUrl: \"error/permission-denied.html\"\n });\n $routeProvider.otherwise({\n redirectTo: \"/not-found\"\n });\n $locationProvider.html5Mode({\n enabled: true,\n requireBase: false\n });\n defaultHeaders = {\n \"Content-Type\": \"application/json\",\n \"Accept-Language\": window.taigaConfig.defaultLanguage || \"en\",\n \"X-Session-Id\": taiga.sessionId\n };\n $httpProvider.defaults.headers[\"delete\"] = defaultHeaders;\n $httpProvider.defaults.headers.patch = defaultHeaders;\n $httpProvider.defaults.headers.post = defaultHeaders;\n $httpProvider.defaults.headers.put = defaultHeaders;\n $httpProvider.defaults.headers.get = {\n \"X-Session-Id\": taiga.sessionId\n };\n $httpProvider.useApplyAsync(true);\n $tgEventsProvider.setSessionId(taiga.sessionId);\n authHttpIntercept = function($q, $location, $navUrls, $lightboxService) {\n var httpResponseError;\n httpResponseError = function(response) {\n var nextUrl;\n if (response.status === 0 || (response.status === -1 && !response.config.cancelable)) {\n $lightboxService.closeAll();\n $location.path($navUrls.resolve(\"error\"));\n $location.replace();\n } else if (response.status === 401 && $location.url().indexOf('/login') === -1) {\n nextUrl = encodeURIComponent($location.url());\n $location.url($navUrls.resolve(\"login\")).search(\"next=\" + nextUrl);\n }\n return $q.reject(response);\n };\n return {\n responseError: httpResponseError\n };\n };\n $provide.factory(\"authHttpIntercept\", [\"$q\", \"$location\", \"$tgNavUrls\", \"lightboxService\", authHttpIntercept]);\n $httpProvider.interceptors.push(\"authHttpIntercept\");\n loaderIntercept = function($q, loaderService) {\n return {\n request: function(config) {\n loaderService.logRequest();\n return config;\n },\n requestError: function(rejection) {\n loaderService.logResponse();\n return $q.reject(rejection);\n },\n responseError: function(rejection) {\n loaderService.logResponse();\n return $q.reject(rejection);\n },\n response: function(response) {\n loaderService.logResponse();\n return response;\n }\n };\n };\n $provide.factory(\"loaderIntercept\", [\"$q\", \"tgLoader\", loaderIntercept]);\n $httpProvider.interceptors.push(\"loaderIntercept\");\n versionCheckHttpIntercept = function($q) {\n var httpResponseError;\n httpResponseError = function(response) {\n var $injector;\n if (response.status === 400 && response.data.version) {\n $injector = angular.element(\"body\").injector();\n $injector.invoke([\n \"$tgConfirm\", \"$translate\", (function(_this) {\n return function($confirm, $translate) {\n var versionErrorMsg;\n versionErrorMsg = $translate.instant(\"ERROR.VERSION_ERROR\");\n return $confirm.notify(\"error\", versionErrorMsg, null, 10000);\n };\n })(this)\n ]);\n }\n return $q.reject(response);\n };\n return {\n responseError: httpResponseError\n };\n };\n $provide.factory(\"versionCheckHttpIntercept\", [\"$q\", versionCheckHttpIntercept]);\n $httpProvider.interceptors.push(\"versionCheckHttpIntercept\");\n window.checksley.updateValidators({\n linewidth: function(val, width) {\n var lines, valid;\n lines = taiga.nl2br(val).split(\"
\");\n valid = _.every(lines, function(line) {\n return line.length < width;\n });\n return valid;\n }\n });\n $compileProvider.debugInfoEnabled(window.taigaConfig.debugInfo || false);\n if (localStorage.userInfo) {\n userInfo = JSON.parse(localStorage.userInfo);\n }\n preferedLangCode = (userInfo != null ? userInfo.lang : void 0) || window.taigaConfig.defaultLanguage || \"en\";\n $translatePartialLoaderProvider.addPart('taiga');\n $translateProvider.useLoader('$translatePartialLoader', {\n urlTemplate: '/' + window._version + '/locales/{part}/locale-{lang}.json'\n }).useSanitizeValueStrategy('escapeParameters').addInterpolation('$translateMessageFormatInterpolation').preferredLanguage(preferedLangCode);\n $translateProvider.fallbackLanguage(preferedLangCode);\n decorators = window.getDecorators();\n return _.each(decorators, function(decorator) {\n return $provide.decorator(decorator.provider, decorator.decorator);\n });\n };\n\n i18nInit = function(lang, $translate) {\n var messages;\n moment.locale(lang);\n messages = {\n defaultMessage: $translate.instant(\"COMMON.FORM_ERRORS.DEFAULT_MESSAGE\"),\n type: {\n email: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_EMAIL\"),\n url: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_URL\"),\n urlstrict: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_URLSTRICT\"),\n number: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_NUMBER\"),\n digits: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_DIGITS\"),\n dateIso: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_DATEISO\"),\n alphanum: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_ALPHANUM\"),\n phone: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_PHONE\")\n },\n notnull: $translate.instant(\"COMMON.FORM_ERRORS.NOTNULL\"),\n notblank: $translate.instant(\"COMMON.FORM_ERRORS.NOT_BLANK\"),\n required: $translate.instant(\"COMMON.FORM_ERRORS.REQUIRED\"),\n regexp: $translate.instant(\"COMMON.FORM_ERRORS.REGEXP\"),\n min: $translate.instant(\"COMMON.FORM_ERRORS.MIN\"),\n max: $translate.instant(\"COMMON.FORM_ERRORS.MAX\"),\n range: $translate.instant(\"COMMON.FORM_ERRORS.RANGE\"),\n minlength: $translate.instant(\"COMMON.FORM_ERRORS.MIN_LENGTH\"),\n maxlength: $translate.instant(\"COMMON.FORM_ERRORS.MAX_LENGTH\"),\n rangelength: $translate.instant(\"COMMON.FORM_ERRORS.RANGE_LENGTH\"),\n mincheck: $translate.instant(\"COMMON.FORM_ERRORS.MIN_CHECK\"),\n maxcheck: $translate.instant(\"COMMON.FORM_ERRORS.MAX_CHECK\"),\n rangecheck: $translate.instant(\"COMMON.FORM_ERRORS.RANGE_CHECK\"),\n equalto: $translate.instant(\"COMMON.FORM_ERRORS.EQUAL_TO\")\n };\n return checksley.updateMessages('default', messages);\n };\n\n init = function($log, $rootscope, $auth, $events, $analytics, $translate, $location, $navUrls, appMetaService, projectService, loaderService, navigationBarService) {\n var un, user;\n $log.debug(\"Initialize application\");\n $rootscope.contribPlugins = this.taigaContribPlugins;\n $rootscope.adminPlugins = _.where(this.taigaContribPlugins, {\n \"type\": \"admin\"\n });\n $rootscope.$on(\"$translateChangeEnd\", function(e, ctx) {\n var lang;\n lang = ctx.language;\n return i18nInit(lang, $translate);\n });\n Promise.setScheduler(function(cb) {\n return $rootscope.$evalAsync(cb);\n });\n $events.setupConnection();\n if ($auth.isAuthenticated()) {\n user = $auth.getUser();\n }\n $analytics.initialize();\n un = $rootscope.$on('$routeChangeStart', function(event, next) {\n if (next.loader) {\n loaderService.start(true);\n }\n return un();\n });\n return $rootscope.$on('$routeChangeSuccess', function(event, next) {\n var description, title;\n if (next.loader) {\n loaderService.start(true);\n }\n if (next.access && next.access.requiresLogin) {\n if (!$auth.isAuthenticated()) {\n $location.path($navUrls.resolve(\"login\"));\n }\n }\n projectService.setSection(next.section);\n if (next.params.pslug) {\n projectService.setProjectBySlug(next.params.pslug);\n } else {\n projectService.cleanProject();\n }\n if (next.title || next.description) {\n title = $translate.instant(next.title || \"\");\n description = $translate.instant(next.description || \"\");\n appMetaService.setAll(title, description);\n }\n if (next.mobileViewport) {\n appMetaService.addMobileViewport();\n } else {\n appMetaService.removeMobileViewport();\n }\n if (next.disableHeader) {\n return navigationBarService.disableHeader();\n } else {\n return navigationBarService.enableHeader();\n }\n });\n };\n\n pluginsWithModule = _.filter(this.taigaContribPlugins, function(plugin) {\n return plugin.module;\n });\n\n angular.module('infinite-scroll').value('THROTTLE_MILLISECONDS', 500);\n\n modules = [\"taigaBase\", \"taigaCommon\", \"taigaResources\", \"taigaResources2\", \"taigaAuth\", \"taigaEvents\", \"taigaHome\", \"taigaNavigationBar\", \"taigaProjects\", \"taigaRelatedTasks\", \"taigaBacklog\", \"taigaTaskboard\", \"taigaKanban\", \"taigaIssues\", \"taigaUserStories\", \"taigaTasks\", \"taigaTeam\", \"taigaWiki\", \"taigaSearch\", \"taigaAdmin\", \"taigaProject\", \"taigaUserSettings\", \"taigaFeedback\", \"taigaPlugins\", \"taigaIntegrations\", \"taigaComponents\", \"taigaProfile\", \"taigaHome\", \"taigaUserTimeline\", \"taigaExternalApps\", \"taigaDiscover\", \"templates\", \"ngSanitize\", \"ngRoute\", \"ngAnimate\", \"ngAria\", \"pascalprecht.translate\", \"infinite-scroll\", \"tgRepeat\"].concat(_.map(pluginsWithModule, function(plugin) {\n return plugin.module;\n }));\n\n module = angular.module(\"taiga\", modules);\n\n module.config([\"$routeProvider\", \"$locationProvider\", \"$httpProvider\", \"$provide\", \"$tgEventsProvider\", \"$compileProvider\", \"$translateProvider\", \"$translatePartialLoaderProvider\", \"$animateProvider\", configure]);\n\n module.run([\"$log\", \"$rootScope\", \"$tgAuth\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"tgProjectService\", \"tgLoader\", \"tgNavigationBarService\", \"$route\", init]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: classes.coffee\n */\n\n(function() {\n var TaigaBase, TaigaController, TaigaService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n TaigaBase = (function() {\n function TaigaBase() {}\n\n return TaigaBase;\n\n })();\n\n TaigaService = (function(superClass) {\n extend(TaigaService, superClass);\n\n function TaigaService() {\n return TaigaService.__super__.constructor.apply(this, arguments);\n }\n\n return TaigaService;\n\n })(TaigaBase);\n\n TaigaController = (function(superClass) {\n extend(TaigaController, superClass);\n\n function TaigaController() {\n this.onInitialDataError = bind(this.onInitialDataError, this);\n return TaigaController.__super__.constructor.apply(this, arguments);\n }\n\n TaigaController.prototype.onInitialDataError = function(xhr) {\n if (xhr) {\n if (xhr.status === 404) {\n this.location.path(this.navUrls.resolve(\"not-found\"));\n this.location.replace();\n } else if (xhr.status === 403) {\n this.location.path(this.navUrls.resolve(\"permission-denied\"));\n this.location.replace();\n }\n }\n return this.q.reject(xhr);\n };\n\n return TaigaController;\n\n })(TaigaBase);\n\n this.taiga.Base = TaigaBase;\n\n this.taiga.Service = TaigaService;\n\n this.taiga.Controller = TaigaController;\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: utils.coffee\n */\n\n(function() {\n var bindMethods, bindOnce, cancelTimeout, debounce, debounceLeading, defineImmutableProperty, groupBy, isImage, joinStr, mixOf, nl2br, patch, replaceTags, scopeDefer, sizeFormat, slugify, startswith, stripTags, taiga, timeout, toString, toggleText, trim, truncate, unslugify,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },\n slice = [].slice,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n nl2br = (function(_this) {\n return function(str) {\n var breakTag;\n breakTag = '
';\n return (str + '').replace(/([^>\\r\\n]?)(\\r\\n|\\n\\r|\\r|\\n)/g, '$1' + breakTag + '$2');\n };\n })(this);\n\n bindMethods = (function(_this) {\n return function(object) {\n var dependencies, methods;\n dependencies = _.keys(object);\n methods = [];\n _.forIn(object, function(value, key) {\n if (indexOf.call(dependencies, key) < 0) {\n return methods.push(key);\n }\n });\n return _.bindAll(object, methods);\n };\n })(this);\n\n bindOnce = (function(_this) {\n return function(scope, attr, continuation) {\n var delBind, val;\n val = scope.$eval(attr);\n if (val !== void 0) {\n return continuation(val);\n }\n delBind = null;\n return delBind = scope.$watch(attr, function(val) {\n if (val === void 0) {\n return;\n }\n continuation(val);\n if (delBind) {\n return delBind();\n }\n });\n };\n })(this);\n\n mixOf = function() {\n var Mixed, base, i, method, mixin, mixins, name, ref;\n base = arguments[0], mixins = 2 <= arguments.length ? slice.call(arguments, 1) : [];\n Mixed = (function(superClass) {\n extend(Mixed, superClass);\n\n function Mixed() {\n return Mixed.__super__.constructor.apply(this, arguments);\n }\n\n return Mixed;\n\n })(base);\n for (i = mixins.length - 1; i >= 0; i += -1) {\n mixin = mixins[i];\n ref = mixin.prototype;\n for (name in ref) {\n method = ref[name];\n Mixed.prototype[name] = method;\n }\n }\n return Mixed;\n };\n\n trim = function(data, char) {\n return _.str.trim(data, char);\n };\n\n slugify = function(data) {\n return _.str.slugify(data);\n };\n\n unslugify = function(data) {\n if (data) {\n return _.str.capitalize(data.replace(/-/g, ' '));\n }\n return data;\n };\n\n toggleText = function(element, texts) {\n var nextTextPosition, text;\n nextTextPosition = element.data('nextTextPosition');\n if ((nextTextPosition == null) || nextTextPosition >= texts.length) {\n nextTextPosition = 0;\n }\n text = texts[nextTextPosition];\n element.data('nextTextPosition', nextTextPosition + 1);\n return element.text(text);\n };\n\n groupBy = function(coll, pred) {\n var i, item, len, result;\n result = {};\n for (i = 0, len = coll.length; i < len; i++) {\n item = coll[i];\n result[pred(item)] = item;\n }\n return result;\n };\n\n timeout = function(wait, continuation) {\n return window.setTimeout(continuation, wait);\n };\n\n cancelTimeout = function(timeoutVar) {\n return window.clearTimeout(timeoutVar);\n };\n\n scopeDefer = function(scope, func) {\n return _.defer((function(_this) {\n return function() {\n return scope.$apply(func);\n };\n })(this));\n };\n\n toString = function(value) {\n if (_.isNumber(value)) {\n return value + \"\";\n } else if (_.isString(value)) {\n return value;\n } else if (_.isPlainObject(value)) {\n return JSON.stringify(value);\n } else if (_.isUndefined(value)) {\n return \"\";\n }\n return value.toString();\n };\n\n joinStr = function(str, coll) {\n return _.str.join(str, coll);\n };\n\n debounce = function(wait, func) {\n return _.debounce(func, wait, {\n leading: true,\n trailing: false\n });\n };\n\n debounceLeading = function(wait, func) {\n return _.debounce(func, wait, {\n leading: false,\n trailing: true\n });\n };\n\n startswith = function(str1, str2) {\n return _.str.startsWith(str1, str2);\n };\n\n truncate = function(str, maxLength, suffix) {\n var out;\n if (suffix == null) {\n suffix = \"...\";\n }\n if ((typeof str !== \"string\") && !(str instanceof String)) {\n return str;\n }\n out = str.slice(0);\n if (out.length > maxLength) {\n out = out.substring(0, maxLength + 1);\n out = out.substring(0, Math.min(out.length, out.lastIndexOf(\" \")));\n out = out + suffix;\n }\n return out;\n };\n\n sizeFormat = function(input, precision) {\n var number, size, units;\n if (precision == null) {\n precision = 1;\n }\n if (isNaN(parseFloat(input)) || !isFinite(input)) {\n return \"-\";\n }\n if (input === 0) {\n return \"0 bytes\";\n }\n units = [\"bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\n number = Math.floor(Math.log(input) / Math.log(1024));\n if (number > 5) {\n number = 5;\n }\n size = (input / Math.pow(1024, number)).toFixed(precision);\n return size + \" \" + units[number];\n };\n\n stripTags = function(str, exception) {\n var pattern;\n if (exception) {\n pattern = new RegExp('<(?!' + exception + '\\s*\\/?)[^>]+>', 'gi');\n return String(str).replace(pattern, '');\n } else {\n return String(str).replace(/<\\/?[^>]+>/g, '');\n }\n };\n\n replaceTags = function(str, tags, replace) {\n var pattern;\n pattern = new RegExp('<(' + tags + ')>', 'gi');\n str = str.replace(pattern, '<' + replace + '>');\n pattern = new RegExp('<\\/(' + tags + ')>', 'gi');\n str = str.replace(pattern, '');\n return str;\n };\n\n defineImmutableProperty = (function(_this) {\n return function(obj, name, fn) {\n return Object.defineProperty(obj, name, {\n get: function() {\n var fn_result;\n if (!_.isFunction(fn)) {\n throw \"defineImmutableProperty third param must be a function\";\n }\n fn_result = fn();\n if (fn_result && _.isObject(fn_result)) {\n if (fn_result.size === void 0) {\n throw \"defineImmutableProperty must return immutable data\";\n }\n }\n return fn_result;\n }\n });\n };\n })(this);\n\n _.mixin({\n removeKeys: function(obj, keys) {\n return _.chain([keys]).flatten().reduce(function(obj, key) {\n delete obj[key];\n return obj;\n }, obj).value();\n },\n cartesianProduct: function() {\n return _.reduceRight(arguments, function(a, b) {\n return _.flatten(_.map(a, function(x) {\n return _.map(b, function(y) {\n return [y].concat(x);\n });\n }), true);\n }, [[]]);\n }\n });\n\n isImage = function(name) {\n return name.match(/\\.(jpe?g|png|gif|gifv|webm)/i) !== null;\n };\n\n patch = function(oldImmutable, newImmutable) {\n var pathObj;\n pathObj = {};\n newImmutable.forEach(function(newValue, key) {\n if (newValue !== oldImmutable.get(key)) {\n if (newValue.toJS) {\n return pathObj[key] = newValue.toJS();\n } else {\n return pathObj[key] = newValue;\n }\n }\n });\n return pathObj;\n };\n\n taiga = this.taiga;\n\n taiga.nl2br = nl2br;\n\n taiga.bindMethods = bindMethods;\n\n taiga.bindOnce = bindOnce;\n\n taiga.mixOf = mixOf;\n\n taiga.trim = trim;\n\n taiga.slugify = slugify;\n\n taiga.unslugify = unslugify;\n\n taiga.toggleText = toggleText;\n\n taiga.groupBy = groupBy;\n\n taiga.timeout = timeout;\n\n taiga.cancelTimeout = cancelTimeout;\n\n taiga.scopeDefer = scopeDefer;\n\n taiga.toString = toString;\n\n taiga.joinStr = joinStr;\n\n taiga.truncate = truncate;\n\n taiga.debounce = debounce;\n\n taiga.debounceLeading = debounceLeading;\n\n taiga.startswith = startswith;\n\n taiga.sizeFormat = sizeFormat;\n\n taiga.stripTags = stripTags;\n\n taiga.replaceTags = replaceTags;\n\n taiga.defineImmutableProperty = defineImmutableProperty;\n\n taiga.isImage = isImage;\n\n taiga.patch = patch;\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/controllerMixins.coffee\n */\n\n(function() {\n var FiltersMixin, PageMixin, groupBy, joinStr, taiga, toString, trim;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n joinStr = this.taiga.joinStr;\n\n trim = this.taiga.trim;\n\n toString = this.taiga.toString;\n\n PageMixin = (function() {\n function PageMixin() {}\n\n PageMixin.prototype.fillUsersAndRoles = function(users, roles) {\n var activeUsers, computableRoles;\n activeUsers = _.filter(users, (function(_this) {\n return function(user) {\n return user.is_active;\n };\n })(this));\n this.scope.activeUsers = _.sortBy(activeUsers, \"full_name_display\");\n this.scope.activeUsersById = groupBy(this.scope.activeUsers, function(e) {\n return e.id;\n });\n this.scope.users = _.sortBy(users, \"full_name_display\");\n this.scope.usersById = groupBy(this.scope.users, function(e) {\n return e.id;\n });\n this.scope.roles = _.sortBy(roles, \"order\");\n computableRoles = _(this.scope.project.members).map(\"role\").uniq().value();\n return this.scope.computableRoles = _(roles).filter(\"computable\").filter(function(x) {\n return _.contains(computableRoles, x.id);\n }).value();\n };\n\n PageMixin.prototype.loadUsersAndRoles = function() {\n var promise;\n promise = this.q.all([this.rs.projects.usersList(this.scope.projectId), this.rs.projects.rolesList(this.scope.projectId)]);\n return promise.then((function(_this) {\n return function(results) {\n var roles, users;\n users = results[0], roles = results[1];\n _this.fillUsersAndRoles(users, roles);\n return results;\n };\n })(this));\n };\n\n return PageMixin;\n\n })();\n\n taiga.PageMixin = PageMixin;\n\n FiltersMixin = (function() {\n function FiltersMixin() {}\n\n FiltersMixin.prototype.selectFilter = function(name, value, load) {\n var existing, location, params;\n if (load == null) {\n load = false;\n }\n params = this.location.search();\n if (params[name] !== void 0 && name !== \"page\") {\n existing = _.map(taiga.toString(params[name]).split(\",\"), function(x) {\n return trim(x);\n });\n existing.push(taiga.toString(value));\n existing = _.compact(existing);\n value = joinStr(\",\", _.uniq(existing));\n }\n if (!this.location.isInCurrentRouteParams(name, value)) {\n location = load ? this.location : this.location.noreload(this.scope);\n return location.search(name, value);\n }\n };\n\n FiltersMixin.prototype.replaceFilter = function(name, value, load) {\n var location;\n if (load == null) {\n load = false;\n }\n if (!this.location.isInCurrentRouteParams(name, value)) {\n location = load ? this.location : this.location.noreload(this.scope);\n return location.search(name, value);\n }\n };\n\n FiltersMixin.prototype.replaceAllFilters = function(filters, load) {\n var location;\n if (load == null) {\n load = false;\n }\n location = load ? this.location : this.location.noreload(this.scope);\n return location.search(filters);\n };\n\n FiltersMixin.prototype.unselectFilter = function(name, value, load) {\n var location, newValues, params, parsedValues;\n if (load == null) {\n load = false;\n }\n params = this.location.search();\n if (params[name] === void 0) {\n return;\n }\n if (value === void 0 || value === null) {\n delete params[name];\n }\n parsedValues = _.map(taiga.toString(params[name]).split(\",\"), function(x) {\n return trim(x);\n });\n newValues = _.reject(parsedValues, function(x) {\n return x === taiga.toString(value);\n });\n newValues = _.compact(newValues);\n if (_.isEmpty(newValues)) {\n value = null;\n } else {\n value = joinStr(\",\", _.uniq(newValues));\n }\n location = load ? this.location : this.location.noreload(this.scope);\n return location.search(name, value);\n };\n\n return FiltersMixin;\n\n })();\n\n taiga.FiltersMixin = FiltersMixin;\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaAdmin\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/auth.coffee\n */\n\n(function() {\n var AuthService, CancelAccountDirective, ChangeEmailDirective, ChangePasswordFromRecoveryDirective, ForgotPasswordDirective, InvitationDirective, LoginDirective, PublicRegisterMessageDirective, RegisterDirective, debounce, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaAuth\", [\"taigaResources\"]);\n\n AuthService = (function(superClass) {\n extend(AuthService, superClass);\n\n AuthService.$inject = [\"$rootScope\", \"$tgStorage\", \"$tgModel\", \"$tgResources\", \"$tgHttp\", \"$tgUrls\", \"$tgConfig\", \"$translate\", \"tgCurrentUserService\", \"tgThemeService\"];\n\n function AuthService(rootscope, storage, model, rs, http, urls, config, translate, currentUserService, themeService) {\n var userModel;\n this.rootscope = rootscope;\n this.storage = storage;\n this.model = model;\n this.rs = rs;\n this.http = http;\n this.urls = urls;\n this.config = config;\n this.translate = translate;\n this.currentUserService = currentUserService;\n this.themeService = themeService;\n AuthService.__super__.constructor.call(this);\n userModel = this.getUser();\n this._currentTheme = this._getUserTheme();\n this.setUserdata(userModel);\n }\n\n AuthService.prototype.setUserdata = function(userModel) {\n if (userModel) {\n this.userData = Immutable.fromJS(userModel.getAttrs());\n return this.currentUserService.setUser(this.userData);\n } else {\n return this.userData = null;\n }\n };\n\n AuthService.prototype._getUserTheme = function() {\n var ref;\n return ((ref = this.rootscope.user) != null ? ref.theme : void 0) || this.config.get(\"defaultTheme\") || \"taiga\";\n };\n\n AuthService.prototype._setTheme = function() {\n var newTheme;\n newTheme = this._getUserTheme();\n if (this._currentTheme !== newTheme) {\n this._currentTheme = newTheme;\n return this.themeService.use(this._currentTheme);\n }\n };\n\n AuthService.prototype._setLocales = function() {\n var lang, ref;\n lang = ((ref = this.rootscope.user) != null ? ref.lang : void 0) || this.config.get(\"defaultLanguage\") || \"en\";\n this.translate.preferredLanguage(lang);\n return this.translate.use(lang);\n };\n\n AuthService.prototype.getUser = function() {\n var user, userData;\n if (this.rootscope.user) {\n return this.rootscope.user;\n }\n userData = this.storage.get(\"userInfo\");\n if (userData) {\n user = this.model.make_model(\"users\", userData);\n this.rootscope.user = user;\n this._setLocales();\n this._setTheme();\n return user;\n } else {\n this._setTheme();\n }\n return null;\n };\n\n AuthService.prototype.setUser = function(user) {\n this.rootscope.auth = user;\n this.storage.set(\"userInfo\", user.getAttrs());\n this.rootscope.user = user;\n this.setUserdata(user);\n this._setLocales();\n return this._setTheme();\n };\n\n AuthService.prototype.clear = function() {\n this.rootscope.auth = null;\n this.rootscope.user = null;\n return this.storage.remove(\"userInfo\");\n };\n\n AuthService.prototype.setToken = function(token) {\n return this.storage.set(\"token\", token);\n };\n\n AuthService.prototype.getToken = function() {\n return this.storage.get(\"token\");\n };\n\n AuthService.prototype.removeToken = function() {\n return this.storage.remove(\"token\");\n };\n\n AuthService.prototype.isAuthenticated = function() {\n if (this.getUser() !== null) {\n return true;\n }\n return false;\n };\n\n AuthService.prototype.login = function(data, type) {\n var url;\n url = this.urls.resolve(\"auth\");\n data = _.clone(data, false);\n data.type = type ? type : \"normal\";\n this.removeToken();\n return this.http.post(url, data).then((function(_this) {\n return function(data, status) {\n var user;\n user = _this.model.make_model(\"users\", data.data);\n _this.setToken(user.auth_token);\n _this.setUser(user);\n return user;\n };\n })(this));\n };\n\n AuthService.prototype.logout = function() {\n this.removeToken();\n this.clear();\n this.currentUserService.removeUser();\n this._setTheme();\n return this._setLocales();\n };\n\n AuthService.prototype.register = function(data, type, existing) {\n var url;\n url = this.urls.resolve(\"auth-register\");\n data = _.clone(data, false);\n data.type = type ? type : \"public\";\n if (type === \"private\") {\n data.existing = existing ? existing : false;\n }\n this.removeToken();\n return this.http.post(url, data).then((function(_this) {\n return function(response) {\n var user;\n user = _this.model.make_model(\"users\", response.data);\n _this.setToken(user.auth_token);\n _this.setUser(user);\n return user;\n };\n })(this));\n };\n\n AuthService.prototype.getInvitation = function(token) {\n return this.rs.invitations.get(token);\n };\n\n AuthService.prototype.acceptInvitiationWithNewUser = function(data) {\n return this.register(data, \"private\", false);\n };\n\n AuthService.prototype.acceptInvitiationWithExistingUser = function(data) {\n return this.register(data, \"private\", true);\n };\n\n AuthService.prototype.forgotPassword = function(data) {\n var url;\n url = this.urls.resolve(\"users-password-recovery\");\n data = _.clone(data, false);\n this.removeToken();\n return this.http.post(url, data);\n };\n\n AuthService.prototype.changePasswordFromRecovery = function(data) {\n var url;\n url = this.urls.resolve(\"users-change-password-from-recovery\");\n data = _.clone(data, false);\n this.removeToken();\n return this.http.post(url, data);\n };\n\n AuthService.prototype.changeEmail = function(data) {\n var url;\n url = this.urls.resolve(\"users-change-email\");\n data = _.clone(data, false);\n return this.http.post(url, data);\n };\n\n AuthService.prototype.cancelAccount = function(data) {\n var url;\n url = this.urls.resolve(\"users-cancel-account\");\n data = _.clone(data, false);\n return this.http.post(url, data);\n };\n\n return AuthService;\n\n })(taiga.Service);\n\n module.service(\"$tgAuth\", AuthService);\n\n PublicRegisterMessageDirective = function($config, $navUrls, $routeParams, templates) {\n var template, templateFn;\n template = templates.get(\"auth/login-text.html\", true);\n templateFn = function() {\n var nextUrl, publicRegisterEnabled, url;\n publicRegisterEnabled = $config.get(\"publicRegisterEnabled\");\n if (!publicRegisterEnabled) {\n return \"\";\n }\n url = $navUrls.resolve(\"register\");\n if ($routeParams['next'] && $routeParams['next'] !== $navUrls.resolve(\"register\")) {\n nextUrl = encodeURIComponent($routeParams['next']);\n console.log(\"-----\", nextUrl);\n url += \"?next=\" + nextUrl;\n }\n return template({\n url: url\n });\n };\n return {\n restrict: \"AE\",\n scope: {},\n template: templateFn\n };\n };\n\n module.directive(\"tgPublicRegisterMessage\", [\"$tgConfig\", \"$tgNavUrls\", \"$routeParams\", \"$tgTemplate\", PublicRegisterMessageDirective]);\n\n LoginDirective = function($auth, $confirm, $location, $config, $routeParams, $navUrls, $events, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onError, onSuccess, submit;\n form = new checksley.Form($el.find(\"form.login-form\"));\n if ($routeParams['next'] && $routeParams['next'] !== $navUrls.resolve(\"login\")) {\n $scope.nextUrl = decodeURIComponent($routeParams['next']);\n } else {\n $scope.nextUrl = $navUrls.resolve(\"home\");\n }\n onSuccess = function(response) {\n $events.setupConnection();\n return $location.url($scope.nextUrl);\n };\n onError = function(response) {\n return $confirm.notify(\"light-error\", $translate.instant(\"LOGIN_FORM.ERROR_AUTH_INCORRECT\"));\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var data, loginFormType, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n data = {\n \"username\": $el.find(\"form.login-form input[name=username]\").val(),\n \"password\": $el.find(\"form.login-form input[name=password]\").val()\n };\n loginFormType = $config.get(\"loginFormType\", \"normal\");\n promise = $auth.login(data, loginFormType);\n return promise.then(onSuccess, onError);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n window.prerenderReady = true;\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLogin\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgConfig\", \"$routeParams\", \"$tgNavUrls\", \"$tgEvents\", \"$translate\", LoginDirective]);\n\n RegisterDirective = function($auth, $confirm, $location, $navUrls, $config, $routeParams, $analytics, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit;\n if (!$config.get(\"publicRegisterEnabled\")) {\n $location.path($navUrls.resolve(\"not-found\"));\n $location.replace();\n }\n $scope.data = {};\n form = $el.find(\"form\").checksley({\n onlyOneErrorElement: true\n });\n if ($routeParams['next'] && $routeParams['next'] !== $navUrls.resolve(\"register\")) {\n $scope.nextUrl = decodeURIComponent($routeParams['next']);\n } else {\n $scope.nextUrl = $navUrls.resolve(\"home\");\n }\n onSuccessSubmit = function(response) {\n $analytics.trackEvent(\"auth\", \"register\", \"user registration\", 1);\n $confirm.notify(\"success\", $translate.instant(\"LOGIN_FORM.SUCCESS\"));\n return $location.url($scope.nextUrl);\n };\n onErrorSubmit = function(response) {\n var text;\n if (response.data._error_message) {\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {\n error: response.data._error_message\n });\n $confirm.notify(\"light-error\", text);\n }\n return form.setErrors(response.data);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n promise = $auth.register($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return window.prerenderReady = true;\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRegister\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgNavUrls\", \"$tgConfig\", \"$routeParams\", \"$tgAnalytics\", \"$translate\", RegisterDirective]);\n\n ForgotPasswordDirective = function($auth, $confirm, $location, $navUrls, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit;\n $scope.data = {};\n form = $el.find(\"form\").checksley();\n onSuccessSubmit = function(response) {\n var text;\n $location.path($navUrls.resolve(\"login\"));\n text = $translate.instant(\"FORGOT_PASSWORD_FORM.SUCCESS\");\n return $confirm.success(text);\n };\n onErrorSubmit = function(response) {\n var text;\n text = $translate.instant(\"FORGOT_PASSWORD_FORM.ERROR\");\n return $confirm.notify(\"light-error\", text);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n promise = $auth.forgotPassword($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return window.prerenderReady = true;\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgForgotPassword\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgNavUrls\", \"$translate\", ForgotPasswordDirective]);\n\n ChangePasswordFromRecoveryDirective = function($auth, $confirm, $location, $params, $navUrls, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit, text;\n $scope.data = {};\n if ($params.token != null) {\n $scope.tokenInParams = true;\n $scope.data.token = $params.token;\n } else {\n $location.path($navUrls.resolve(\"login\"));\n text = $translate.instant(\"CHANGE_PASSWORD_RECOVERY_FORM.ERROR\");\n $confirm.notify(\"light-error\", text);\n }\n form = $el.find(\"form\").checksley();\n onSuccessSubmit = function(response) {\n $location.path($navUrls.resolve(\"login\"));\n text = $translate.instant(\"CHANGE_PASSWORD_RECOVERY_FORM.SUCCESS\");\n return $confirm.success(text);\n };\n onErrorSubmit = function(response) {\n text = $translate.instant(\"CHANGE_PASSWORD_RECOVERY_FORM.ERROR\");\n return $confirm.notify(\"light-error\", text);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n promise = $auth.changePasswordFromRecovery($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgChangePasswordFromRecovery\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$routeParams\", \"$tgNavUrls\", \"$translate\", ChangePasswordFromRecoveryDirective]);\n\n InvitationDirective = function($auth, $confirm, $location, $params, $navUrls, $analytics, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var loginForm, onErrorSubmitLogin, onErrorSubmitRegister, onSuccessSubmitLogin, onSuccessSubmitRegister, promise, registerForm, submitLogin, submitRegister, token;\n token = $params.token;\n promise = $auth.getInvitation(token);\n promise.then(function(invitation) {\n return $scope.invitation = invitation;\n });\n promise.then(null, function(response) {\n var text;\n $location.path($navUrls.resolve(\"login\"));\n text = $translate.instant(\"INVITATION_LOGIN_FORM.NOT_FOUND\");\n return $confirm.notify(\"light-error\", text);\n });\n $scope.dataLogin = {\n token: token\n };\n loginForm = $el.find(\"form.login-form\").checksley({\n onlyOneErrorElement: true\n });\n onSuccessSubmitLogin = function(response) {\n var text;\n $analytics.trackEvent(\"auth\", \"invitationAccept\", \"invitation accept with existing user\", 1);\n $location.path($navUrls.resolve(\"project\", {\n project: $scope.invitation.project_slug\n }));\n text = $translate.instant(\"INVITATION_LOGIN_FORM.SUCCESS\", {\n \"project_name\": $scope.invitation.project_name\n });\n return $confirm.notify(\"success\", text);\n };\n onErrorSubmitLogin = function(response) {\n return $confirm.notify(\"light-error\", response.data._error_message);\n };\n submitLogin = debounce(2000, (function(_this) {\n return function(event) {\n event.preventDefault();\n if (!loginForm.validate()) {\n return;\n }\n promise = $auth.acceptInvitiationWithExistingUser($scope.dataLogin);\n return promise.then(onSuccessSubmitLogin, onErrorSubmitLogin);\n };\n })(this));\n $el.on(\"submit\", \"form.login-form\", submitLogin);\n $el.on(\"click\", \".button-login\", submitLogin);\n $scope.dataRegister = {\n token: token\n };\n registerForm = $el.find(\"form.register-form\").checksley({\n onlyOneErrorElement: true\n });\n onSuccessSubmitRegister = function(response) {\n $analytics.trackEvent(\"auth\", \"invitationAccept\", \"invitation accept with new user\", 1);\n $location.path($navUrls.resolve(\"project\", {\n project: $scope.invitation.project_slug\n }));\n return $confirm.notify(\"success\", \"You've successfully joined this project\", \"Welcome to \" + (_.escape($scope.invitation.project_name)));\n };\n onErrorSubmitRegister = function(response) {\n var text;\n if (response.data._error_message) {\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {\n error: response.data._error_message\n });\n $confirm.notify(\"light-error\", text);\n }\n return registerForm.setErrors(response.data);\n };\n submitRegister = debounce(2000, (function(_this) {\n return function(event) {\n event.preventDefault();\n if (!registerForm.validate()) {\n return;\n }\n promise = $auth.acceptInvitiationWithNewUser($scope.dataRegister);\n return promise.then(onSuccessSubmitRegister, onErrorSubmitRegister);\n };\n })(this));\n $el.on(\"submit\", \"form.register-form\", submitRegister);\n $el.on(\"click\", \".button-register\", submitRegister);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgInvitation\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$routeParams\", \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\", InvitationDirective]);\n\n ChangeEmailDirective = function($repo, $model, $auth, $confirm, $location, $params, $navUrls, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit;\n $scope.data = {};\n $scope.data.email_token = $params.email_token;\n form = $el.find(\"form\").checksley();\n onSuccessSubmit = function(response) {\n var text;\n if ($auth.isAuthenticated()) {\n $repo.queryOne(\"users\", $auth.getUser().id).then((function(_this) {\n return function(data) {\n $auth.setUser(data);\n return $location.path($navUrls.resolve(\"home\"));\n };\n })(this));\n } else {\n $location.path($navUrls.resolve(\"login\"));\n }\n text = $translate.instant(\"CHANGE_EMAIL_FORM.SUCCESS\");\n return $confirm.success(text);\n };\n onErrorSubmit = function(response) {\n var text;\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {\n error: response.data._error_message\n });\n return $confirm.notify(\"light-error\", text);\n };\n submit = function() {\n var promise;\n if (!form.validate()) {\n return;\n }\n promise = $auth.changeEmail($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n $el.on(\"submit\", function(event) {\n event.preventDefault();\n return submit();\n });\n $el.on(\"click\", \"a.button-change-email\", function(event) {\n event.preventDefault();\n return submit();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgChangeEmail\", [\"$tgRepo\", \"$tgModel\", \"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$routeParams\", \"$tgNavUrls\", \"$translate\", ChangeEmailDirective]);\n\n CancelAccountDirective = function($repo, $model, $auth, $confirm, $location, $params, $navUrls) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit;\n $scope.data = {};\n $scope.data.cancel_token = $params.cancel_token;\n form = $el.find(\"form\").checksley();\n onSuccessSubmit = function(response) {\n var text;\n $auth.logout();\n $location.path($navUrls.resolve(\"home\"));\n text = $translate.instant(\"CANCEL_ACCOUNT.SUCCESS\");\n return $confirm.success(text);\n };\n onErrorSubmit = function(response) {\n var text;\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {\n error: response.data._error_message\n });\n return $confirm.notify(\"error\", text);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n promise = $auth.cancelAccount($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgCancelAccount\", [\"$tgRepo\", \"$tgModel\", \"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$routeParams\", \"$tgNavUrls\", CancelAccountDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaBacklog\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base.coffee\n */\n\n(function() {\n var TaigaMainDirective, bindOnce, groupBy, init, module, taiga, urls;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaBase\", []);\n\n TaigaMainDirective = function($rootscope, $window) {\n var link;\n link = function($scope, $el, $attrs) {\n return $window.onresize = function() {\n return $rootscope.$broadcast(\"resize\");\n };\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMain\", [\"$rootScope\", \"$window\", TaigaMainDirective]);\n\n urls = {\n \"home\": \"/\",\n \"projects\": \"/projects\",\n \"error\": \"/error\",\n \"not-found\": \"/not-found\",\n \"permission-denied\": \"/permission-denied\",\n \"discover\": \"/discover\",\n \"discover-search\": \"/discover/search\",\n \"login\": \"/login\",\n \"forgot-password\": \"/forgot-password\",\n \"change-password\": \"/change-password/:token\",\n \"change-email\": \"/change-email/:token\",\n \"cancel-account\": \"/cancel-account/:token\",\n \"register\": \"/register\",\n \"invitation\": \"/invitation/:token\",\n \"create-project\": \"/create-project\",\n \"profile\": \"/profile\",\n \"user-profile\": \"/profile/:username\",\n \"project\": \"/project/:project\",\n \"project-backlog\": \"/project/:project/backlog\",\n \"project-taskboard\": \"/project/:project/taskboard/:sprint\",\n \"project-kanban\": \"/project/:project/kanban\",\n \"project-issues\": \"/project/:project/issues\",\n \"project-search\": \"/project/:project/search\",\n \"project-userstories-detail\": \"/project/:project/us/:ref\",\n \"project-tasks-detail\": \"/project/:project/task/:ref\",\n \"project-issues-detail\": \"/project/:project/issue/:ref\",\n \"project-wiki\": \"/project/:project/wiki\",\n \"project-wiki-page\": \"/project/:project/wiki/:slug\",\n \"project-team\": \"/project/:project/team\",\n \"project-admin-home\": \"/project/:project/admin/project-profile/details\",\n \"project-admin-project-profile-details\": \"/project/:project/admin/project-profile/details\",\n \"project-admin-project-profile-default-values\": \"/project/:project/admin/project-profile/default-values\",\n \"project-admin-project-profile-modules\": \"/project/:project/admin/project-profile/modules\",\n \"project-admin-project-profile-export\": \"/project/:project/admin/project-profile/export\",\n \"project-admin-project-profile-reports\": \"/project/:project/admin/project-profile/reports\",\n \"project-admin-project-values-status\": \"/project/:project/admin/project-values/status\",\n \"project-admin-project-values-points\": \"/project/:project/admin/project-values/points\",\n \"project-admin-project-values-priorities\": \"/project/:project/admin/project-values/priorities\",\n \"project-admin-project-values-severities\": \"/project/:project/admin/project-values/severities\",\n \"project-admin-project-values-types\": \"/project/:project/admin/project-values/types\",\n \"project-admin-project-values-custom-fields\": \"/project/:project/admin/project-values/custom-fields\",\n \"project-admin-memberships\": \"/project/:project/admin/memberships\",\n \"project-admin-roles\": \"/project/:project/admin/roles\",\n \"project-admin-third-parties-webhooks\": \"/project/:project/admin/third-parties/webhooks\",\n \"project-admin-third-parties-github\": \"/project/:project/admin/third-parties/github\",\n \"project-admin-third-parties-gitlab\": \"/project/:project/admin/third-parties/gitlab\",\n \"project-admin-third-parties-bitbucket\": \"/project/:project/admin/third-parties/bitbucket\",\n \"project-admin-contrib\": \"/project/:project/admin/contrib/:plugin\",\n \"user-settings-user-profile\": \"/user-settings/user-profile\",\n \"user-settings-user-change-password\": \"/user-settings/user-change-password\",\n \"user-settings-user-avatar\": \"/user-settings/user-avatar\",\n \"user-settings-mail-notifications\": \"/user-settings/mail-notifications\"\n };\n\n init = function($log, $navurls) {\n $log.debug(\"Initialize navigation urls\");\n return $navurls.update(urls);\n };\n\n module.run([\"$log\", \"$tgNavUrls\", init]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common.coffee\n */\n\n(function() {\n var AnimationFrame, Capslock, CheckPermissionDirective, ClassPermissionDirective, DataPickerConfig, LimitLineLengthDirective, ProjectUrl, Qqueue, SelectedText, Template, ToggleCommentDirective, module, taiga,\n slice = [].slice;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\", []);\n\n DataPickerConfig = function($translate) {\n return {\n get: function() {\n return {\n i18n: {\n previousMonth: $translate.instant(\"COMMON.PICKERDATE.PREV_MONTH\"),\n nextMonth: $translate.instant(\"COMMON.PICKERDATE.NEXT_MONTH\"),\n months: [$translate.instant(\"COMMON.PICKERDATE.MONTHS.JAN\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.FEB\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.MAR\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.APR\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.MAY\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.JUN\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.JUL\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.AUG\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.SEP\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.OCT\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.NOV\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.DEC\")],\n weekdays: [$translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.SUN\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.MON\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.TUE\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.WED\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.THU\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.FRI\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.SAT\")],\n weekdaysShort: [$translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.SUN\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.MON\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.TUE\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.WED\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.THU\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.FRI\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.SAT\")]\n },\n isRTL: $translate.instant(\"COMMON.PICKERDATE.IS_RTL\") === \"true\",\n firstDay: parseInt($translate.instant(\"COMMON.PICKERDATE.FIRST_DAY_OF_WEEK\"), 10),\n format: $translate.instant(\"COMMON.PICKERDATE.FORMAT\")\n };\n }\n };\n };\n\n module.factory(\"tgDatePickerConfigService\", [\"$translate\", DataPickerConfig]);\n\n SelectedText = function($window, $document) {\n var get;\n get = function() {\n if ($window.getSelection) {\n return $window.getSelection().toString();\n } else if ($document.selection) {\n return $document.selection.createRange().text;\n }\n return \"\";\n };\n return {\n get: get\n };\n };\n\n module.factory(\"$selectedText\", [\"$window\", \"$document\", SelectedText]);\n\n CheckPermissionDirective = function(projectService) {\n var link, render;\n render = function($el, project, permission) {\n if (project && permission) {\n if (project.get('my_permissions').indexOf(permission) > -1) {\n return $el.removeClass('hidden');\n }\n }\n };\n link = function($scope, $el, $attrs) {\n var permission, unObserve, unwatch;\n $el.addClass('hidden');\n permission = $attrs.tgCheckPermission;\n unwatch = $scope.$watch(function() {\n return projectService.project;\n }, function() {\n if (!projectService.project) {\n return;\n }\n render($el, projectService.project, permission);\n return unwatch();\n });\n unObserve = $attrs.$observe(\"tgCheckPermission\", function(permission) {\n if (!permission) {\n return;\n }\n render($el, projectService.project, permission);\n return unObserve();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n CheckPermissionDirective.$inject = [\"tgProjectService\"];\n\n module.directive(\"tgCheckPermission\", CheckPermissionDirective);\n\n ClassPermissionDirective = function() {\n var link, name;\n name = \"tgClassPermission\";\n link = function($scope, $el, $attrs) {\n var checkPermissions, tgClassPermissionWatchAction, unbindWatcher;\n checkPermissions = function(project, className, permission) {\n var negation;\n negation = permission[0] === \"!\";\n if (negation) {\n permission = permission.slice(1);\n }\n if (negation && project.my_permissions.indexOf(permission) === -1) {\n return $el.addClass(className);\n } else if (!negation && project.my_permissions.indexOf(permission) !== -1) {\n return $el.addClass(className);\n } else {\n return $el.removeClass(className);\n }\n };\n tgClassPermissionWatchAction = function(project) {\n var className, classes, permission, results;\n if (project) {\n unbindWatcher();\n classes = $scope.$eval($attrs[name]);\n results = [];\n for (className in classes) {\n permission = classes[className];\n results.push(checkPermissions(project, className, permission));\n }\n return results;\n }\n };\n return unbindWatcher = $scope.$watch(\"project\", tgClassPermissionWatchAction);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgClassPermission\", ClassPermissionDirective);\n\n AnimationFrame = function() {\n var add, animationFrame, performAnimation, tail;\n animationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;\n performAnimation = (function(_this) {\n return function(time) {\n var fn;\n fn = tail.shift();\n fn();\n if (tail.length) {\n return animationFrame(performAnimation);\n }\n };\n })(this);\n tail = [];\n add = function() {\n var fn, i, len, results;\n results = [];\n for (i = 0, len = arguments.length; i < len; i++) {\n fn = arguments[i];\n tail.push(fn);\n if (tail.length === 1) {\n results.push(animationFrame(performAnimation));\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n return {\n add: add\n };\n };\n\n module.factory(\"animationFrame\", AnimationFrame);\n\n ToggleCommentDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $el.find(\"textarea\").on(\"focus\", function() {\n return $el.addClass(\"active\");\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgToggleComment\", ToggleCommentDirective);\n\n ProjectUrl = function($navurls) {\n var get;\n get = function(project) {\n var ctx;\n ctx = {\n project: project.slug\n };\n if (project.is_backlog_activated && project.my_permissions.indexOf(\"view_us\") > -1) {\n return $navurls.resolve(\"project-backlog\", ctx);\n }\n if (project.is_kanban_activated && project.my_permissions.indexOf(\"view_us\") > -1) {\n return $navurls.resolve(\"project-kanban\", ctx);\n }\n if (project.is_wiki_activated && project.my_permissions.indexOf(\"view_wiki_pages\") > -1) {\n return $navurls.resolve(\"project-wiki\", ctx);\n }\n if (project.is_issues_activated && project.my_permissions.indexOf(\"view_issues\") > -1) {\n return $navurls.resolve(\"project-issues\", ctx);\n }\n return $navurls.resolve(\"project\", ctx);\n };\n return {\n get: get\n };\n };\n\n module.factory(\"$projectUrl\", [\"$tgNavUrls\", ProjectUrl]);\n\n LimitLineLengthDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var maxColsPerLine;\n maxColsPerLine = parseInt($el.attr(\"cols\"));\n return $el.on(\"keyup\", function(event) {\n var code, lines;\n code = event.keyCode;\n lines = $el.val().split(\"\\n\");\n _.each(lines, function(line, index) {\n return lines[index] = line.substring(0, maxColsPerLine - 2);\n });\n return $el.val(lines.join(\"\\n\"));\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLimitLineLength\", LimitLineLengthDirective);\n\n Qqueue = function($q) {\n var deferred, lastPromise, qqueue;\n deferred = $q.defer();\n deferred.resolve();\n lastPromise = deferred.promise;\n qqueue = {\n bindAdd: (function(_this) {\n return function(fn) {\n return function() {\n var args;\n args = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n return lastPromise = lastPromise.then(function() {\n return fn.apply(_this, args);\n });\n };\n return qqueue;\n };\n })(this),\n add: (function(_this) {\n return function(fn) {\n if (!lastPromise) {\n lastPromise = fn();\n } else {\n lastPromise = lastPromise.then(fn);\n }\n return qqueue;\n };\n })(this)\n };\n return qqueue;\n };\n\n module.factory(\"$tgQqueue\", [\"$q\", Qqueue]);\n\n Template = function($templateCache) {\n return {\n get: (function(_this) {\n return function(name, lodash) {\n var tmp;\n if (lodash == null) {\n lodash = false;\n }\n tmp = $templateCache.get(name);\n if (lodash) {\n tmp = _.template(tmp);\n }\n return tmp;\n };\n })(this)\n };\n };\n\n module.factory(\"$tgTemplate\", [\"$templateCache\", Template]);\n\n Capslock = function($translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var hideIcon, open, showIcon, warningIcon;\n open = false;\n warningIcon = $('
').addClass('icon').addClass('icon-capslock').attr('title', $translate.instant('COMMON.CAPSLOCK_WARNING'));\n hideIcon = function() {\n return warningIcon.fadeOut(function() {\n open = false;\n return $(this).remove();\n });\n };\n showIcon = function(e) {\n var element;\n if (open) {\n return;\n }\n element = e.currentTarget;\n $(element).parent().append(warningIcon);\n $('.icon-capslock').fadeIn();\n return open = true;\n };\n $el.on('blur', function(e) {\n return hideIcon();\n });\n $el.on('keyup.capslock, focus', function(e) {\n if ($el.val() === $el.val().toLowerCase()) {\n return hideIcon(e);\n } else {\n return showIcon(e);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off('.capslock');\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgCapslock\", [\"$translate\", Capslock]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/events.coffee\n */\n\n(function() {\n var EventsProvider, EventsService, bindMethods, module, startswith, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n taiga = this.taiga;\n\n startswith = this.taiga.startswith;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaEvents\", []);\n\n EventsService = (function() {\n function EventsService(win, log, config, auth, liveAnnouncementService1, rootScope) {\n this.win = win;\n this.log = log;\n this.config = config;\n this.auth = auth;\n this.liveAnnouncementService = liveAnnouncementService1;\n this.rootScope = rootScope;\n this.processMessage = bind(this.processMessage, this);\n bindMethods(this);\n }\n\n EventsService.prototype.initialize = function(sessionId) {\n this.sessionId = sessionId;\n this.subscriptions = {};\n this.connected = false;\n this.error = false;\n this.pendingMessages = [];\n this.missedHeartbeats = 0;\n this.heartbeatInterval = null;\n if (this.win.WebSocket === void 0) {\n return this.log.info(\"WebSockets not supported on your browser\");\n }\n };\n\n EventsService.prototype.setupConnection = function() {\n var loc, path, scheme, url;\n this.stopExistingConnection();\n url = this.config.get(\"eventsUrl\");\n if (!url) {\n return;\n }\n if (!startswith(url, \"ws:\") && !startswith(url, \"wss:\")) {\n loc = this.win.location;\n scheme = loc.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n path = _.str.ltrim(url, \"/\");\n url = scheme + \"//\" + loc.host + \"/\" + path;\n }\n this.ws = new this.win.WebSocket(url);\n this.ws.addEventListener(\"open\", this.onOpen);\n this.ws.addEventListener(\"message\", this.onMessage);\n this.ws.addEventListener(\"error\", this.onError);\n return this.ws.addEventListener(\"close\", this.onClose);\n };\n\n EventsService.prototype.stopExistingConnection = function() {\n if (this.ws === void 0) {\n return;\n }\n this.ws.removeEventListener(\"open\", this.onOpen);\n this.ws.removeEventListener(\"close\", this.onClose);\n this.ws.removeEventListener(\"error\", this.onError);\n this.ws.removeEventListener(\"message\", this.onMessage);\n this.stopHeartBeatMessages();\n this.ws.close();\n return delete this.ws;\n };\n\n EventsService.prototype.notifications = function() {\n return this.subscribe(null, 'notifications', (function(_this) {\n return function(data) {\n _this.liveAnnouncementService.show(data.title, data.desc);\n return _this.rootScope.$digest();\n };\n })(this));\n };\n\n EventsService.prototype.startHeartBeatMessages = function() {\n var heartbeatIntervalTime, maxMissedHeartbeats;\n if (this.heartbeatInterval) {\n return;\n }\n maxMissedHeartbeats = this.config.get(\"eventsMaxMissedHeartbeats\", 5);\n heartbeatIntervalTime = this.config.get(\"eventsHeartbeatIntervalTime\", 60000);\n this.missedHeartbeats = 0;\n this.heartbeatInterval = setInterval((function(_this) {\n return function() {\n var e, error1;\n try {\n if (_this.missedHeartbeats >= maxMissedHeartbeats) {\n throw new Error(\"Too many missed heartbeats PINGs.\");\n }\n _this.missedHeartbeats++;\n _this.sendMessage({\n cmd: \"ping\"\n });\n return _this.log.debug(\"HeartBeat send PING\");\n } catch (error1) {\n e = error1;\n _this.log.error(\"HeartBeat error: \" + e.message);\n return _this.stopHeartBeatMessages();\n }\n };\n })(this), heartbeatIntervalTime);\n return this.log.debug(\"HeartBeat enabled\");\n };\n\n EventsService.prototype.stopHeartBeatMessages = function() {\n if (!this.heartbeatInterval) {\n return;\n }\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n return this.log.debug(\"HeartBeat disabled\");\n };\n\n EventsService.prototype.processHeartBeatPongMessage = function(data) {\n this.missedHeartbeats = 0;\n return this.log.debug(\"HeartBeat recived PONG\");\n };\n\n EventsService.prototype.serialize = function(message) {\n if (_.isObject(message)) {\n return JSON.stringify(message);\n }\n return message;\n };\n\n EventsService.prototype.sendMessage = function(message) {\n var i, len, messages, msg, results;\n this.pendingMessages.push(message);\n if (!this.connected) {\n return;\n }\n messages = _.map(this.pendingMessages, this.serialize);\n this.pendingMessages = [];\n results = [];\n for (i = 0, len = messages.length; i < len; i++) {\n msg = messages[i];\n results.push(this.ws.send(msg));\n }\n return results;\n };\n\n EventsService.prototype.processMessage = function(data) {\n var routingKey, subscription;\n routingKey = data.routing_key;\n if (this.subscriptions[routingKey] == null) {\n return;\n }\n subscription = this.subscriptions[routingKey];\n if (subscription.scope) {\n return subscription.scope.$apply(function() {\n return subscription.callback(data.data);\n });\n } else {\n return subscription.callback(data.data);\n }\n };\n\n EventsService.prototype.subscribe = function(scope, routingKey, callback) {\n var message, subscription;\n if (this.error) {\n return;\n }\n this.log.debug(\"Subscribe to: \" + routingKey);\n subscription = {\n scope: scope,\n routingKey: routingKey,\n callback: _.debounce(callback, 500, {\n \"leading\": true,\n \"trailing\": false\n })\n };\n message = {\n \"cmd\": \"subscribe\",\n \"routing_key\": routingKey\n };\n this.subscriptions[routingKey] = subscription;\n this.sendMessage(message);\n if (scope) {\n return scope.$on(\"$destroy\", (function(_this) {\n return function() {\n return _this.unsubscribe(routingKey);\n };\n })(this));\n }\n };\n\n EventsService.prototype.unsubscribe = function(routingKey) {\n var message;\n if (this.error) {\n return;\n }\n this.log.debug(\"Unsubscribe from: \" + routingKey);\n message = {\n \"cmd\": \"unsubscribe\",\n \"routing_key\": routingKey\n };\n return this.sendMessage(message);\n };\n\n EventsService.prototype.onOpen = function() {\n var message, token;\n this.connected = true;\n this.startHeartBeatMessages();\n this.notifications();\n this.log.debug(\"WebSocket connection opened\");\n token = this.auth.getToken();\n message = {\n cmd: \"auth\",\n data: {\n token: token,\n sessionId: this.sessionId\n }\n };\n return this.sendMessage(message);\n };\n\n EventsService.prototype.onMessage = function(event) {\n var data;\n this.log.debug(\"WebSocket message received: \" + event.data);\n data = JSON.parse(event.data);\n if (data.cmd === \"pong\") {\n return this.processHeartBeatPongMessage(data);\n } else {\n return this.processMessage(data);\n }\n };\n\n EventsService.prototype.onError = function(error) {\n this.log.error(\"WebSocket error: \" + error);\n return this.error = true;\n };\n\n EventsService.prototype.onClose = function() {\n this.log.debug(\"WebSocket closed.\");\n this.connected = false;\n return this.stopHeartBeatMessages();\n };\n\n return EventsService;\n\n })();\n\n EventsProvider = (function() {\n function EventsProvider() {}\n\n EventsProvider.prototype.setSessionId = function(sessionId) {\n return this.sessionId = sessionId;\n };\n\n EventsProvider.prototype.$get = function($win, $log, $conf, $auth, liveAnnouncementService, $rootScope) {\n var service;\n service = new EventsService($win, $log, $conf, $auth, liveAnnouncementService, $rootScope);\n service.initialize(this.sessionId);\n return service;\n };\n\n EventsProvider.prototype.$get.$inject = [\"$window\", \"$log\", \"$tgConfig\", \"$tgAuth\", \"tgLiveAnnouncementService\", \"$rootScope\"];\n\n return EventsProvider;\n\n })();\n\n module.provider(\"$tgEvents\", EventsProvider);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/feedback.coffee\n */\n\n(function() {\n var FeedbackDirective, bindOnce, debounce, groupBy, mixOf, module, taiga, trim;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n mixOf = this.taiga.mixOf;\n\n debounce = this.taiga.debounce;\n\n trim = this.taiga.trim;\n\n module = angular.module(\"taigaFeedback\", []);\n\n FeedbackDirective = function($lightboxService, $repo, $confirm, $loading, feedbackService) {\n var directive, link;\n link = function($scope, $el, $attrs) {\n var form, openLightbox, submit, submitButton;\n form = $el.find(\"form\").checksley();\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.create(\"feedback\", $scope.feedback);\n promise.then(function(data) {\n currentLoading.finish();\n $lightboxService.close($el);\n return $confirm.notify(\"success\", \"\\\\o/ we'll be happy to read your\");\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n openLightbox = function() {\n $scope.feedback = {};\n $lightboxService.open($el);\n return $el.find(\"textarea\").focus();\n };\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return openLightbox();\n };\n directive = {\n link: link,\n templateUrl: \"common/lightbox-feedback.html\",\n scope: {}\n };\n return directive;\n };\n\n module.directive(\"tgLbFeedback\", [\"lightboxService\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"tgFeedbackService\", FeedbackDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/integrations.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaIntegrations\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaIssues\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/kanban.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaKanban\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaPlugins\", [\"ngRoute\"]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/projects.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaProject\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/related-tasks.coffee\n */\n\n(function() {\n var RelatedTaskAssignedToInlineEditionDirective, RelatedTaskCreateButtonDirective, RelatedTaskCreateFormDirective, RelatedTaskRowDirective, RelatedTasksDirective, debounce, module, taiga, trim;\n\n taiga = this.taiga;\n\n trim = this.taiga.trim;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaRelatedTasks\", []);\n\n RelatedTaskRowDirective = function($repo, $compile, $confirm, $rootscope, $loading, $template, $translate) {\n var link, templateEdit, templateView;\n templateView = $template.get(\"task/related-task-row.html\", true);\n templateEdit = $template.get(\"task/related-task-row-edit.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var renderEdit, renderView, saveTask;\n saveTask = debounce(2000, function(task) {\n var currentLoading, promise;\n task.subject = $el.find('input').val();\n currentLoading = $loading().target($el.find('.task-name')).start();\n promise = $repo.save(task);\n promise.then((function(_this) {\n return function() {\n currentLoading.finish();\n return $rootscope.$broadcast(\"related-tasks:update\");\n };\n })(this));\n promise.then(null, (function(_this) {\n return function() {\n currentLoading.finish();\n $el.find('input').val(task.subject);\n return $confirm.notify(\"error\");\n };\n })(this));\n return promise;\n });\n renderEdit = function(task) {\n $el.html($compile(templateEdit({\n task: task\n }))($scope));\n $el.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === 13) {\n return saveTask($model.$modelValue).then(function() {\n return renderView($model.$modelValue);\n });\n } else if (event.keyCode === 27) {\n return renderView($model.$modelValue);\n }\n });\n $el.on(\"click\", \".icon-floppy\", function(event) {\n return saveTask($model.$modelValue).then(function() {\n return renderView($model.$modelValue);\n });\n });\n return $el.on(\"click\", \".cancel-edit\", function(event) {\n return renderView($model.$modelValue);\n });\n };\n renderView = function(task) {\n var perms;\n $el.off();\n perms = {\n modify_task: $scope.project.my_permissions.indexOf(\"modify_task\") !== -1,\n delete_task: $scope.project.my_permissions.indexOf(\"delete_task\") !== -1\n };\n $el.html($compile(templateView({\n task: task,\n perms: perms\n }))($scope));\n $el.on(\"click\", \".icon-edit\", function() {\n renderEdit($model.$modelValue);\n return $el.find('input').focus().select();\n });\n return $el.on(\"click\", \".delete-task\", function(event) {\n var message, title;\n title = $translate.instant(\"TASK.TITLE_DELETE_ACTION\");\n task = $model.$modelValue;\n message = task.subject;\n return $confirm.askOnDelete(title, message).then(function(askResponse) {\n var promise;\n promise = $repo.remove(task);\n promise.then(function() {\n askResponse.finish();\n return $scope.$emit(\"related-tasks:delete\");\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n });\n });\n });\n };\n $scope.$watch($attrs.ngModel, function(val) {\n if (!val) {\n return;\n }\n return renderView(val);\n });\n $scope.$on(\"related-tasks:assigned-to-changed\", function() {\n return $rootscope.$broadcast(\"related-tasks:update\");\n });\n $scope.$on(\"related-tasks:status-changed\", function() {\n return $rootscope.$broadcast(\"related-tasks:update\");\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgRelatedTaskRow\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$rootScope\", \"$tgLoading\", \"$tgTemplate\", \"$translate\", RelatedTaskRowDirective]);\n\n RelatedTaskCreateFormDirective = function($repo, $compile, $confirm, $tgmodel, $loading, $analytics, $template) {\n var link, newTask, template;\n template = $template.get(\"task/related-task-create-form.html\", true);\n newTask = {\n subject: \"\",\n assigned_to: null\n };\n link = function($scope, $el, $attrs) {\n var close, createTask, render;\n createTask = debounce(2000, function(task) {\n var currentLoading, promise;\n task.subject = $el.find('input').val();\n task.assigned_to = $scope.newTask.assigned_to;\n task.status = $scope.newTask.status;\n $scope.newTask.status = $scope.project.default_task_status;\n $scope.newTask.assigned_to = null;\n currentLoading = $loading().target($el.find('.task-name')).start();\n promise = $repo.create(\"tasks\", task);\n promise.then(function() {\n $analytics.trackEvent(\"task\", \"create\", \"create task on userstory\", 1);\n currentLoading.finish();\n return $scope.$emit(\"related-tasks:add\");\n });\n promise.then(null, function() {\n $el.find('input').val(task.subject);\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n return promise;\n });\n close = function() {\n $el.off();\n $el.html(\"\");\n return $scope.newRelatedTaskFormOpen = false;\n };\n render = function() {\n $scope.newRelatedTaskFormOpen = true;\n $el.html($compile(template())($scope));\n $el.find('input').focus().select();\n $el.addClass('active');\n $el.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === 13) {\n return createTask(newTask).then(function() {\n return render();\n });\n } else if (event.keyCode === 27) {\n return $scope.$apply(function() {\n return close();\n });\n }\n });\n $el.on(\"click\", \".icon-delete\", function(event) {\n return $scope.$apply(function() {\n return close();\n });\n });\n return $el.on(\"click\", \".icon-floppy\", function(event) {\n return createTask(newTask).then(function() {\n return close();\n });\n });\n };\n taiga.bindOnce($scope, \"us\", function(val) {\n newTask[\"status\"] = $scope.project.default_task_status;\n newTask[\"project\"] = $scope.project.id;\n newTask[\"user_story\"] = $scope.us.id;\n $scope.newTask = $tgmodel.make_model(\"tasks\", newTask);\n return $el.html(\"\");\n });\n $scope.$on(\"related-tasks:show-form\", function() {\n return render();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRelatedTaskCreateForm\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$tgModel\", \"$tgLoading\", \"$tgAnalytics\", \"$tgTemplate\", RelatedTaskCreateFormDirective]);\n\n RelatedTaskCreateButtonDirective = function($repo, $compile, $confirm, $tgmodel, $template) {\n var link, template;\n template = $template.get(\"common/components/add-button.html\", true);\n link = function($scope, $el, $attrs) {\n $scope.$watch(\"project\", function(val) {\n if (!val) {\n return;\n }\n $el.off();\n if ($scope.project.my_permissions.indexOf(\"add_task\") !== -1) {\n $el.html($compile(template())($scope));\n } else {\n $el.html(\"\");\n }\n return $el.on(\"click\", \".add-button\", function(event) {\n return $scope.$emit(\"related-tasks:add-new-clicked\");\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRelatedTaskCreateButton\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$tgModel\", \"$tgTemplate\", RelatedTaskCreateButtonDirective]);\n\n RelatedTasksDirective = function($repo, $rs, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n var loadTasks;\n loadTasks = function() {\n return $rs.tasks.list($scope.projectId, null, $scope.usId).then((function(_this) {\n return function(tasks) {\n $scope.tasks = _.sortBy(tasks, 'ref');\n return tasks;\n };\n })(this));\n };\n $scope.$on(\"related-tasks:add\", function() {\n return loadTasks().then(function() {\n return $rootscope.$broadcast(\"related-tasks:update\");\n });\n });\n $scope.$on(\"related-tasks:delete\", function() {\n return loadTasks().then(function() {\n return $rootscope.$broadcast(\"related-tasks:update\");\n });\n });\n $scope.$on(\"related-tasks:add-new-clicked\", function() {\n return $scope.$broadcast(\"related-tasks:show-form\");\n });\n taiga.bindOnce($scope, \"us\", function(val) {\n return loadTasks();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRelatedTasks\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", RelatedTasksDirective]);\n\n RelatedTaskAssignedToInlineEditionDirective = function($repo, $rootscope, $translate) {\n var link, template;\n template = _.template(\"\\\" alt=\\\"<%- name %>\\\"/>\\n
<%- name %>
\");\n link = function($scope, $el, $attrs) {\n var $ctrl, autoSave, notAutoSave, task, updateRelatedTask;\n updateRelatedTask = function(task) {\n var ctx, member;\n ctx = {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\"),\n imgurl: \"/\" + window._version + \"/images/unnamed.png\"\n };\n member = $scope.usersById[task.assigned_to];\n if (member) {\n ctx.imgurl = member.photo;\n ctx.name = member.full_name_display;\n }\n $el.find(\".avatar\").html(template(ctx));\n return $el.find(\".task-assignedto\").attr('title', ctx.name);\n };\n $ctrl = $el.controller();\n task = $scope.$eval($attrs.tgRelatedTaskAssignedToInlineEdition);\n notAutoSave = $scope.$eval($attrs.notAutoSave);\n autoSave = !notAutoSave;\n updateRelatedTask(task);\n $el.on(\"click\", \".task-assignedto\", function(event) {\n return $rootscope.$broadcast(\"assigned-to:add\", task);\n });\n taiga.bindOnce($scope, \"project\", function(project) {\n if (project.my_permissions.indexOf(\"modify_task\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n $scope.$on(\"assigned-to:added\", debounce(2000, (function(_this) {\n return function(ctx, userId, updatedRelatedTask) {\n if (updatedRelatedTask.id === task.id) {\n updatedRelatedTask.assigned_to = userId;\n if (autoSave) {\n $repo.save(updatedRelatedTask).then(function() {\n return $scope.$emit(\"related-tasks:assigned-to-changed\");\n });\n }\n return updateRelatedTask(updatedRelatedTask);\n }\n };\n })(this)));\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRelatedTaskAssignedToInlineEdition\", [\"$tgRepo\", \"$rootScope\", \"$translate\", RelatedTaskAssignedToInlineEditionDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources.coffee\n */\n\n(function() {\n var ResourcesService, initResources, initUrls, module, taiga, urls,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n ResourcesService = (function(superClass) {\n extend(ResourcesService, superClass);\n\n function ResourcesService() {\n return ResourcesService.__super__.constructor.apply(this, arguments);\n }\n\n return ResourcesService;\n\n })(taiga.Service);\n\n urls = {\n \"auth\": \"/auth\",\n \"auth-register\": \"/auth/register\",\n \"invitations\": \"/invitations\",\n \"users\": \"/users\",\n \"by_username\": \"/users/by_username\",\n \"users-password-recovery\": \"/users/password_recovery\",\n \"users-change-password-from-recovery\": \"/users/change_password_from_recovery\",\n \"users-change-password\": \"/users/change_password\",\n \"users-change-email\": \"/users/change_email\",\n \"users-cancel-account\": \"/users/cancel\",\n \"user-stats\": \"/users/%s/stats\",\n \"user-liked\": \"/users/%s/liked\",\n \"user-voted\": \"/users/%s/voted\",\n \"user-watched\": \"/users/%s/watched\",\n \"user-contacts\": \"/users/%s/contacts\",\n \"permissions\": \"/permissions\",\n \"notify-policies\": \"/notify-policies\",\n \"user-storage\": \"/user-storage\",\n \"memberships\": \"/memberships\",\n \"bulk-create-memberships\": \"/memberships/bulk_create\",\n \"roles\": \"/roles\",\n \"permissions\": \"/permissions\",\n \"resolver\": \"/resolver\",\n \"projects\": \"/projects\",\n \"project-templates\": \"/project-templates\",\n \"project-modules\": \"/projects/%s/modules\",\n \"bulk-update-projects-order\": \"/projects/bulk_update_order\",\n \"project-like\": \"/projects/%s/like\",\n \"project-unlike\": \"/projects/%s/unlike\",\n \"project-watch\": \"/projects/%s/watch\",\n \"project-unwatch\": \"/projects/%s/unwatch\",\n \"userstory-statuses\": \"/userstory-statuses\",\n \"points\": \"/points\",\n \"task-statuses\": \"/task-statuses\",\n \"issue-statuses\": \"/issue-statuses\",\n \"issue-types\": \"/issue-types\",\n \"priorities\": \"/priorities\",\n \"severities\": \"/severities\",\n \"milestones\": \"/milestones\",\n \"userstories\": \"/userstories\",\n \"bulk-create-us\": \"/userstories/bulk_create\",\n \"bulk-update-us-backlog-order\": \"/userstories/bulk_update_backlog_order\",\n \"bulk-update-us-sprint-order\": \"/userstories/bulk_update_sprint_order\",\n \"bulk-update-us-kanban-order\": \"/userstories/bulk_update_kanban_order\",\n \"userstories-filters\": \"/userstories/filters_data\",\n \"userstory-upvote\": \"/userstories/%s/upvote\",\n \"userstory-downvote\": \"/userstories/%s/downvote\",\n \"userstory-watch\": \"/userstories/%s/watch\",\n \"userstory-unwatch\": \"/userstories/%s/unwatch\",\n \"tasks\": \"/tasks\",\n \"bulk-create-tasks\": \"/tasks/bulk_create\",\n \"bulk-update-task-taskboard-order\": \"/tasks/bulk_update_taskboard_order\",\n \"task-upvote\": \"/tasks/%s/upvote\",\n \"task-downvote\": \"/tasks/%s/downvote\",\n \"task-watch\": \"/tasks/%s/watch\",\n \"task-unwatch\": \"/tasks/%s/unwatch\",\n \"issues\": \"/issues\",\n \"bulk-create-issues\": \"/issues/bulk_create\",\n \"issues-filters\": \"/issues/filters_data\",\n \"issue-upvote\": \"/issues/%s/upvote\",\n \"issue-downvote\": \"/issues/%s/downvote\",\n \"issue-watch\": \"/issues/%s/watch\",\n \"issue-unwatch\": \"/issues/%s/unwatch\",\n \"wiki\": \"/wiki\",\n \"wiki-restore\": \"/wiki/%s/restore\",\n \"wiki-links\": \"/wiki-links\",\n \"history/us\": \"/history/userstory\",\n \"history/issue\": \"/history/issue\",\n \"history/task\": \"/history/task\",\n \"history/wiki\": \"/history/wiki\",\n \"attachments/us\": \"/userstories/attachments\",\n \"attachments/issue\": \"/issues/attachments\",\n \"attachments/task\": \"/tasks/attachments\",\n \"attachments/wiki_page\": \"/wiki/attachments\",\n \"custom-attributes/userstory\": \"/userstory-custom-attributes\",\n \"custom-attributes/issue\": \"/issue-custom-attributes\",\n \"custom-attributes/task\": \"/task-custom-attributes\",\n \"custom-attributes-values/userstory\": \"/userstories/custom-attributes-values\",\n \"custom-attributes-values/issue\": \"/issues/custom-attributes-values\",\n \"custom-attributes-values/task\": \"/tasks/custom-attributes-values\",\n \"webhooks\": \"/webhooks\",\n \"webhooks-test\": \"/webhooks/%s/test\",\n \"webhooklogs\": \"/webhooklogs\",\n \"webhooklogs-resend\": \"/webhooklogs/%s/resend\",\n \"userstories-csv\": \"/userstories/csv?uuid=%s\",\n \"tasks-csv\": \"/tasks/csv?uuid=%s\",\n \"issues-csv\": \"/issues/csv?uuid=%s\",\n \"timeline-profile\": \"/timeline/profile\",\n \"timeline-user\": \"/timeline/user\",\n \"timeline-project\": \"/timeline/project\",\n \"search\": \"/search\",\n \"exporter\": \"/exporter\",\n \"importer\": \"/importer/load_dump\",\n \"feedback\": \"/feedback\",\n \"locales\": \"/locales\",\n \"applications\": \"/applications\",\n \"application-tokens\": \"/application-tokens\",\n \"stats-discover\": \"/stats/discover\"\n };\n\n initUrls = function($log, $urls) {\n $log.debug(\"Initialize api urls\");\n return $urls.update(urls);\n };\n\n initResources = function($log, $rs) {\n var i, len, provider, providers, results;\n $log.debug(\"Initialize resources\");\n providers = _.toArray(arguments).slice(2);\n results = [];\n for (i = 0, len = providers.length; i < len; i++) {\n provider = providers[i];\n results.push(provider($rs));\n }\n return results;\n };\n\n module = angular.module(\"taigaResources\", [\"taigaBase\"]);\n\n module.service(\"$tgResources\", ResourcesService);\n\n module.run([\"$log\", \"$tgUrls\", initUrls]);\n\n module.run([\"$log\", \"$tgResources\", \"$tgProjectsResourcesProvider\", \"$tgCustomAttributesResourcesProvider\", \"$tgCustomAttributesValuesResourcesProvider\", \"$tgMembershipsResourcesProvider\", \"$tgNotifyPoliciesResourcesProvider\", \"$tgInvitationsResourcesProvider\", \"$tgRolesResourcesProvider\", \"$tgUserSettingsResourcesProvider\", \"$tgSprintsResourcesProvider\", \"$tgUserstoriesResourcesProvider\", \"$tgTasksResourcesProvider\", \"$tgIssuesResourcesProvider\", \"$tgWikiResourcesProvider\", \"$tgSearchResourcesProvider\", \"$tgMdRenderResourcesProvider\", \"$tgHistoryResourcesProvider\", \"$tgKanbanResourcesProvider\", \"$tgModulesResourcesProvider\", \"$tgWebhooksResourcesProvider\", \"$tgWebhookLogsResourcesProvider\", \"$tgLocalesResourcesProvider\", \"$tgUsersResourcesProvider\", initResources]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/search.coffee\n */\n\n(function() {\n var SearchBoxDirective, SearchController, SearchDirective, bindOnce, debounce, debounceLeading, groupBy, mixOf, module, taiga, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n mixOf = this.taiga.mixOf;\n\n debounceLeading = this.taiga.debounceLeading;\n\n trim = this.taiga.trim;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaSearch\", []);\n\n SearchController = (function(superClass) {\n extend(SearchController, superClass);\n\n SearchController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"tgAppMetaService\", \"$tgNavUrls\", \"$translate\"];\n\n function SearchController(scope1, repo, rs, params, q, location, appMetaService, navUrls, translate) {\n var loadSearchData, promise;\n this.scope = scope1;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.translate = translate;\n this.scope.sectionName = \"Search\";\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"SEARCH.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.translate.instant(\"SEARCH.PAGE_DESCRIPTION\", {\n projectName: _this.scope.project.name,\n projectDescription: _this.scope.project.description\n });\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.searchTerm = null;\n loadSearchData = debounceLeading(100, (function(_this) {\n return function(t) {\n return _this.loadSearchData(t);\n };\n })(this));\n bindOnce(this.scope, \"projectId\", (function(_this) {\n return function(projectId) {\n if (!_this.scope.searchResults && _this.scope.searchTerm) {\n return _this.loadSearchData();\n }\n };\n })(this));\n this.scope.$watch(\"searchTerm\", (function(_this) {\n return function(term) {\n if (term !== void 0 && _this.scope.projectId) {\n return _this.loadSearchData(term);\n }\n };\n })(this));\n }\n\n SearchController.prototype.loadFilters = function() {\n var defered;\n defered = this.q.defer();\n defered.resolve();\n return defered.promise;\n };\n\n SearchController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n _this.scope.issueStatusById = groupBy(project.issue_statuses, function(x) {\n return x.id;\n });\n _this.scope.taskStatusById = groupBy(project.task_statuses, function(x) {\n return x.id;\n });\n _this.scope.severityById = groupBy(project.severities, function(x) {\n return x.id;\n });\n _this.scope.priorityById = groupBy(project.priorities, function(x) {\n return x.id;\n });\n _this.scope.usStatusById = groupBy(project.us_statuses, function(x) {\n return x.id;\n });\n return project;\n };\n })(this));\n };\n\n SearchController.prototype.loadSearchData = function(term) {\n if (term == null) {\n term = \"\";\n }\n this.scope.loading = true;\n return this._loadSearchData(term).then((function(_this) {\n return function(data) {\n _this.scope.searchResults = data;\n return _this.scope.loading = false;\n };\n })(this));\n };\n\n SearchController.prototype._loadSearchData = function(term) {\n if (term == null) {\n term = \"\";\n }\n if (this._promise) {\n this._promise.abort();\n }\n this._promise = this.rs.search[\"do\"](this.scope.projectId, term);\n return this._promise;\n };\n\n SearchController.prototype.loadInitialData = function() {\n return this.loadProject().then((function(_this) {\n return function(project) {\n _this.scope.projectId = project.id;\n return _this.fillUsersAndRoles(project.members, project.roles);\n };\n })(this));\n };\n\n return SearchController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"SearchController\", SearchController);\n\n SearchBoxDirective = function(projectService, $lightboxService, $navurls, $location, $route) {\n var link;\n link = function($scope, $el, $attrs) {\n var openLightbox, project, submit;\n project = null;\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var form, text, url;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n text = $el.find(\"#search-text\").val();\n url = $navurls.resolve(\"project-search\", {\n project: project.get(\"slug\")\n });\n return $scope.$apply(function() {\n $lightboxService.close($el);\n $location.path(url);\n $location.search(\"text\", text).path(url);\n return $route.reload();\n });\n };\n })(this));\n openLightbox = function() {\n project = projectService.project;\n return $lightboxService.open($el).then(function() {\n return $el.find(\"#search-text\").focus();\n });\n };\n $el.on(\"submit\", \"form\", submit);\n return openLightbox();\n };\n return {\n templateUrl: \"search/lightbox-search.html\",\n link: link\n };\n };\n\n SearchBoxDirective.$inject = [\"tgProjectService\", \"lightboxService\", \"$tgNavUrls\", \"$tgLocation\", \"$route\"];\n\n module.directive(\"tgSearchBox\", SearchBoxDirective);\n\n SearchDirective = function($log, $compile, $templatecache, $routeparams, $location) {\n var link, linkTable;\n linkTable = function($scope, $el, $attrs, $ctrl) {\n var activeSectionName, applyAutoTab, getActiveSection, lastSearchResults, markSectionTabActive, renderFilterTabs, renderTableContent, tabsDom, templates;\n applyAutoTab = true;\n activeSectionName = \"userstories\";\n tabsDom = $el.find(\".search-filter\");\n lastSearchResults = null;\n getActiveSection = function(data) {\n var i, len, maxVal, name, ref, selectedSection, value;\n maxVal = 0;\n selectedSection = {};\n selectedSection.name = \"userstories\";\n selectedSection.value = [];\n if (!applyAutoTab) {\n selectedSection.name = activeSectionName;\n selectedSection.value = data[activeSectionName];\n return selectedSection;\n }\n if (data) {\n ref = [\"userstories\", \"issues\", \"tasks\", \"wikipages\"];\n for (i = 0, len = ref.length; i < len; i++) {\n name = ref[i];\n value = data[name];\n if (value.length > maxVal) {\n maxVal = value.length;\n selectedSection.name = name;\n selectedSection.value = value;\n break;\n }\n }\n }\n if (maxVal === 0) {\n return selectedSection;\n }\n return selectedSection;\n };\n renderFilterTabs = function(data) {\n var name, results, value;\n results = [];\n for (name in data) {\n value = data[name];\n tabsDom.find(\"li.\" + name).show();\n results.push(tabsDom.find(\"li.\" + name + \" .num\").html(value.length));\n }\n return results;\n };\n markSectionTabActive = function(section) {\n tabsDom.find(\"a.active\").removeClass(\"active\");\n tabsDom.find(\"li.\" + section.name + \" a\").addClass(\"active\");\n applyAutoTab = false;\n return activeSectionName = section.name;\n };\n templates = {\n issues: $templatecache.get(\"search-issues\"),\n tasks: $templatecache.get(\"search-tasks\"),\n userstories: $templatecache.get(\"search-userstories\"),\n wikipages: $templatecache.get(\"search-wikipages\")\n };\n renderTableContent = function(section) {\n var element, oldElements, oldScope, scope, template;\n oldElements = $el.find(\".search-result-table\").children();\n oldScope = oldElements.scope();\n if (oldScope) {\n oldScope.$destroy();\n oldElements.remove();\n }\n scope = $scope.$new();\n scope[section.name] = section.value;\n template = angular.element.parseHTML(trim(templates[section.name]));\n element = $compile(template)(scope);\n return $el.find(\".search-result-table\").html(element);\n };\n $scope.$watch(\"searchResults\", function(data) {\n var activeSection;\n lastSearchResults = data;\n if (!lastSearchResults) {\n return;\n }\n activeSection = getActiveSection(data);\n renderFilterTabs(data);\n renderTableContent(activeSection);\n return markSectionTabActive(activeSection);\n });\n $scope.$watch(\"searchTerm\", function(searchTerm) {\n if (searchTerm !== void 0) {\n return $location.search(\"text\", searchTerm);\n }\n });\n return $el.on(\"click\", \".search-filter li > a\", function(event) {\n var section, sectionData, sectionName, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n sectionName = target.parent().data(\"name\");\n sectionData = !lastSearchResults ? [] : lastSearchResults[sectionName];\n section = {\n name: sectionName,\n value: sectionData\n };\n return $scope.$apply(function() {\n renderTableContent(section);\n return markSectionTabActive(section);\n });\n });\n };\n link = function($scope, $el, $attrs) {\n var $ctrl, searchText;\n $ctrl = $el.controller();\n linkTable($scope, $el, $attrs, $ctrl);\n searchText = $routeparams.text;\n return $scope.$watch(\"projectId\", function(projectId) {\n if (projectId != null) {\n return $scope.searchTerm = searchText;\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgSearch\", [\"$log\", \"$compile\", \"$templateCache\", \"$routeParams\", \"$tgLocation\", SearchDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaTaskboard\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/tasks.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaTasks\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/team.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaTeam\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaUserSettings\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/userstories.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaUserStories\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/wiki.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaWiki\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/analytics.coffee\n */\n\n(function() {\n var AnalyticsService, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\");\n\n AnalyticsService = (function(superClass) {\n extend(AnalyticsService, superClass);\n\n AnalyticsService.$inject = [\"$rootScope\", \"$log\", \"$tgConfig\", \"$window\", \"$document\", \"$location\"];\n\n function AnalyticsService(rootscope, log, config, win, doc, location) {\n var conf;\n this.rootscope = rootscope;\n this.log = log;\n this.config = config;\n this.win = win;\n this.doc = doc;\n this.location = location;\n this.initialized = false;\n conf = this.config.get(\"analytics\", {});\n this.accountId = conf.accountId;\n this.pageEvent = conf.pageEvent || \"$routeChangeSuccess\";\n this.trackRoutes = conf.trackRoutes || true;\n this.ignoreFirstPageLoad = conf.ignoreFirstPageLoad || false;\n }\n\n AnalyticsService.prototype.initialize = function() {\n if (!this.accountId) {\n this.log.debug(\"Analytics: no acount id provided. Disabling.\");\n return;\n }\n this.injectAnalytics();\n this.win.ga(\"create\", this.accountId, \"auto\");\n this.win.ga(\"require\", \"displayfeatures\");\n if (this.trackRoutes && (!this.ignoreFirstPageLoad)) {\n this.win.ga(\"send\", \"pageview\", this.getUrl());\n }\n if (this.trackRoutes) {\n this.rootscope.$on(this.pageEvent, (function(_this) {\n return function() {\n return _this.trackPage(_this.getUrl(), \"Taiga\");\n };\n })(this));\n }\n return this.initialized = true;\n };\n\n AnalyticsService.prototype.getUrl = function() {\n return this.location.path();\n };\n\n AnalyticsService.prototype.injectAnalytics = function() {\n var fn;\n fn = (function(i,s,o,g,r,a,m){i[\"GoogleAnalyticsObject\"]=r;i[r]=i[r]||function(){\n (i[r].q=i[r].q||[]).push(arguments);},i[r].l=1*new Date();a=s.createElement(o),\n m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m);});\n return fn(window, document, \"script\", \"//www.google-analytics.com/analytics.js\", \"ga\");\n };\n\n AnalyticsService.prototype.trackPage = function(url, title) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n title = title || this.doc[0].title;\n return this.win.ga(\"send\", \"pageview\", {\n \"page\": url,\n \"title\": title\n });\n };\n\n AnalyticsService.prototype.trackEvent = function(category, action, label, value) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n return this.win.ga(\"send\", \"event\", category, action, label, value);\n };\n\n return AnalyticsService;\n\n })(taiga.Service);\n\n module.service(\"$tgAnalytics\", AnalyticsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: bind-scope.coffee\n */\n\n(function() {\n var BindScope, module;\n\n module = angular.module(\"taigaCommon\");\n\n BindScope = function(config) {\n var link;\n if (!config.debugInfo) {\n jQuery.fn.scope = function() {\n return this.data('scope');\n };\n }\n link = function($scope, $el) {\n if (!config.debugInfo) {\n return $el.data('scope', $scope).addClass('tg-scope');\n }\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBindScope\", [\"$tgConfig\", BindScope]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: compile-html.directive.coffee\n */\n\n(function() {\n var CompileHtmlDirective;\n\n CompileHtmlDirective = function($compile) {\n var link;\n link = function(scope, element, attrs) {\n return scope.$watch(attrs.tgCompileHtml, function(newValue, oldValue) {\n element.html(newValue);\n return $compile(element.contents())(scope);\n });\n };\n return {\n link: link\n };\n };\n\n CompileHtmlDirective.$inject = [\"$compile\"];\n\n angular.module(\"taigaCommon\").directive(\"tgCompileHtml\", CompileHtmlDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/components.coffee\n */\n\n(function() {\n var AssignedToDirective, BlockButtonDirective, CreatedByDisplayDirective, DateRangeDirective, DateSelectorDirective, DeleteButtonDirective, EditableDescriptionDirective, EditableSubjectDirective, EditableWysiwyg, ListItemAssignedtoDirective, ListItemIssueStatusDirective, ListItemPriorityDirective, ListItemSeverityDirective, ListItemTaskStatusDirective, ListItemTypeDirective, ListItemUsStatusDirective, SprintProgressBarDirective, TgMainTitleDirective, TgProgressBarDirective, WatchersDirective, bindOnce, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaCommon\");\n\n DateRangeDirective = function($translate) {\n var link, renderRange;\n renderRange = function($el, first, second) {\n var endDate, initDate, prettyDate;\n prettyDate = $translate.instant(\"BACKLOG.SPRINTS.DATE\");\n initDate = moment(first).format(prettyDate);\n endDate = moment(second).format(prettyDate);\n return $el.html(initDate + \"-\" + endDate);\n };\n link = function($scope, $el, $attrs) {\n var first, ref, second;\n ref = $attrs.tgDateRange.split(\",\"), first = ref[0], second = ref[1];\n return bindOnce($scope, first, function(valFirst) {\n return bindOnce($scope, second, function(valSecond) {\n return renderRange($el, valFirst, valSecond);\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgDateRange\", [\"$translate\", DateRangeDirective]);\n\n DateSelectorDirective = function($rootscope, datePickerConfigService) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var initialize, selectedDate, unbind;\n selectedDate = null;\n initialize = function() {\n var datePickerConfig;\n datePickerConfig = datePickerConfigService.get();\n _.merge(datePickerConfig, {\n field: $el[0],\n onSelect: (function(_this) {\n return function(date) {\n return selectedDate = date;\n };\n })(this),\n onOpen: (function(_this) {\n return function() {\n if (selectedDate != null) {\n return $el.picker.setDate(selectedDate);\n }\n };\n })(this)\n });\n return $el.picker = new Pikaday(datePickerConfig);\n };\n unbind = $rootscope.$on(\"$translateChangeEnd\", (function(_this) {\n return function(ctx) {\n return initialize();\n };\n })(this));\n $scope.$watch($attrs.ngModel, function(val) {\n if ((val != null) && !$el.picker) {\n initialize();\n }\n if (val != null) {\n return $el.picker.setDate(val);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return unbind();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgDateSelector\", [\"$rootScope\", \"tgDatePickerConfigService\", DateSelectorDirective]);\n\n SprintProgressBarDirective = function() {\n var link, renderProgress;\n renderProgress = function($el, percentage, visual_percentage) {\n if ($el.hasClass(\".current-progress\")) {\n return $el.css(\"width\", percentage + \"%\");\n } else {\n $el.find(\".current-progress\").css(\"width\", visual_percentage + \"%\");\n return $el.find(\".number\").html(percentage + \" %\");\n }\n };\n link = function($scope, $el, $attrs) {\n bindOnce($scope, $attrs.tgSprintProgressbar, function(sprint) {\n var closedPoints, percentage, totalPoints, visual_percentage;\n closedPoints = sprint.closed_points;\n totalPoints = sprint.total_points;\n percentage = 0;\n if (totalPoints !== 0) {\n percentage = Math.round(100 * (closedPoints / totalPoints));\n }\n visual_percentage = 0;\n if (totalPoints !== 0) {\n visual_percentage = Math.round(98 * (closedPoints / totalPoints));\n }\n return renderProgress($el, percentage, visual_percentage);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgSprintProgressbar\", SprintProgressBarDirective);\n\n CreatedByDisplayDirective = function($template, $compile, $translate, $navUrls) {\n var link;\n link = function($scope, $el, $attrs) {\n bindOnce($scope, $attrs.ngModel, function(model) {\n var ref;\n if (model != null) {\n $scope.owner = model.owner_extra_info || {\n full_name_display: $translate.instant(\"COMMON.EXTERNAL_USER\"),\n photo: \"/\" + window._version + \"/images/user-noimage.png\"\n };\n $scope.url = ((ref = $scope.owner) != null ? ref.is_active : void 0) ? $navUrls.resolve(\"user-profile\", {\n username: $scope.owner.username\n }) : \"\";\n return $scope.date = moment(model.created_date).format($translate.instant(\"COMMON.DATETIME\"));\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\",\n scope: true,\n templateUrl: \"common/components/created-by.html\"\n };\n };\n\n module.directive(\"tgCreatedByDisplay\", [\"$tgTemplate\", \"$compile\", \"$translate\", \"$tgNavUrls\", CreatedByDisplayDirective]);\n\n WatchersDirective = function($rootscope, $confirm, $repo, $qqueue, $template, $compile, $translate) {\n var link, template;\n template = $template.get(\"common/components/watchers.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var deleteWatcher, isEditable, renderWatchers, save;\n isEditable = function() {\n var ref, ref1;\n return ((ref = $scope.project) != null ? (ref1 = ref.my_permissions) != null ? ref1.indexOf($attrs.requiredPerm) : void 0 : void 0) !== -1;\n };\n save = $qqueue.bindAdd((function(_this) {\n return function(watchers) {\n var item, promise;\n item = $model.$modelValue.clone();\n item.watchers = watchers;\n $model.$setViewValue(item);\n promise = $repo.save($model.$modelValue);\n promise.then(function() {\n watchers = _.map(watchers, function(watcherId) {\n return $scope.usersById[watcherId];\n });\n renderWatchers(watchers);\n return $rootscope.$broadcast(\"object:updated\");\n });\n return promise.then(null, function() {\n $model.$modelValue.revert();\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n deleteWatcher = $qqueue.bindAdd((function(_this) {\n return function(watcherIds) {\n var item, promise;\n item = $model.$modelValue.clone();\n item.watchers = watcherIds;\n $model.$setViewValue(item);\n promise = $repo.save($model.$modelValue);\n promise.then(function() {\n var watchers;\n watchers = _.map(item.watchers, function(watcherId) {\n return $scope.usersById[watcherId];\n });\n renderWatchers(watchers);\n return $rootscope.$broadcast(\"object:updated\");\n });\n return promise.then(null, function() {\n item.revert();\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n renderWatchers = function(watchers) {\n var ctx, html;\n ctx = {\n watchers: watchers,\n isEditable: isEditable()\n };\n html = $compile(template(ctx))($scope);\n return $el.html(html);\n };\n $el.on(\"click\", \".js-delete-watcher\", function(event) {\n var message, target, title, watcherId;\n event.preventDefault();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n watcherId = target.data(\"watcher-id\");\n title = $translate.instant(\"COMMON.WATCHERS.TITLE_LIGHTBOX_DELETE_WARTCHER\");\n message = $scope.usersById[watcherId].full_name_display;\n return $confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var watcherIds;\n askResponse.finish();\n watcherIds = _.clone($model.$modelValue.watchers, false);\n watcherIds = _.pull(watcherIds, watcherId);\n return deleteWatcher(watcherIds);\n };\n })(this));\n });\n $scope.$on(\"watcher:added\", function(ctx, watcherId) {\n var watchers;\n watchers = _.clone($model.$modelValue.watchers, false);\n watchers.push(watcherId);\n watchers = _.uniq(watchers);\n return save(watchers);\n });\n $scope.$watch($attrs.ngModel, function(item) {\n var watchers;\n if (item == null) {\n return;\n }\n watchers = _.map(item.watchers, function(watcherId) {\n return $scope.usersById[watcherId];\n });\n return renderWatchers(watchers);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgWatchers\", [\"$rootScope\", \"$tgConfirm\", \"$tgRepo\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", \"$translate\", WatchersDirective]);\n\n AssignedToDirective = function($rootscope, $confirm, $repo, $loading, $qqueue, $template, $translate, $compile, $currentUserService) {\n var link, template;\n template = $template.get(\"common/components/assigned-to.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, renderAssignedTo, save;\n isEditable = function() {\n var ref, ref1;\n return ((ref = $scope.project) != null ? (ref1 = ref.my_permissions) != null ? ref1.indexOf($attrs.requiredPerm) : void 0 : void 0) !== -1;\n };\n save = $qqueue.bindAdd((function(_this) {\n return function(userId) {\n var currentLoading, promise;\n $model.$modelValue.assigned_to = userId;\n currentLoading = $loading().target($el).start();\n promise = $repo.save($model.$modelValue);\n promise.then(function() {\n currentLoading.finish();\n renderAssignedTo($model.$modelValue);\n return $rootscope.$broadcast(\"object:updated\");\n });\n promise.then(null, function() {\n $model.$modelValue.revert();\n $confirm.notify(\"error\");\n return currentLoading.finish();\n });\n return promise;\n };\n })(this));\n renderAssignedTo = function(assignedObject) {\n var ctx, fullName, html, isIocaine, isUnassigned, photo;\n if ((assignedObject != null ? assignedObject.assigned_to : void 0) != null) {\n fullName = assignedObject.assigned_to_extra_info.full_name_display;\n photo = assignedObject.assigned_to_extra_info.photo;\n isUnassigned = false;\n } else {\n fullName = $translate.instant(\"COMMON.ASSIGNED_TO.ASSIGN\");\n photo = \"/\" + window._version + \"/images/unnamed.png\";\n isUnassigned = true;\n }\n isIocaine = assignedObject != null ? assignedObject.is_iocaine : void 0;\n ctx = {\n fullName: fullName,\n photo: photo,\n isUnassigned: isUnassigned,\n isEditable: isEditable(),\n isIocaine: isIocaine,\n fullNameVisible: !(isUnassigned && !$currentUserService.isAuthenticated())\n };\n html = $compile(template(ctx))($scope);\n return $el.html(html);\n };\n $el.on(\"click\", \".user-assigned\", function(event) {\n event.preventDefault();\n if (!isEditable()) {\n return;\n }\n return $scope.$apply(function() {\n return $rootscope.$broadcast(\"assigned-to:add\", $model.$modelValue);\n });\n });\n $el.on(\"click\", \".assign-to-me\", function(event) {\n event.preventDefault();\n if (!isEditable()) {\n return;\n }\n $model.$modelValue.assigned_to = $currentUserService.getUser().get('id');\n return save($currentUserService.getUser().get('id'));\n });\n $el.on(\"click\", \".icon-delete\", function(event) {\n var title;\n event.preventDefault();\n if (!isEditable()) {\n return;\n }\n title = $translate.instant(\"COMMON.ASSIGNED_TO.CONFIRM_UNASSIGNED\");\n return $confirm.ask(title).then((function(_this) {\n return function(response) {\n response.finish();\n $model.$modelValue.assigned_to = null;\n return save(null);\n };\n })(this));\n });\n $scope.$on(\"assigned-to:added\", function(ctx, userId, item) {\n if (item.id !== $model.$modelValue.id) {\n return;\n }\n return save(userId);\n });\n $scope.$watch($attrs.ngModel, function(instance) {\n return renderAssignedTo(instance);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgAssignedTo\", [\"$rootScope\", \"$tgConfirm\", \"$tgRepo\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$translate\", \"$compile\", \"tgCurrentUserService\", AssignedToDirective]);\n\n BlockButtonDirective = function($rootscope, $loading, $template) {\n var link, template;\n template = $template.get(\"common/components/block-button.html\");\n link = function($scope, $el, $attrs, $model) {\n var isEditable;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_us\") !== -1;\n };\n $scope.$watch($attrs.ngModel, function(item) {\n if (!item) {\n return;\n }\n if (isEditable()) {\n $el.find('.item-block').addClass('editable');\n }\n if (item.is_blocked) {\n $el.find('.item-block').removeClass('is-active');\n return $el.find('.item-unblock').addClass('is-active');\n } else {\n $el.find('.item-block').addClass('is-active');\n return $el.find('.item-unblock').removeClass('is-active');\n }\n });\n $el.on(\"click\", \".item-block\", function(event) {\n event.preventDefault();\n return $rootscope.$broadcast(\"block\", $model.$modelValue);\n });\n $el.on(\"click\", \".item-unblock\", function(event) {\n var currentLoading, finish;\n event.preventDefault();\n currentLoading = $loading().target($el.find(\".item-unblock\")).start();\n finish = function() {\n return currentLoading.finish();\n };\n return $rootscope.$broadcast(\"unblock\", $model.$modelValue, finish);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\",\n template: template\n };\n };\n\n module.directive(\"tgBlockButton\", [\"$rootScope\", \"$tgLoading\", \"$tgTemplate\", BlockButtonDirective]);\n\n DeleteButtonDirective = function($log, $repo, $confirm, $location, $template) {\n var link, template;\n template = $template.get(\"common/components/delete-button.html\");\n link = function($scope, $el, $attrs, $model) {\n if (!$attrs.onDeleteGoToUrl) {\n return $log.error(\"DeleteButtonDirective requires on-delete-go-to-url set in scope.\");\n }\n if (!$attrs.onDeleteTitle) {\n return $log.error(\"DeleteButtonDirective requires on-delete-title set in scope.\");\n }\n $el.on(\"click\", \".button-delete\", function(event) {\n var subtitle, title;\n title = $attrs.onDeleteTitle;\n subtitle = $model.$modelValue.subject;\n return $confirm.askOnDelete(title, subtitle).then((function(_this) {\n return function(askResponse) {\n var promise;\n promise = $repo.remove($model.$modelValue);\n promise.then(function() {\n var url;\n askResponse.finish();\n url = $scope.$eval($attrs.onDeleteGoToUrl);\n return $location.path(url);\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\",\n template: template\n };\n };\n\n module.directive(\"tgDeleteButton\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"$tgTemplate\", DeleteButtonDirective]);\n\n EditableSubjectDirective = function($rootscope, $repo, $confirm, $loading, $qqueue, $template) {\n var link, template;\n template = $template.get(\"common/components/editable-subject.html\");\n link = function($scope, $el, $attrs, $model) {\n var isEditable, save;\n $scope.$on(\"object:updated\", function() {\n $el.find('.edit-subject').hide();\n return $el.find('.view-subject').show();\n });\n isEditable = function() {\n return $scope.project.my_permissions.indexOf($attrs.requiredPerm) !== -1;\n };\n save = $qqueue.bindAdd((function(_this) {\n return function(subject) {\n var currentLoading, promise;\n $model.$modelValue.subject = subject;\n currentLoading = $loading().target($el.find('.save-container')).start();\n promise = $repo.save($model.$modelValue);\n promise.then(function() {\n $confirm.notify(\"success\");\n $rootscope.$broadcast(\"object:updated\");\n $el.find('.edit-subject').hide();\n return $el.find('.view-subject').show();\n });\n promise.then(null, function() {\n return $confirm.notify(\"error\");\n });\n promise[\"finally\"](function() {\n return currentLoading.finish();\n });\n return promise;\n };\n })(this));\n $el.click(function() {\n if (!isEditable()) {\n return;\n }\n $el.find('.edit-subject').show();\n $el.find('.view-subject').hide();\n return $el.find('input').focus();\n });\n $el.on(\"click\", \".save\", function(e) {\n var subject;\n e.preventDefault();\n subject = $scope.item.subject;\n return save(subject);\n });\n $el.on(\"keyup\", \"input\", function(event) {\n var subject;\n if (event.keyCode === 13) {\n subject = $scope.item.subject;\n return save(subject);\n } else if (event.keyCode === 27) {\n $scope.$apply((function(_this) {\n return function() {\n return $model.$modelValue.revert();\n };\n })(this));\n $el.find('div.edit-subject').hide();\n return $el.find('div.view-subject').show();\n }\n });\n $el.find('div.edit-subject').hide();\n $el.find('div.view-subject span.edit').hide();\n $scope.$watch($attrs.ngModel, function(value) {\n if (!value) {\n return;\n }\n $scope.item = value;\n if (!isEditable()) {\n return $el.find('.view-subject .edit').remove();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\",\n template: template\n };\n };\n\n module.directive(\"tgEditableSubject\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", EditableSubjectDirective]);\n\n EditableDescriptionDirective = function($rootscope, $repo, $confirm, $compile, $loading, $selectedText, $qqueue, $template) {\n var link, noDescriptionMegEditMode, noDescriptionMegReadMode, template;\n template = $template.get(\"common/components/editable-description.html\");\n noDescriptionMegEditMode = $template.get(\"common/components/editable-description-msg-edit-mode.html\");\n noDescriptionMegReadMode = $template.get(\"common/components/editable-description-msg-read-mode.html\");\n link = function($scope, $el, $attrs, $model) {\n var isEditable, save;\n $el.find('.edit-description').hide();\n $el.find('.view-description .edit').hide();\n $scope.$on(\"object:updated\", function() {\n $el.find('.edit-description').hide();\n return $el.find('.view-description').show();\n });\n isEditable = function() {\n return $scope.project.my_permissions.indexOf($attrs.requiredPerm) !== -1;\n };\n save = $qqueue.bindAdd((function(_this) {\n return function(description) {\n var currentLoading, promise;\n $model.$modelValue.description = description;\n currentLoading = $loading().target($el.find('.save-container')).start();\n promise = $repo.save($model.$modelValue);\n promise.then(function() {\n $confirm.notify(\"success\");\n $rootscope.$broadcast(\"object:updated\");\n $el.find('.edit-description').hide();\n return $el.find('.view-description').show();\n });\n promise.then(null, function() {\n return $confirm.notify(\"error\");\n });\n return promise[\"finally\"](function() {\n return currentLoading.finish();\n });\n };\n })(this));\n $el.on(\"mouseup\", \".view-description\", function(event) {\n var target;\n target = angular.element(event.target);\n if (!isEditable()) {\n return;\n }\n if (target.is('a')) {\n return;\n }\n if ($selectedText.get().length) {\n return;\n }\n $el.find('.edit-description').show();\n $el.find('.view-description').hide();\n return $el.find('textarea').focus();\n });\n $el.on(\"click\", \"a\", function(event) {\n var href, target;\n target = angular.element(event.target);\n href = target.attr('href');\n if (href.indexOf(\"#\") === 0) {\n event.preventDefault();\n return $('body').scrollTop($(href).offset().top);\n }\n });\n $el.on(\"click\", \".save\", function(e) {\n var description;\n e.preventDefault();\n description = $scope.item.description;\n return save(description);\n });\n $el.on(\"keydown\", \"textarea\", function(event) {\n if (event.keyCode === 27) {\n $scope.$apply((function(_this) {\n return function() {\n return $scope.item.revert();\n };\n })(this));\n $el.find('.edit-description').hide();\n return $el.find('.view-description').show();\n }\n });\n $scope.$watch($attrs.ngModel, function(value) {\n if (!value) {\n return;\n }\n $scope.item = value;\n if (isEditable()) {\n $el.find('.view-description .edit').show();\n $el.find('.view-description .us-content').addClass('editable');\n return $scope.noDescriptionMsg = $compile(noDescriptionMegEditMode)($scope);\n } else {\n return $scope.noDescriptionMsg = $compile(noDescriptionMegReadMode)($scope);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\",\n template: template\n };\n };\n\n module.directive(\"tgEditableDescription\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$compile\", \"$tgLoading\", \"$selectedText\", \"$tgQqueue\", \"$tgTemplate\", EditableDescriptionDirective]);\n\n EditableWysiwyg = function(attachmentsService, attachmentsFullService) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var isInEditMode, uploadFile;\n isInEditMode = function() {\n return $el.find('textarea').is(':visible');\n };\n uploadFile = function(file, type) {\n if (!attachmentsService.validate(file)) {\n return;\n }\n return attachmentsFullService.addAttachment($model.$modelValue.project, $model.$modelValue.id, type, file).then(function(result) {\n if (taiga.isImage(result.getIn(['file', 'name']))) {\n return '![' + result.getIn(['file', 'name']) + '](' + result.getIn(['file', 'url']) + ')';\n } else {\n return '[' + result.getIn(['file', 'name']) + '](' + result.getIn(['file', 'url']) + ')';\n }\n });\n };\n $el.on('dragover', function(e) {\n var textarea;\n textarea = $el.find('textarea').focus();\n return false;\n });\n return $el.on('drop', function(e) {\n var dataTransfer, promises, textarea, type;\n e.stopPropagation();\n e.preventDefault();\n if (isInEditMode()) {\n dataTransfer = e.dataTransfer || (e.originalEvent && e.originalEvent.dataTransfer);\n textarea = $el.find('textarea');\n textarea.addClass('in-progress');\n type = $model.$modelValue['_name'];\n if (type === \"userstories\") {\n type = \"us\";\n } else if (type === \"tasks\") {\n type = \"task\";\n } else if (type === \"issues\") {\n type = \"issue\";\n } else if (type === \"wiki\") {\n type = \"wiki_page\";\n }\n promises = _.map(dataTransfer.files, function(file) {\n return uploadFile(file, type);\n });\n return Promise.all(promises).then(function(result) {\n textarea = $el.find('textarea');\n $.markItUp({\n replaceWith: result.join(' ')\n });\n return textarea.removeClass('in-progress');\n });\n }\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgEditableWysiwyg\", [\"tgAttachmentsService\", \"tgAttachmentsFullService\", EditableWysiwyg]);\n\n ListItemUsStatusDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var us;\n us = $scope.$eval($attrs.tgListitemUsStatus);\n return bindOnce($scope, \"usStatusById\", function(usStatusById) {\n return $el.html(usStatusById[us.status].name);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemUsStatus\", ListItemUsStatusDirective);\n\n ListItemTaskStatusDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var task;\n task = $scope.$eval($attrs.tgListitemTaskStatus);\n return bindOnce($scope, \"taskStatusById\", function(taskStatusById) {\n return $el.html(taskStatusById[task.status].name);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemTaskStatus\", ListItemTaskStatusDirective);\n\n ListItemAssignedtoDirective = function($template, $translate) {\n var link, template;\n template = $template.get(\"common/components/list-item-assigned-to-avatar.html\", true);\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, \"usersById\", function(usersById) {\n var ctx, item, member;\n item = $scope.$eval($attrs.tgListitemAssignedto);\n ctx = {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\"),\n imgurl: \"/\" + window._version + \"/images/unnamed.png\"\n };\n member = usersById[item.assigned_to];\n if (member) {\n ctx.imgurl = member.photo;\n ctx.name = member.full_name_display;\n }\n return $el.html(template(ctx));\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemAssignedto\", [\"$tgTemplate\", \"$translate\", ListItemAssignedtoDirective]);\n\n ListItemIssueStatusDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var issue;\n issue = $scope.$eval($attrs.tgListitemIssueStatus);\n return bindOnce($scope, \"issueStatusById\", function(issueStatusById) {\n return $el.html(issueStatusById[issue.status].name);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemIssueStatus\", ListItemIssueStatusDirective);\n\n ListItemTypeDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var render;\n render = function(issueTypeById, issue) {\n var domNode, type;\n type = issueTypeById[issue.type];\n domNode = $el.find(\".level\");\n domNode.css(\"background-color\", type.color);\n return domNode.attr(\"title\", type.name);\n };\n bindOnce($scope, \"issueTypeById\", function(issueTypeById) {\n var issue;\n issue = $scope.$eval($attrs.tgListitemType);\n return render(issueTypeById, issue);\n });\n return $scope.$watch($attrs.tgListitemType, function(issue) {\n return render($scope.issueTypeById, issue);\n });\n };\n return {\n link: link,\n templateUrl: \"common/components/level.html\"\n };\n };\n\n module.directive(\"tgListitemType\", ListItemTypeDirective);\n\n ListItemPriorityDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var render;\n render = function(priorityById, issue) {\n var domNode, priority;\n priority = priorityById[issue.priority];\n domNode = $el.find(\".level\");\n domNode.css(\"background-color\", priority.color);\n return domNode.attr(\"title\", priority.name);\n };\n bindOnce($scope, \"priorityById\", function(priorityById) {\n var issue;\n issue = $scope.$eval($attrs.tgListitemPriority);\n return render(priorityById, issue);\n });\n return $scope.$watch($attrs.tgListitemPriority, function(issue) {\n return render($scope.priorityById, issue);\n });\n };\n return {\n link: link,\n templateUrl: \"common/components/level.html\"\n };\n };\n\n module.directive(\"tgListitemPriority\", ListItemPriorityDirective);\n\n ListItemSeverityDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var render;\n render = function(severityById, issue) {\n var domNode, severity;\n severity = severityById[issue.severity];\n domNode = $el.find(\".level\");\n domNode.css(\"background-color\", severity.color);\n return domNode.attr(\"title\", severity.name);\n };\n bindOnce($scope, \"severityById\", function(severityById) {\n var issue;\n issue = $scope.$eval($attrs.tgListitemSeverity);\n return render(severityById, issue);\n });\n return $scope.$watch($attrs.tgListitemSeverity, function(issue) {\n return render($scope.severityById, issue);\n });\n };\n return {\n link: link,\n templateUrl: \"common/components/level.html\"\n };\n };\n\n module.directive(\"tgListitemSeverity\", ListItemSeverityDirective);\n\n TgProgressBarDirective = function($template) {\n var link, render, template;\n template = $template.get(\"common/components/progress-bar.html\", true);\n render = function(el, percentage) {\n return el.html(template({\n percentage: percentage\n }));\n };\n link = function($scope, $el, $attrs) {\n var element;\n element = angular.element($el);\n $scope.$watch($attrs.tgProgressBar, function(percentage) {\n percentage = _.max([0, percentage]);\n percentage = _.min([100, percentage]);\n return render($el, percentage);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProgressBar\", [\"$tgTemplate\", TgProgressBarDirective]);\n\n TgMainTitleDirective = function($translate) {\n var link;\n link = function($scope, $el, $attrs) {\n $attrs.$observe(\"i18nSectionName\", function(i18nSectionName) {\n return $scope.sectionName = i18nSectionName;\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n templateUrl: \"common/components/main-title.html\",\n scope: {\n projectName: \"=projectName\"\n }\n };\n };\n\n module.directive(\"tgMainTitle\", [\"$translate\", TgMainTitleDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/confirm.coffee\n */\n\n(function() {\n var ConfirmService, NOTIFICATION_MSG, bindMethods, cancelTimeout, debounce, module, taiga, timeout,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n timeout = this.taiga.timeout;\n\n cancelTimeout = this.taiga.cancelTimeout;\n\n debounce = this.taiga.debounce;\n\n bindMethods = this.taiga.bindMethods;\n\n NOTIFICATION_MSG = {\n \"success\": {\n title: \"NOTIFICATION.OK\",\n message: \"NOTIFICATION.SAVED\"\n },\n \"error\": {\n title: \"NOTIFICATION.WARNING\",\n message: \"NOTIFICATION.WARNING_TEXT\"\n },\n \"light-error\": {\n title: \"NOTIFICATION.WARNING\",\n message: \"NOTIFICATION.WARNING_TEXT\"\n }\n };\n\n ConfirmService = (function(superClass) {\n extend(ConfirmService, superClass);\n\n ConfirmService.$inject = [\"$q\", \"lightboxService\", \"$tgLoading\", \"$translate\"];\n\n function ConfirmService(q, lightboxService, loading, translate) {\n this.q = q;\n this.lightboxService = lightboxService;\n this.loading = loading;\n this.translate = translate;\n bindMethods(this);\n }\n\n ConfirmService.prototype.hide = function(el) {\n if (el) {\n this.lightboxService.close(el);\n return el.off(\".confirm-dialog\");\n }\n };\n\n ConfirmService.prototype.ask = function(title, subtitle, message, lightboxSelector) {\n var defered, el;\n if (lightboxSelector == null) {\n lightboxSelector = \".lightbox-generic-ask\";\n }\n defered = this.q.defer();\n el = angular.element(lightboxSelector);\n el.find(\"h2.title\").text(title);\n el.find(\"span.subtitle\").text(subtitle);\n el.find(\"span.message\").text(message);\n el.on(\"click.confirm-dialog\", \"a.button-green\", debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n currentLoading = _this.loading().target(target).start();\n return defered.resolve({\n finish: function(ok) {\n if (ok == null) {\n ok = true;\n }\n currentLoading.finish();\n if (ok) {\n return _this.hide(el);\n }\n }\n });\n };\n })(this)));\n el.on(\"click.confirm-dialog\", \"a.button-red\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.reject();\n return _this.hide(el);\n };\n })(this));\n this.lightboxService.open(el);\n return defered.promise;\n };\n\n ConfirmService.prototype.askOnDelete = function(title, message) {\n return this.ask(title, this.translate.instant(\"NOTIFICATION.ASK_DELETE\"), message);\n };\n\n ConfirmService.prototype.askChoice = function(title, subtitle, choices, replacement, warning, lightboxSelector) {\n var choicesField, defered, el;\n if (lightboxSelector == null) {\n lightboxSelector = \".lightbox-ask-choice\";\n }\n defered = this.q.defer();\n el = angular.element(lightboxSelector);\n el.find(\".title\").text(title);\n el.find(\".subtitle\").text(subtitle);\n if (replacement) {\n el.find(\".replacement\").text(replacement);\n } else {\n el.find(\".replacement\").remove();\n }\n if (warning) {\n el.find(\".warning\").text(warning);\n } else {\n el.find(\".warning\").remove();\n }\n choicesField = el.find(\".choices\");\n choicesField.html('');\n _.each(choices, function(value, key) {\n value = _.escape(value);\n return choicesField.append(angular.element(\"\"));\n });\n el.on(\"click.confirm-dialog\", \"a.button-green\", debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n currentLoading = _this.loading().target(target).start();\n return defered.resolve({\n selected: choicesField.val(),\n finish: function(ok) {\n if (ok == null) {\n ok = true;\n }\n currentLoading.finish();\n if (ok) {\n return _this.hide(el);\n }\n }\n });\n };\n })(this)));\n el.on(\"click.confirm-dialog\", \"a.button-red\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.reject();\n return _this.hide(el);\n };\n })(this));\n this.lightboxService.open(el);\n return defered.promise;\n };\n\n ConfirmService.prototype.error = function(message) {\n var defered, el;\n defered = this.q.defer();\n el = angular.element(\".lightbox-generic-error\");\n el.find(\"h2.title\").html(message);\n el.on(\"click.confirm-dialog\", \"a.button-green\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.resolve();\n return _this.hide(el);\n };\n })(this));\n el.on(\"click.confirm-dialog\", \"a.close\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.resolve();\n return _this.hide(el);\n };\n })(this));\n this.lightboxService.open(el);\n return defered.promise;\n };\n\n ConfirmService.prototype.success = function(title, message) {\n var defered, el;\n defered = this.q.defer();\n el = angular.element(\".lightbox-generic-success\");\n if (title) {\n el.find(\"h2.title\").html(title);\n }\n if (message) {\n el.find(\"p.message\").html(message);\n }\n el.on(\"click.confirm-dialog\", \"a.button-green\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.resolve();\n return _this.hide(el);\n };\n })(this));\n el.on(\"click.confirm-dialog\", \"a.close\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.resolve();\n return _this.hide(el);\n };\n })(this));\n this.lightboxService.open(el);\n return defered.promise;\n };\n\n ConfirmService.prototype.loader = function(title, message) {\n var el;\n el = angular.element(\".lightbox-generic-loading\");\n if (title) {\n el.find(\"h2.title\").html(title);\n }\n if (message) {\n el.find(\"p.message\").html(message);\n }\n return {\n start: (function(_this) {\n return function() {\n return _this.lightboxService.open(el);\n };\n })(this),\n stop: (function(_this) {\n return function() {\n return _this.lightboxService.close(el);\n };\n })(this),\n update: (function(_this) {\n return function(status, title, message, percent) {\n if (title) {\n el.find(\"h2.title\").html(title);\n }\n if (message) {\n el.find(\"p.message\").html(message);\n }\n if (percent) {\n el.find(\".spin\").addClass(\"hidden\");\n el.find(\".progress-bar-wrapper\").removeClass(\"hidden\");\n el.find(\".progress-bar-wrapper > .bar\").width(percent + '%');\n return el.find(\".progress-bar-wrapper > span\").html(percent + '%').css('left', (percent - 9) + '%');\n } else {\n el.find(\".spin\").removeClass(\"hidden\");\n return el.find(\".progress-bar-wrapper\").addClass(\"hidden\");\n }\n };\n })(this)\n };\n };\n\n ConfirmService.prototype.notify = function(type, message, title, time) {\n var body, el, selector;\n selector = \".notification-message-\" + type;\n el = angular.element(selector);\n if (el.hasClass(\"active\")) {\n return;\n }\n if (title) {\n el.find(\"h4\").html(title);\n } else {\n el.find(\"h4\").html(this.translate.instant(NOTIFICATION_MSG[type].title));\n }\n if (message) {\n el.find(\"p\").html(message);\n } else {\n el.find(\"p\").html(this.translate.instant(NOTIFICATION_MSG[type].message));\n }\n body = angular.element(\"body\");\n body.find(\".notification-message .notification-light\").removeClass('active').addClass('inactive');\n body.find(selector).removeClass('inactive').addClass('active');\n if (this.tsem) {\n cancelTimeout(this.tsem);\n }\n if (!time) {\n time = type === 'error' || type === 'light-error' ? 3500 : 1500;\n }\n this.tsem = timeout(time, (function(_this) {\n return function() {\n body.find(selector).removeClass('active').addClass('inactive');\n return delete _this.tsem;\n };\n })(this));\n return el.on(\"click\", \".icon-delete, .close\", (function(_this) {\n return function(event) {\n return body.find(selector).removeClass('active').addClass('inactive');\n };\n })(this));\n };\n\n return ConfirmService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaCommon\");\n\n module.service(\"$tgConfirm\", ConfirmService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/custom-field-values.coffee\n */\n\n(function() {\n var CustomAttributeValueDirective, CustomAttributesValuesController, CustomAttributesValuesDirective, DATE_TYPE, MULTILINE_TYPE, TEXT_TYPE, TYPE_CHOICES, bindMethods, bindOnce, debounce, generateHash, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n bindMethods = this.taiga.bindMethods;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n generateHash = taiga.generateHash;\n\n module = angular.module(\"taigaCommon\");\n\n TEXT_TYPE = \"text\";\n\n MULTILINE_TYPE = \"multiline\";\n\n DATE_TYPE = \"date\";\n\n TYPE_CHOICES = [\n {\n key: TEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT\"\n }, {\n key: MULTILINE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI\"\n }, {\n key: DATE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE\"\n }\n ];\n\n CustomAttributesValuesController = (function(superClass) {\n extend(CustomAttributesValuesController, superClass);\n\n CustomAttributesValuesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$q\"];\n\n function CustomAttributesValuesController(scope, rootscope, repo, rs, confirm, q) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.rs = rs;\n this.confirm = confirm;\n this.q = q;\n bindMethods(this);\n this.type = null;\n this.objectId = null;\n this.projectId = null;\n this.customAttributes = [];\n this.customAttributesValues = null;\n }\n\n CustomAttributesValuesController.prototype.initialize = function(type, objectId) {\n this.project = this.scope.project;\n this.type = type;\n this.objectId = objectId;\n return this.projectId = this.scope.projectId;\n };\n\n CustomAttributesValuesController.prototype.loadCustomAttributesValues = function() {\n if (!this.objectId) {\n return this.customAttributesValues;\n }\n return this.rs.customAttributesValues[this.type].get(this.objectId).then((function(_this) {\n return function(customAttributesValues) {\n _this.customAttributes = _this.project[_this.type + \"_custom_attributes\"];\n _this.customAttributesValues = customAttributesValues;\n return customAttributesValues;\n };\n })(this));\n };\n\n CustomAttributesValuesController.prototype.getAttributeValue = function(attribute) {\n var attributeValue;\n attributeValue = _.clone(attribute, false);\n attributeValue.value = this.customAttributesValues.attributes_values[attribute.id];\n return attributeValue;\n };\n\n CustomAttributesValuesController.prototype.updateAttributeValue = function(attributeValue) {\n var attributesValues, onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n return _this.rootscope.$broadcast(\"custom-attributes-values:edit\");\n };\n })(this);\n onError = (function(_this) {\n return function(response) {\n _this.confirm.notify(\"error\");\n return _this.q.reject();\n };\n })(this);\n attributesValues = _.clone(this.customAttributesValues.attributes_values, true);\n attributesValues[attributeValue.id] = attributeValue.value;\n this.customAttributesValues.attributes_values = attributesValues;\n this.customAttributesValues.id = this.objectId;\n return this.repo.save(this.customAttributesValues).then(onSuccess, onError);\n };\n\n return CustomAttributesValuesController;\n\n })(taiga.Controller);\n\n CustomAttributesValuesDirective = function($templates, $storage) {\n var collapsedHash, link, template, templateFn;\n template = $templates.get(\"custom-attributes/custom-attributes-values.html\", true);\n collapsedHash = function(type) {\n return generateHash([\"custom-attributes-collapsed\", type]);\n };\n link = function($scope, $el, $attrs, $ctrls) {\n var $ctrl, $model;\n $ctrl = $ctrls[0];\n $model = $ctrls[1];\n bindOnce($scope, $attrs.ngModel, function(value) {\n $ctrl.initialize($attrs.type, value.id);\n return $ctrl.loadCustomAttributesValues();\n });\n $el.on(\"click\", \".custom-fields-header a\", function() {\n var collapsed, hash;\n hash = collapsedHash($attrs.type);\n collapsed = !($storage.get(hash) || false);\n $storage.set(hash, collapsed);\n if (collapsed) {\n $el.find(\".custom-fields-header a\").removeClass(\"open\");\n return $el.find(\".custom-fields-body\").removeClass(\"open\");\n } else {\n $el.find(\".custom-fields-header a\").addClass(\"open\");\n return $el.find(\".custom-fields-body\").addClass(\"open\");\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n templateFn = function($el, $attrs) {\n var collapsed;\n collapsed = $storage.get(collapsedHash($attrs.type)) || false;\n return template({\n requiredEditionPerm: $attrs.requiredEditionPerm,\n collapsed: collapsed\n });\n };\n return {\n require: [\"tgCustomAttributesValues\", \"ngModel\"],\n controller: CustomAttributesValuesController,\n controllerAs: \"ctrl\",\n restrict: \"AE\",\n scope: true,\n link: link,\n template: templateFn\n };\n };\n\n module.directive(\"tgCustomAttributesValues\", [\"$tgTemplate\", \"$tgStorage\", \"$translate\", CustomAttributesValuesDirective]);\n\n CustomAttributeValueDirective = function($template, $selectedText, $compile, $translate, datePickerConfigService) {\n var link, template, templateEdit;\n template = $template.get(\"custom-attributes/custom-attribute-value.html\", true);\n templateEdit = $template.get(\"custom-attributes/custom-attribute-value-edit.html\", true);\n link = function($scope, $el, $attrs, $ctrl) {\n var attributeValue, isEditable, prettyDate, render, setFocusAndSelectOnInputField, submit;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n render = function(attributeValue, edit) {\n var ctx, datePickerConfig, editable, html, value;\n if (edit == null) {\n edit = false;\n }\n if (attributeValue.type === DATE_TYPE && attributeValue.value) {\n value = moment(attributeValue.value, \"YYYY-MM-DD\").format(prettyDate);\n } else {\n value = attributeValue.value;\n }\n editable = isEditable();\n ctx = {\n id: attributeValue.id,\n name: attributeValue.name,\n description: attributeValue.description,\n value: value,\n isEditable: editable,\n type: attributeValue.type\n };\n if (editable && (edit || !value)) {\n html = templateEdit(ctx);\n html = $compile(html)($scope);\n $el.html(html);\n if (attributeValue.type === DATE_TYPE) {\n datePickerConfig = datePickerConfigService.get();\n _.merge(datePickerConfig, {\n field: $el.find(\"input[name=value]\")[0],\n onSelect: (function(_this) {\n return function(date) {\n var selectedDate;\n return selectedDate = date;\n };\n })(this),\n onOpen: (function(_this) {\n return function() {\n if (typeof selectedDate !== \"undefined\" && selectedDate !== null) {\n return $el.picker.setDate(selectedDate);\n }\n };\n })(this)\n });\n return $el.picker = new Pikaday(datePickerConfig);\n }\n } else {\n html = template(ctx);\n html = $compile(html)($scope);\n return $el.html(html);\n }\n };\n isEditable = function() {\n var permissions, requiredEditionPerm;\n permissions = $scope.project.my_permissions;\n requiredEditionPerm = $attrs.requiredEditionPerm;\n return permissions.indexOf(requiredEditionPerm) > -1;\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n event.preventDefault();\n attributeValue.value = $el.find(\"input[name=value], textarea[name='value']\").val();\n if (attributeValue.type === DATE_TYPE) {\n if (moment(attributeValue.value, prettyDate).isValid()) {\n attributeValue.value = moment(attributeValue.value, prettyDate).format(\"YYYY-MM-DD\");\n } else {\n attributeValue.value = \"\";\n }\n }\n return $scope.$apply(function() {\n return $ctrl.updateAttributeValue(attributeValue).then(function() {\n return render(attributeValue, false);\n });\n });\n };\n })(this));\n setFocusAndSelectOnInputField = function() {\n return $el.find(\"input[name='value'], textarea[name='value']\").focus().select();\n };\n attributeValue = $scope.$eval($attrs.tgCustomAttributeValue);\n render(attributeValue);\n $el.on(\"click\", \".js-value-view-mode\", function() {\n if (!isEditable()) {\n return;\n }\n if ($selectedText.get().length) {\n return;\n }\n render(attributeValue, true);\n return setFocusAndSelectOnInputField();\n });\n $el.on(\"click\", \"a.icon-edit\", function(event) {\n event.preventDefault();\n render(attributeValue, true);\n return setFocusAndSelectOnInputField();\n });\n $el.on(\"keyup\", \"input[name=value], textarea[name='value']\", function(event) {\n if (event.keyCode === 13 && event.currentTarget.type !== \"textarea\") {\n return submit(event);\n } else if (event.keyCode === 27) {\n return render(attributeValue, false);\n }\n });\n $el.on(\"submit\", \"form\", submit);\n $el.on(\"click\", \"a.icon-floppy\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"^tgCustomAttributesValues\",\n restrict: \"AE\"\n };\n };\n\n module.directive(\"tgCustomAttributeValue\", [\"$tgTemplate\", \"$selectedText\", \"$compile\", \"$translate\", \"tgDatePickerConfigService\", CustomAttributeValueDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/estimation.coffee\n */\n\n(function() {\n var EstimationsService, LbUsEstimationDirective, UsEstimationDirective, groupBy, module, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n module = angular.module(\"taigaCommon\");\n\n LbUsEstimationDirective = function($tgEstimationsService, $rootScope, $repo, $template, $compile) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n $scope.$watch($attrs.ngModel, function(us) {\n var estimationProcess;\n if (us) {\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project);\n estimationProcess.onSelectedPointForRole = function(roleId, pointId) {\n return $scope.$apply(function() {\n return $model.$setViewValue(us);\n });\n };\n estimationProcess.render = function() {\n var ctx, html, mainTemplate, template;\n ctx = {\n totalPoints: this.calculateTotalPoints(),\n roles: this.calculateRoles(),\n editable: this.isEditable\n };\n mainTemplate = \"common/estimation/us-estimation-points-per-role.html\";\n template = $template.get(mainTemplate, true);\n html = template(ctx);\n html = $compile(html)($scope);\n return this.$el.html(html);\n };\n return estimationProcess.render();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgLbUsEstimation\", [\"$tgEstimationsService\", \"$rootScope\", \"$tgRepo\", \"$tgTemplate\", \"$compile\", LbUsEstimationDirective]);\n\n UsEstimationDirective = function($tgEstimationsService, $rootScope, $repo, $qqueue, $template, $compile) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n $scope.$watch($attrs.ngModel, function(us) {\n var estimationProcess;\n if (us) {\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project);\n estimationProcess.onSelectedPointForRole = function(roleId, pointId) {\n return this.save(roleId, pointId).then(function() {\n return $rootScope.$broadcast(\"object:updated\");\n });\n };\n estimationProcess.render = function() {\n var ctx, html, mainTemplate, template;\n ctx = {\n totalPoints: this.calculateTotalPoints(),\n roles: this.calculateRoles(),\n editable: this.isEditable\n };\n mainTemplate = \"common/estimation/us-estimation-points-per-role.html\";\n template = $template.get(mainTemplate, true);\n html = template(ctx);\n html = $compile(html)($scope);\n return this.$el.html(html);\n };\n return estimationProcess.render();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsEstimation\", [\"$tgEstimationsService\", \"$rootScope\", \"$tgRepo\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", UsEstimationDirective]);\n\n EstimationsService = function($template, $qqueue, $repo, $confirm, $q) {\n var EstimationProcess, create, pointsTemplate;\n pointsTemplate = $template.get(\"common/estimation/us-estimation-points.html\", true);\n EstimationProcess = (function() {\n function EstimationProcess($el1, us1, project1) {\n this.$el = $el1;\n this.us = us1;\n this.project = project1;\n this.bindClickEvents = bind(this.bindClickEvents, this);\n this.isEditable = this.project.my_permissions.indexOf(\"modify_us\") !== -1;\n this.roles = this.project.roles;\n this.points = this.project.points;\n this.pointsById = groupBy(this.points, function(x) {\n return x.id;\n });\n this.onSelectedPointForRole = function(roleId, pointId) {};\n this.render = function() {};\n }\n\n EstimationProcess.prototype.save = function(roleId, pointId) {\n var deferred;\n deferred = $q.defer();\n $qqueue.add((function(_this) {\n return function() {\n var onError, onSuccess;\n onSuccess = function() {\n return deferred.resolve();\n };\n onError = function() {\n $confirm.notify(\"error\");\n _this.us.revert();\n _this.render();\n return deferred.reject();\n };\n return $repo.save(_this.us).then(onSuccess, onError);\n };\n })(this));\n return deferred.promise;\n };\n\n EstimationProcess.prototype.calculateTotalPoints = function() {\n var notNullValues, values;\n values = _.map(this.us.points, (function(_this) {\n return function(v, k) {\n var ref;\n return (ref = _this.pointsById[v]) != null ? ref.value : void 0;\n };\n })(this));\n if (values.length === 0) {\n return \"0\";\n }\n notNullValues = _.filter(values, function(v) {\n return v != null;\n });\n if (notNullValues.length === 0) {\n return \"?\";\n }\n return _.reduce(notNullValues, function(acc, num) {\n return acc + num;\n });\n };\n\n EstimationProcess.prototype.calculateRoles = function() {\n var computableRoles, roles;\n computableRoles = _.filter(this.project.roles, \"computable\");\n roles = _.map(computableRoles, (function(_this) {\n return function(role) {\n var pointId, pointObj;\n pointId = _this.us.points[role.id];\n pointObj = _this.pointsById[pointId];\n role = _.clone(role, true);\n role.points = (pointObj != null) && (pointObj.name != null) ? pointObj.name : \"?\";\n return role;\n };\n })(this));\n return roles;\n };\n\n EstimationProcess.prototype.bindClickEvents = function() {\n this.$el.on(\"click\", \".total.clickable\", (function(_this) {\n return function(event) {\n var roleId, target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n roleId = target.data(\"role-id\");\n _this.renderPointsSelector(roleId, target);\n target.siblings().removeClass('active');\n return target.addClass('active');\n };\n })(this));\n return this.$el.on(\"click\", \".point\", (function(_this) {\n return function(event) {\n var pointId, points, roleId, target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n roleId = target.data(\"role-id\");\n pointId = target.data(\"point-id\");\n _this.$el.find(\".popover\").popover().close();\n points = _.clone(_this.us.points, true);\n points[roleId] = pointId;\n _this.us.points = points;\n _this.render();\n return _this.onSelectedPointForRole(roleId, pointId);\n };\n })(this));\n };\n\n EstimationProcess.prototype.renderPointsSelector = function(roleId, target) {\n var horizontalList, html, maxPointLength, points, pop;\n points = _.map(this.points, (function(_this) {\n return function(point) {\n point = _.clone(point, true);\n point.selected = _this.us.points[roleId] === point.id ? false : true;\n return point;\n };\n })(this));\n maxPointLength = 5;\n horizontalList = _.some(points, (function(_this) {\n return function(point) {\n return point.name.length > maxPointLength;\n };\n })(this));\n html = pointsTemplate({\n \"points\": points,\n roleId: roleId,\n horizontal: horizontalList\n });\n this.$el.find(\".popover\").popover().close();\n this.$el.find(\".pop-points-open\").remove();\n if (target != null) {\n this.$el.find(target).append(html);\n } else {\n this.$el.append(html);\n }\n this.$el.find(\".pop-points-open\").popover().open(function() {\n return $(this).removeClass(\"active\").closest(\"li\").removeClass(\"active\");\n });\n this.$el.find(\".pop-points-open\").show();\n pop = this.$el.find(\".pop-points-open\");\n if (pop.offset().top + pop.height() > document.body.clientHeight) {\n return pop.addClass('pop-bottom');\n }\n };\n\n return EstimationProcess;\n\n })();\n create = function($el, us, project) {\n var estimationProcess;\n $el.unbind(\"click\");\n estimationProcess = new EstimationProcess($el, us, project);\n if (estimationProcess.isEditable) {\n estimationProcess.bindClickEvents();\n }\n return estimationProcess;\n };\n return {\n create: create\n };\n };\n\n module.factory(\"$tgEstimationsService\", [\"$tgTemplate\", \"$tgQqueue\", \"$tgRepo\", \"$tgConfirm\", \"$q\", EstimationsService]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/filters.coffee\n */\n\n(function() {\n var defaultFilter, module, momentFormat, momentFromNow, sizeFormat, taiga, unslugify, yesNoFilter;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\");\n\n defaultFilter = function() {\n return function(value, defaultValue) {\n if (value === [null, void 0]) {\n return defaultValue;\n }\n return value;\n };\n };\n\n module.filter(\"default\", defaultFilter);\n\n yesNoFilter = function($translate) {\n return function(value) {\n if (value) {\n return $translate.instant(\"COMMON.YES\");\n }\n return $translate.instant(\"COMMON.NO\");\n };\n };\n\n module.filter(\"yesNo\", [\"$translate\", yesNoFilter]);\n\n unslugify = function() {\n return taiga.unslugify;\n };\n\n module.filter(\"unslugify\", unslugify);\n\n momentFormat = function() {\n return function(input, format) {\n if (input) {\n return moment(input).format(format);\n }\n return \"\";\n };\n };\n\n module.filter(\"momentFormat\", momentFormat);\n\n momentFromNow = function() {\n return function(input, without_suffix) {\n if (input) {\n return moment(input).fromNow(without_suffix || false);\n }\n return \"\";\n };\n };\n\n module.filter(\"momentFromNow\", momentFromNow);\n\n sizeFormat = (function(_this) {\n return function() {\n return _this.taiga.sizeFormat;\n };\n })(this);\n\n module.filter(\"sizeFormat\", sizeFormat);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/history.coffee\n */\n\n(function() {\n var HistoryController, HistoryDirective, IGNORED_FIELDS, bindOnce, debounce, module, taiga, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n trim = this.taiga.trim;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaCommon\");\n\n IGNORED_FIELDS = {\n \"userstories.userstory\": [\"watchers\", \"kanban_order\", \"backlog_order\", \"sprint_order\", \"finish_date\", \"tribe_gig\"],\n \"tasks.task\": [\"watchers\", \"us_order\", \"taskboard_order\"],\n \"issues.issue\": [\"watchers\"]\n };\n\n HistoryController = (function(superClass) {\n extend(HistoryController, superClass);\n\n HistoryController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\"];\n\n function HistoryController(scope, repo, rs) {\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n }\n\n HistoryController.prototype.initialize = function(type, objectId) {\n this.type = type;\n return this.objectId = objectId;\n };\n\n HistoryController.prototype.loadHistory = function(type, objectId) {\n return this.rs.history.get(type, objectId).then((function(_this) {\n return function(history) {\n var changeModel, historyEntry, historyResult, i, j, len, len1;\n for (i = 0, len = history.length; i < len; i++) {\n historyResult = history[i];\n if (historyResult.values_diff.description_diff != null) {\n historyResult.values_diff.description = historyResult.values_diff.description_diff;\n }\n delete historyResult.values_diff.description_html;\n delete historyResult.values_diff.description_diff;\n if (historyResult.values_diff.blocked_note_diff != null) {\n historyResult.values_diff.blocked_note = historyResult.values_diff.blocked_note_diff;\n }\n delete historyResult.values_diff.blocked_note_html;\n delete historyResult.values_diff.blocked_note_diff;\n }\n for (j = 0, len1 = history.length; j < len1; j++) {\n historyEntry = history[j];\n changeModel = historyEntry.key.split(\":\")[0];\n if (IGNORED_FIELDS[changeModel] != null) {\n historyEntry.values_diff = _.removeKeys(historyEntry.values_diff, IGNORED_FIELDS[changeModel]);\n }\n }\n _this.scope.history = _.filter(history, function(item) {\n return Object.keys(item.values_diff).length > 0;\n });\n return _this.scope.comments = _.filter(history, function(item) {\n return item.comment !== \"\";\n });\n };\n })(this));\n };\n\n HistoryController.prototype.deleteComment = function(type, objectId, activityId) {\n return this.rs.history.deleteComment(type, objectId, activityId).then((function(_this) {\n return function() {\n return _this.loadHistory(type, objectId);\n };\n })(this));\n };\n\n HistoryController.prototype.undeleteComment = function(type, objectId, activityId) {\n return this.rs.history.undeleteComment(type, objectId, activityId).then((function(_this) {\n return function() {\n return _this.loadHistory(type, objectId);\n };\n })(this));\n };\n\n return HistoryController;\n\n })(taiga.Controller);\n\n HistoryDirective = function($log, $loading, $qqueue, $template, $confirm, $translate, $compile, $navUrls, $rootScope) {\n var link, templateActivity, templateBase, templateBaseEntries, templateChangeAttachment, templateChangeDiff, templateChangeGeneric, templateChangeList, templateChangePoints, templateDeletedComment, templateFn;\n templateChangeDiff = $template.get(\"common/history/history-change-diff.html\", true);\n templateChangePoints = $template.get(\"common/history/history-change-points.html\", true);\n templateChangeGeneric = $template.get(\"common/history/history-change-generic.html\", true);\n templateChangeAttachment = $template.get(\"common/history/history-change-attachment.html\", true);\n templateChangeList = $template.get(\"common/history/history-change-list.html\", true);\n templateDeletedComment = $template.get(\"common/history/history-deleted-comment.html\", true);\n templateActivity = $template.get(\"common/history/history-activity.html\", true);\n templateBaseEntries = $template.get(\"common/history/history-base-entries.html\", true);\n templateBase = $template.get(\"common/history/history-base.html\", true);\n link = function($scope, $el, $attrs, $ctrl) {\n var countChanges, formatChange, getHumanizedFieldName, getPrettyDateFormat, objectId, renderActivity, renderAttachmentEntry, renderChange, renderChangeEntries, renderChangeEntry, renderChangesHelperText, renderComment, renderComments, renderCustomAttributesEntry, renderHistory, save, showAllActivity, showAllComments, type;\n type = $attrs.type;\n objectId = null;\n showAllComments = false;\n showAllActivity = false;\n getPrettyDateFormat = function() {\n return $translate.instant(\"ACTIVITY.DATETIME\");\n };\n bindOnce($scope, $attrs.ngModel, function(model) {\n type = $attrs.type;\n objectId = model.id;\n $ctrl.initialize(type, objectId);\n return $ctrl.loadHistory(type, objectId);\n });\n getHumanizedFieldName = function(field) {\n var humanizedFieldNames;\n humanizedFieldNames = {\n subject: $translate.instant(\"ACTIVITY.FIELDS.SUBJECT\"),\n name: $translate.instant(\"ACTIVITY.FIELDS.NAME\"),\n description: $translate.instant(\"ACTIVITY.FIELDS.DESCRIPTION\"),\n content: $translate.instant(\"ACTIVITY.FIELDS.CONTENT\"),\n status: $translate.instant(\"ACTIVITY.FIELDS.STATUS\"),\n is_closed: $translate.instant(\"ACTIVITY.FIELDS.IS_CLOSED\"),\n finish_date: $translate.instant(\"ACTIVITY.FIELDS.FINISH_DATE\"),\n type: $translate.instant(\"ACTIVITY.FIELDS.TYPE\"),\n priority: $translate.instant(\"ACTIVITY.FIELDS.PRIORITY\"),\n severity: $translate.instant(\"ACTIVITY.FIELDS.SEVERITY\"),\n assigned_to: $translate.instant(\"ACTIVITY.FIELDS.ASSIGNED_TO\"),\n watchers: $translate.instant(\"ACTIVITY.FIELDS.WATCHERS\"),\n milestone: $translate.instant(\"ACTIVITY.FIELDS.MILESTONE\"),\n user_story: $translate.instant(\"ACTIVITY.FIELDS.USER_STORY\"),\n project: $translate.instant(\"ACTIVITY.FIELDS.PROJECT\"),\n is_blocked: $translate.instant(\"ACTIVITY.FIELDS.IS_BLOCKED\"),\n blocked_note: $translate.instant(\"ACTIVITY.FIELDS.BLOCKED_NOTE\"),\n points: $translate.instant(\"ACTIVITY.FIELDS.POINTS\"),\n client_requirement: $translate.instant(\"ACTIVITY.FIELDS.CLIENT_REQUIREMENT\"),\n team_requirement: $translate.instant(\"ACTIVITY.FIELDS.TEAM_REQUIREMENT\"),\n is_iocaine: $translate.instant(\"ACTIVITY.FIELDS.IS_IOCAINE\"),\n tags: $translate.instant(\"ACTIVITY.FIELDS.TAGS\"),\n attachments: $translate.instant(\"ACTIVITY.FIELDS.ATTACHMENTS\"),\n is_deprecated: $translate.instant(\"ACTIVITY.FIELDS.IS_DEPRECATED\"),\n blocked_note: $translate.instant(\"ACTIVITY.FIELDS.BLOCKED_NOTE\"),\n is_blocked: $translate.instant(\"ACTIVITY.FIELDS.IS_BLOCKED\"),\n order: $translate.instant(\"ACTIVITY.FIELDS.ORDER\"),\n backlog_order: $translate.instant(\"ACTIVITY.FIELDS.BACKLOG_ORDER\"),\n sprint_order: $translate.instant(\"ACTIVITY.FIELDS.SPRINT_ORDER\"),\n kanban_order: $translate.instant(\"ACTIVITY.FIELDS.KANBAN_ORDER\"),\n taskboard_order: $translate.instant(\"ACTIVITY.FIELDS.TASKBOARD_ORDER\"),\n us_order: $translate.instant(\"ACTIVITY.FIELDS.US_ORDER\")\n };\n return humanizedFieldNames[field] || field;\n };\n countChanges = function(comment) {\n return _.keys(comment.values_diff).length;\n };\n formatChange = function(change) {\n if (_.isArray(change)) {\n if (change.length === 0) {\n return $translate.instant(\"ACTIVITY.VALUES.EMPTY\");\n }\n return change.join(\", \");\n }\n if (change === \"\") {\n return $translate.instant(\"ACTIVITY.VALUES.EMPTY\");\n }\n if ((change == null) || change === false) {\n return $translate.instant(\"ACTIVITY.VALUES.NO\");\n }\n if (change === true) {\n return $translate.instant(\"ACTIVITY.VALUES.YES\");\n }\n return change;\n };\n renderAttachmentEntry = function(value) {\n var attachments;\n attachments = _.map(value, function(changes, type) {\n if (type === \"new\") {\n return _.map(changes, function(change) {\n return templateChangeDiff({\n name: $translate.instant(\"ACTIVITY.NEW_ATTACHMENT\"),\n diff: change.filename\n });\n });\n } else if (type === \"deleted\") {\n return _.map(changes, function(change) {\n return templateChangeDiff({\n name: $translate.instant(\"ACTIVITY.DELETED_ATTACHMENT\"),\n diff: change.filename\n });\n });\n } else {\n return _.map(changes, function(change) {\n var diff, name;\n name = $translate.instant(\"ACTIVITY.UPDATED_ATTACHMENT\", {\n filename: change.filename\n });\n diff = _.map(change.changes, function(values, name) {\n return {\n name: getHumanizedFieldName(name),\n from: formatChange(values[0]),\n to: formatChange(values[1])\n };\n });\n return templateChangeAttachment({\n name: name,\n diff: diff\n });\n });\n }\n });\n return _.flatten(attachments).join(\"\\n\");\n };\n renderCustomAttributesEntry = function(value) {\n var customAttributes;\n customAttributes = _.map(value, function(changes, type) {\n if (type === \"new\") {\n return _.map(changes, function(change) {\n var html;\n html = templateChangeGeneric({\n name: change.name,\n from: formatChange(\"\"),\n to: formatChange(change.value)\n });\n html = $compile(html)($scope);\n return html[0].outerHTML;\n });\n } else if (type === \"deleted\") {\n return _.map(changes, function(change) {\n return templateChangeDiff({\n name: $translate.instant(\"ACTIVITY.DELETED_CUSTOM_ATTRIBUTE\"),\n diff: change.name\n });\n });\n } else {\n return _.map(changes, function(change) {\n var customAttrsChanges;\n customAttrsChanges = _.map(change.changes, function(values) {\n return templateChangeGeneric({\n name: change.name,\n from: formatChange(values[0]),\n to: formatChange(values[1])\n });\n });\n return _.flatten(customAttrsChanges).join(\"\\n\");\n });\n }\n });\n return _.flatten(customAttributes).join(\"\\n\");\n };\n renderChangeEntry = function(field, value) {\n var added, from, html, name, removed, to;\n if (field === \"description\") {\n return templateChangeDiff({\n name: getHumanizedFieldName(\"description\"),\n diff: value[1]\n });\n } else if (field === \"blocked_note\") {\n return templateChangeDiff({\n name: getHumanizedFieldName(\"blocked_note\"),\n diff: value[1]\n });\n } else if (field === \"points\") {\n html = templateChangePoints({\n points: value\n });\n html = $compile(html)($scope);\n return html[0].outerHTML;\n } else if (field === \"attachments\") {\n return renderAttachmentEntry(value);\n } else if (field === \"custom_attributes\") {\n return renderCustomAttributesEntry(value);\n } else if (field === \"tags\" || field === \"watchers\") {\n name = getHumanizedFieldName(field);\n removed = _.difference(value[0], value[1]);\n added = _.difference(value[1], value[0]);\n html = templateChangeList({\n name: name,\n removed: removed,\n added: added\n });\n html = $compile(html)($scope);\n return html[0].outerHTML;\n } else if (field === \"assigned_to\") {\n name = getHumanizedFieldName(field);\n from = formatChange(value[0] || $translate.instant(\"ACTIVITY.VALUES.UNASSIGNED\"));\n to = formatChange(value[1] || $translate.instant(\"ACTIVITY.VALUES.UNASSIGNED\"));\n return templateChangeGeneric({\n name: name,\n from: from,\n to: to\n });\n } else {\n name = getHumanizedFieldName(field);\n from = formatChange(value[0]);\n to = formatChange(value[1]);\n return templateChangeGeneric({\n name: name,\n from: from,\n to: to\n });\n }\n };\n renderChangeEntries = function(change) {\n return _.map(change.values_diff, function(value, field) {\n return renderChangeEntry(field, value);\n });\n };\n renderChangesHelperText = function(change) {\n var size;\n size = countChanges(change);\n return $translate.instant(\"ACTIVITY.SIZE_CHANGE\", {\n size: size\n }, 'messageformat');\n };\n renderComment = function(comment) {\n var html, ref, ref1, ref2;\n if (comment.delete_comment_date || ((ref = comment.delete_comment_user) != null ? ref.name : void 0)) {\n html = templateDeletedComment({\n deleteCommentDate: comment.delete_comment_date ? moment(comment.delete_comment_date).format(getPrettyDateFormat()) : void 0,\n deleteCommentUser: comment.delete_comment_user.name,\n deleteComment: comment.comment_html,\n activityId: comment.id,\n canRestoreComment: $scope.user && (comment.delete_comment_user.pk === $scope.user.id || $scope.project.my_permissions.indexOf(\"modify_project\") > -1)\n });\n html = $compile(html)($scope);\n return html[0].outerHTML;\n }\n html = templateActivity({\n avatar: comment.user.photo,\n userFullName: comment.user.name,\n userProfileUrl: comment.user.is_active ? $navUrls.resolve(\"user-profile\", {\n username: comment.user.username\n }) : \"\",\n creationDate: moment(comment.created_at).format(getPrettyDateFormat()),\n comment: comment.comment_html,\n changesText: renderChangesHelperText(comment),\n changes: renderChangeEntries(comment),\n mode: \"comment\",\n deleteCommentActionTitle: $translate.instant(\"COMMENTS.DELETE\"),\n deleteCommentDate: comment.delete_comment_date ? moment(comment.delete_comment_date).format(getPrettyDateFormat()) : void 0,\n deleteCommentUser: ((ref1 = comment.delete_comment_user) != null ? ref1.name : void 0) ? comment.delete_comment_user.name : void 0,\n activityId: comment.id,\n canDeleteComment: comment.user.pk === ((ref2 = $scope.user) != null ? ref2.id : void 0) || $scope.project.my_permissions.indexOf(\"modify_project\") > -1\n });\n html = $compile(html)($scope);\n return html[0].outerHTML;\n };\n renderChange = function(change) {\n var ref;\n return templateActivity({\n avatar: change.user.photo,\n userFullName: change.user.name,\n userProfileUrl: change.user.is_active ? $navUrls.resolve(\"user-profile\", {\n username: change.user.username\n }) : \"\",\n creationDate: moment(change.created_at).format(getPrettyDateFormat()),\n comment: change.comment_html,\n changes: renderChangeEntries(change),\n changesText: \"\",\n mode: \"activity\",\n deleteCommentDate: change.delete_comment_date ? moment(change.delete_comment_date).format(getPrettyDateFormat()) : void 0,\n deleteCommentUser: ((ref = change.delete_comment_user) != null ? ref.name : void 0) ? change.delete_comment_user.name : void 0,\n activityId: change.id\n });\n };\n renderHistory = function(entries, totalEntries) {\n var html, showMore;\n if (entries.length === totalEntries) {\n showMore = 0;\n } else {\n showMore = totalEntries - entries.length;\n }\n html = templateBaseEntries({\n entries: entries,\n showMore: showMore\n });\n html = $compile(html)($scope);\n return html;\n };\n renderComments = function() {\n var comments, html, totalComments;\n comments = $scope.comments || [];\n totalComments = comments.length;\n if (!showAllComments) {\n comments = _.last(comments, 4);\n }\n comments = _.map(comments, function(x) {\n return renderComment(x);\n });\n html = renderHistory(comments, totalComments);\n return $el.find(\".comments-list\").html(html);\n };\n renderActivity = function() {\n var changes, html, totalChanges;\n changes = $scope.history || [];\n totalChanges = changes.length;\n if (!showAllActivity) {\n changes = _.last(changes, 4);\n }\n changes = _.map(changes, function(x) {\n return renderChange(x);\n });\n html = renderHistory(changes, totalChanges);\n return $el.find(\".changes-list\").html(html);\n };\n save = $qqueue.bindAdd((function(_this) {\n return function(target) {\n var currentLoading, model, onError, onSuccess;\n $scope.$broadcast(\"markdown-editor:submit\");\n $el.find(\".comment-list\").addClass(\"activeanimation\");\n currentLoading = $loading().target(target).start();\n onSuccess = function() {\n $rootScope.$broadcast(\"comment:new\");\n return $ctrl.loadHistory(type, objectId)[\"finally\"](function() {\n return currentLoading.finish();\n });\n };\n onError = function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n };\n model = $scope.$eval($attrs.ngModel);\n return $ctrl.repo.save(model).then(onSuccess, onError);\n };\n })(this));\n $scope.$watch(\"comments\", renderComments);\n $scope.$watch(\"history\", renderActivity);\n $scope.$on(\"object:updated\", function() {\n return $ctrl.loadHistory(type, objectId);\n });\n $el.on(\"click\", \".add-comment button.button-green\", debounce(2000, function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return save(target);\n }));\n $el.on(\"click\", \"a\", function(event) {\n var href, target;\n target = angular.element(event.target);\n href = target.attr('href');\n if (href && href.indexOf(\"#\") === 0) {\n event.preventDefault();\n return $('body').scrollTop($(href).offset().top);\n }\n });\n $el.on(\"click\", \".show-more\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n if (target.parent().is(\".changes-list\")) {\n showAllActivity = !showAllActivity;\n return renderActivity();\n } else {\n showAllComments = !showAllComments;\n return renderComments();\n }\n });\n $el.on(\"click\", \".show-deleted-comment\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n target.parents('.activity-single').find('.hide-deleted-comment').show();\n target.parents('.activity-single').find('.show-deleted-comment').hide();\n return target.parents('.activity-single').find('.comment-body').show();\n });\n $el.on(\"click\", \".hide-deleted-comment\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n target.parents('.activity-single').find('.hide-deleted-comment').hide();\n target.parents('.activity-single').find('.show-deleted-comment').show();\n return target.parents('.activity-single').find('.comment-body').hide();\n });\n $el.on(\"click\", \".changes-title\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return target.parent().find(\".change-entry\").toggleClass(\"active\");\n });\n $el.on(\"focus\", \".add-comment textarea\", function(event) {\n return $(this).addClass('active');\n });\n $el.on(\"click\", \".history-tabs li a\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n $el.find(\".history-tabs li a\").removeClass(\"active\");\n target.addClass(\"active\");\n $el.find(\".history section\").addClass(\"hidden\");\n return $el.find(\".history section.\" + (target.data('section-class'))).removeClass(\"hidden\");\n });\n $el.on(\"click\", \".comment-delete\", debounce(2000, function(event) {\n var activityId, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n activityId = target.data('activity-id');\n return $ctrl.deleteComment(type, objectId, activityId);\n }));\n $el.on(\"click\", \".comment-restore\", debounce(2000, function(event) {\n var activityId, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n activityId = target.data('activity-id');\n return $ctrl.undeleteComment(type, objectId, activityId);\n }));\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n templateFn = function($el, $attrs) {\n var html;\n html = templateBase({\n ngmodel: $attrs.ngModel,\n type: $attrs.type,\n mode: $attrs.mode\n });\n return html;\n };\n return {\n controller: HistoryController,\n template: templateFn,\n restrict: \"AE\",\n link: link\n };\n };\n\n module.directive(\"tgHistory\", [\"$log\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$tgConfirm\", \"$translate\", \"$compile\", \"$tgNavUrls\", \"$rootScope\", HistoryDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/importer.coffee\n */\n\n(function() {\n var ImportProjectButtonDirective, module;\n\n module = angular.module(\"taigaCommon\");\n\n ImportProjectButtonDirective = function($rs, $confirm, $location, $navUrls, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n $el.on(\"click\", \".import-project-button\", function(event) {\n event.preventDefault();\n $el.find(\"input.import-file\").val(\"\");\n return $el.find(\"input.import-file\").trigger(\"click\");\n });\n return $el.on(\"change\", \"input.import-file\", function(event) {\n var file, loader, onError, onSuccess;\n event.preventDefault();\n file = event.target.files[0];\n if (!file) {\n return;\n }\n loader = $confirm.loader($translate.instant(\"PROJECT.IMPORT.UPLOADING_FILE\"));\n onSuccess = function(result) {\n var ctx, message, msg, title;\n loader.stop();\n if (result.status === 202) {\n title = $translate.instant(\"PROJECT.IMPORT.ASYNC_IN_PROGRESS_TITLE\");\n message = $translate.instant(\"PROJECT.IMPORT.ASYNC_IN_PROGRESS_MESSAGE\");\n return $confirm.success(title, message);\n } else {\n ctx = {\n project: result.data.slug\n };\n $location.path($navUrls.resolve(\"project-admin-project-profile-details\", ctx));\n msg = $translate.instant(\"PROJECT.IMPORT.SYNC_SUCCESS\");\n return $confirm.notify(\"success\", msg);\n }\n };\n onError = function(result) {\n var errorMsg, ref;\n loader.stop();\n errorMsg = $translate.instant(\"PROJECT.IMPORT.ERROR\");\n if (result.status === 429) {\n errorMsg = $translate.instant(\"PROJECT.IMPORT.ERROR_TOO_MANY_REQUEST\");\n } else if ((ref = result.data) != null ? ref._error_message : void 0) {\n errorMsg = $translate.instant(\"PROJECT.IMPORT.ERROR_MESSAGE\", {\n error_message: result.data._error_message\n });\n }\n return $confirm.notify(\"error\", errorMsg);\n };\n loader.start();\n return $rs.projects[\"import\"](file, loader.update).then(onSuccess, onError);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgImportProjectButton\", [\"$tgResources\", \"$tgConfirm\", \"$location\", \"$tgNavUrls\", \"$translate\", ImportProjectButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/lightboxes.coffee\n */\n\n(function() {\n var AssignedToLightboxDirective, AttachmentPreviewLightboxDirective, BlockLightboxDirective, BlockingMessageInputDirective, CreateBulkUserstoriesDirective, CreateEditUserstoryDirective, LightboxDirective, LightboxKeyboardNavigationService, LightboxService, WatchersLightboxDirective, bindOnce, debounce, module, sizeFormat, timeout,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n module = angular.module(\"taigaCommon\");\n\n bindOnce = this.taiga.bindOnce;\n\n timeout = this.taiga.timeout;\n\n debounce = this.taiga.debounce;\n\n sizeFormat = this.taiga.sizeFormat;\n\n LightboxService = (function(superClass) {\n extend(LightboxService, superClass);\n\n function LightboxService(animationFrame, q) {\n this.animationFrame = animationFrame;\n this.q = q;\n }\n\n LightboxService.prototype.open = function($el) {\n var defered, docEl, lightboxContent;\n defered = this.q.defer();\n lightboxContent = $el.children().not(\".close\");\n lightboxContent.hide();\n this.animationFrame.add(function() {\n return $el.css('display', 'flex');\n });\n this.animationFrame.add(function() {\n $el.addClass(\"open\");\n return $el.one(\"transitionend\", (function(_this) {\n return function() {\n return $el.find('input,textarea').first().focus();\n };\n })(this));\n });\n this.animationFrame.add((function(_this) {\n return function() {\n lightboxContent.show();\n return defered.resolve();\n };\n })(this));\n docEl = angular.element(document);\n docEl.on(\"keydown.lightbox\", (function(_this) {\n return function(e) {\n var code;\n code = e.keyCode ? e.keyCode : e.which;\n if (code === 27) {\n return _this.close($el);\n }\n };\n })(this));\n return defered.promise;\n };\n\n LightboxService.prototype.close = function($el) {\n var docEl, scope;\n docEl = angular.element(document);\n docEl.off(\".lightbox\");\n docEl.off(\".keyboard-navigation\");\n $el.one(\"transitionend\", (function(_this) {\n return function() {\n $el.removeAttr('style');\n return $el.removeClass(\"open\").removeClass('close');\n };\n })(this));\n $el.addClass('close');\n if ($el.hasClass(\"remove-on-close\")) {\n scope = $el.data(\"scope\");\n scope.$destroy();\n return $el.remove();\n }\n };\n\n LightboxService.prototype.closeAll = function() {\n var docEl, i, len, lightboxEl, ref, results;\n docEl = angular.element(document);\n ref = docEl.find(\".lightbox.open\");\n results = [];\n for (i = 0, len = ref.length; i < len; i++) {\n lightboxEl = ref[i];\n results.push(this.close($(lightboxEl)));\n }\n return results;\n };\n\n return LightboxService;\n\n })(taiga.Service);\n\n module.service(\"lightboxService\", [\"animationFrame\", \"$q\", LightboxService]);\n\n LightboxKeyboardNavigationService = (function(superClass) {\n extend(LightboxKeyboardNavigationService, superClass);\n\n function LightboxKeyboardNavigationService() {\n return LightboxKeyboardNavigationService.__super__.constructor.apply(this, arguments);\n }\n\n LightboxKeyboardNavigationService.prototype.stop = function() {\n var docEl;\n docEl = angular.element(document);\n return docEl.off(\".keyboard-navigation\");\n };\n\n LightboxKeyboardNavigationService.prototype.dispatch = function($el, code) {\n var activeElement, next, prev;\n activeElement = $el.find(\".selected\");\n if (code === 13) {\n if ($el.find(\".user-list-single\").length === 1) {\n return $el.find('.user-list-single:first').trigger(\"click\");\n } else {\n return activeElement.trigger(\"click\");\n }\n } else if (code === 40) {\n if (!activeElement.length) {\n return $el.find('.user-list-single:not(\".is-active\"):first').addClass('selected');\n } else {\n next = activeElement.next('.user-list-single');\n if (next.length) {\n activeElement.removeClass('selected');\n return next.addClass('selected');\n }\n }\n } else if (code === 38) {\n if (!activeElement.length) {\n return $el.find('.user-list-single:last').addClass('selected');\n } else {\n prev = activeElement.prev('.user-list-single:not(\".is-active\")');\n if (prev.length) {\n activeElement.removeClass('selected');\n return prev.addClass('selected');\n }\n }\n }\n };\n\n LightboxKeyboardNavigationService.prototype.init = function($el) {\n var docEl;\n this.stop();\n docEl = angular.element(document);\n return docEl.on(\"keydown.keyboard-navigation\", (function(_this) {\n return function(event) {\n var code;\n code = event.keyCode ? event.keyCode : event.which;\n if (code === 40 || code === 38 || code === 13) {\n event.preventDefault();\n return _this.dispatch($el, code);\n }\n };\n })(this));\n };\n\n return LightboxKeyboardNavigationService;\n\n })(taiga.Service);\n\n module.service(\"lightboxKeyboardNavigationService\", LightboxKeyboardNavigationService);\n\n LightboxDirective = function(lightboxService) {\n var link;\n link = function($scope, $el, $attrs) {\n return $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n return lightboxService.close($el);\n });\n };\n return {\n restrict: \"C\",\n link: link\n };\n };\n\n module.directive(\"lightbox\", [\"lightboxService\", LightboxDirective]);\n\n BlockLightboxDirective = function($rootscope, $tgrepo, $confirm, lightboxService, $loading, $qqueue, $translate) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var block, title, unblock;\n title = $translate.instant($attrs.title);\n $el.find(\"h2.title\").text(title);\n unblock = $qqueue.bindAdd((function(_this) {\n return function(item, finishCallback) {\n var promise;\n promise = $tgrepo.save(item);\n promise.then(function() {\n $confirm.notify(\"success\");\n $rootscope.$broadcast(\"object:updated\");\n $model.$setViewValue(item);\n return finishCallback();\n });\n promise.then(null, function() {\n $confirm.notify(\"error\");\n item.revert();\n return $model.$setViewValue(item);\n });\n promise[\"finally\"](function() {\n return finishCallback();\n });\n return promise;\n };\n })(this));\n block = $qqueue.bindAdd((function(_this) {\n return function(item) {\n var currentLoading, promise;\n $model.$setViewValue(item);\n currentLoading = $loading().target($el.find(\".button-green\")).start();\n promise = $tgrepo.save($model.$modelValue);\n promise.then(function() {\n $confirm.notify(\"success\");\n return $rootscope.$broadcast(\"object:updated\");\n });\n promise.then(null, function() {\n $confirm.notify(\"error\");\n item.revert();\n return $model.$setViewValue(item);\n });\n return promise[\"finally\"](function() {\n currentLoading.finish();\n return lightboxService.close($el);\n });\n };\n })(this));\n $scope.$on(\"block\", function() {\n $el.find(\".reason\").val($model.$modelValue.blocked_note);\n return lightboxService.open($el);\n });\n $scope.$on(\"unblock\", (function(_this) {\n return function(event, model, finishCallback) {\n var item;\n item = $model.$modelValue.clone();\n item.is_blocked = false;\n item.blocked_note = \"\";\n return unblock(item, finishCallback);\n };\n })(this));\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return $el.on(\"click\", \".button-green\", function(event) {\n var item;\n event.preventDefault();\n item = $model.$modelValue.clone();\n item.is_blocked = true;\n item.blocked_note = $el.find(\".reason\").val();\n return block(item);\n });\n };\n return {\n templateUrl: \"common/lightbox/lightbox-block.html\",\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgLbBlock\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"lightboxService\", \"$tgLoading\", \"$tgQqueue\", \"$translate\", BlockLightboxDirective]);\n\n BlockingMessageInputDirective = function($log, $template, $compile) {\n var link, template, templateFn;\n template = $template.get(\"common/lightbox/lightbox-blocking-message-input.html\", true);\n link = function($scope, $el, $attrs, $model) {\n if (!$attrs.watch) {\n return $log.error(\"No watch attribute on tg-blocking-message-input directive\");\n }\n return $scope.$watch($attrs.watch, function(value) {\n if (value === !void 0 && value === true) {\n return $el.find(\".blocked-note\").removeClass(\"hidden\");\n } else {\n return $el.find(\".blocked-note\").addClass(\"hidden\");\n }\n });\n };\n templateFn = function($el, $attrs) {\n return template({\n ngmodel: $attrs.ngModel\n });\n };\n return {\n template: templateFn,\n link: link,\n require: \"ngModel\",\n restrict: \"EA\"\n };\n };\n\n module.directive(\"tgBlockingMessageInput\", [\"$log\", \"$tgTemplate\", \"$compile\", BlockingMessageInputDirective]);\n\n CreateEditUserstoryDirective = function($repo, $model, $rs, $rootScope, lightboxService, $loading, $translate, $confirm, $q, attachmentsService) {\n var link;\n link = function($scope, $el, attrs) {\n var attachmentsToAdd, attachmentsToDelete, createAttachments, deleteAttachments, resetAttachments, submit, submitButton;\n $scope.createEditUs = {};\n $scope.isNew = true;\n attachmentsToAdd = Immutable.List();\n attachmentsToDelete = Immutable.List();\n resetAttachments = function() {\n attachmentsToAdd = Immutable.List();\n return attachmentsToDelete = Immutable.List();\n };\n $scope.addAttachment = function(attachment) {\n return attachmentsToAdd = attachmentsToAdd.push(attachment);\n };\n $scope.deleteAttachment = function(attachment) {\n return attachmentsToDelete = attachmentsToDelete.push(attachment);\n };\n $scope.$on(\"usform:new\", function(ctx, projectId, status, statusList) {\n $scope.isNew = true;\n $scope.usStatusList = statusList;\n $scope.attachments = Immutable.List();\n resetAttachments();\n $scope.us = $model.make_model(\"userstories\", {\n project: projectId,\n points: {},\n status: status,\n is_archived: false,\n tags: []\n });\n $el.find(\".button-green\").html($translate.instant(\"COMMON.CREATE\"));\n $el.find(\".title\").html($translate.instant(\"LIGHTBOX.CREATE_EDIT_US.NEW_US\"));\n $el.find(\".tag-input\").val(\"\");\n $el.find(\".blocked-note\").addClass(\"hidden\");\n $el.find(\"label.blocked\").removeClass(\"selected\");\n $el.find(\"label.team-requirement\").removeClass(\"selected\");\n $el.find(\"label.client-requirement\").removeClass(\"selected\");\n return lightboxService.open($el);\n });\n $scope.$on(\"usform:edit\", function(ctx, us, attachments) {\n $scope.us = us;\n $scope.attachments = Immutable.fromJS(attachments);\n $scope.isNew = false;\n resetAttachments();\n $el.find(\".button-green\").html($translate.instant(\"COMMON.SAVE\"));\n $el.find(\".title\").html($translate.instant(\"LIGHTBOX.CREATE_EDIT_US.EDIT_US\"));\n $el.find(\".tag-input\").val(\"\");\n if (us.is_blocked) {\n $el.find(\".blocked-note\").removeClass(\"hidden\");\n $el.find(\"label.blocked\").addClass(\"selected\");\n } else {\n $el.find(\".blocked-note\").addClass(\"hidden\");\n $el.find(\"label.blocked\").removeClass(\"selected\");\n }\n if (us.team_requirement) {\n $el.find(\"label.team-requirement\").addClass(\"selected\");\n } else {\n $el.find(\"label.team-requirement\").removeClass(\"selected\");\n }\n if (us.client_requirement) {\n $el.find(\"label.client-requirement\").addClass(\"selected\");\n } else {\n $el.find(\"label.client-requirement\").removeClass(\"selected\");\n }\n return lightboxService.open($el);\n });\n createAttachments = function(obj) {\n var promises;\n promises = _.map(attachmentsToAdd.toJS(), function(attachment) {\n return attachmentsService.upload(attachment.file, obj.id, $scope.us.project, 'us');\n });\n return $q.all(promises);\n };\n deleteAttachments = function(obj) {\n var promises;\n promises = _.map(attachmentsToDelete.toJS(), function(attachment) {\n return attachmentsService[\"delete\"](\"us\", attachment.id);\n });\n return $q.all(promises);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var broadcastEvent, currentLoading, form, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n if ($scope.isNew) {\n promise = $repo.create(\"userstories\", $scope.us);\n broadcastEvent = \"usform:new:success\";\n } else {\n promise = $repo.save($scope.us);\n broadcastEvent = \"usform:edit:success\";\n }\n promise.then(function(data) {\n deleteAttachments(data).then((function(_this) {\n return function() {\n return createAttachments(data);\n };\n })(this));\n return data;\n });\n promise.then(function(data) {\n currentLoading.finish();\n lightboxService.close($el);\n return $rootScope.$broadcast(broadcastEvent, data);\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n $scope.$apply(function() {\n return $scope.us.revert();\n });\n return lightboxService.close($el);\n });\n $el.keydown(function(event) {\n var code;\n code = event.keyCode ? event.keyCode : event.which;\n if (code === 27) {\n lightboxService.close($el);\n return $scope.$apply(function() {\n return $scope.us.revert();\n });\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateEditUserstory\", [\"$tgRepo\", \"$tgModel\", \"$tgResources\", \"$rootScope\", \"lightboxService\", \"$tgLoading\", \"$translate\", \"$tgConfirm\", \"$q\", \"tgAttachmentsService\", CreateEditUserstoryDirective]);\n\n CreateBulkUserstoriesDirective = function($repo, $rs, $rootscope, lightboxService, $loading) {\n var link;\n link = function($scope, $el, attrs) {\n var submit, submitButton;\n $scope.$on(\"usform:bulk\", function(ctx, projectId, status) {\n $scope[\"new\"] = {\n projectId: projectId,\n statusId: status,\n bulk: \"\"\n };\n return lightboxService.open($el);\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, form, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley({\n onlyOneErrorElement: true\n });\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $rs.userstories.bulkCreate($scope[\"new\"].projectId, $scope[\"new\"].statusId, $scope[\"new\"].bulk);\n promise.then(function(result) {\n currentLoading.finish();\n $rootscope.$broadcast(\"usform:bulk:success\", result);\n return lightboxService.close($el);\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateBulkUserstories\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", \"lightboxService\", \"$tgLoading\", CreateBulkUserstoriesDirective]);\n\n AssignedToLightboxDirective = function(lightboxService, lightboxKeyboardNavigationService, $template, $compile) {\n var link;\n link = function($scope, $el, $attrs) {\n var closeLightbox, filterUsers, normalizeString, render, selectedItem, selectedUser, usersTemplate;\n selectedUser = null;\n selectedItem = null;\n usersTemplate = $template.get(\"common/lightbox/lightbox-assigned-to-users.html\", true);\n normalizeString = function(string) {\n var normalizedString;\n normalizedString = string;\n normalizedString = normalizedString.replace(\"Á\", \"A\").replace(\"Ä\", \"A\").replace(\"À\", \"A\");\n normalizedString = normalizedString.replace(\"É\", \"E\").replace(\"Ë\", \"E\").replace(\"È\", \"E\");\n normalizedString = normalizedString.replace(\"Í\", \"I\").replace(\"Ï\", \"I\").replace(\"Ì\", \"I\");\n normalizedString = normalizedString.replace(\"Ó\", \"O\").replace(\"Ö\", \"O\").replace(\"Ò\", \"O\");\n normalizedString = normalizedString.replace(\"Ú\", \"U\").replace(\"Ü\", \"U\").replace(\"Ù\", \"U\");\n return normalizedString;\n };\n filterUsers = function(text, user) {\n var username;\n username = user.full_name_display.toUpperCase();\n username = normalizeString(username);\n text = text.toUpperCase();\n text = normalizeString(text);\n return _.contains(username, text);\n };\n render = function(selected, text) {\n var ctx, html, users;\n users = _.clone($scope.activeUsers, true);\n if (selected != null) {\n users = _.reject(users, {\n \"id\": selected.id\n });\n }\n if (text != null) {\n users = _.filter(users, _.partial(filterUsers, text));\n }\n ctx = {\n selected: selected,\n users: _.first(users, 5),\n showMore: users.length > 5\n };\n html = usersTemplate(ctx);\n html = $compile(html)($scope);\n return $el.find(\".assigned-to-list\").html(html);\n };\n closeLightbox = function() {\n lightboxKeyboardNavigationService.stop();\n return lightboxService.close($el);\n };\n $scope.$on(\"assigned-to:add\", function(ctx, item) {\n var assignedToId;\n selectedItem = item;\n assignedToId = item.assigned_to;\n selectedUser = $scope.usersById[assignedToId];\n render(selectedUser);\n return lightboxService.open($el).then(function() {\n $el.find('input').focus();\n return lightboxKeyboardNavigationService.init($el);\n });\n });\n $scope.$watch(\"usersSearch\", function(searchingText) {\n if (searchingText != null) {\n render(selectedUser, searchingText);\n return $el.find('input').focus();\n }\n });\n $el.on(\"click\", \".user-list-single\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n closeLightbox();\n return $scope.$apply(function() {\n $scope.$broadcast(\"assigned-to:added\", target.data(\"user-id\"), selectedItem);\n return $scope.usersSearch = null;\n });\n });\n $el.on(\"click\", \".remove-assigned-to\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n closeLightbox();\n return $scope.$apply(function() {\n $scope.usersSearch = null;\n return $scope.$broadcast(\"assigned-to:added\", null, selectedItem);\n });\n });\n $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n closeLightbox();\n return $scope.$apply(function() {\n return $scope.usersSearch = null;\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n templateUrl: \"common/lightbox/lightbox-assigned-to.html\",\n link: link\n };\n };\n\n module.directive(\"tgLbAssignedto\", [\"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", AssignedToLightboxDirective]);\n\n WatchersLightboxDirective = function($repo, lightboxService, lightboxKeyboardNavigationService, $template, $compile) {\n var link;\n link = function($scope, $el, $attrs) {\n var closeLightbox, getFilteredUsers, render, selectedItem, usersTemplate;\n selectedItem = null;\n usersTemplate = $template.get(\"common/lightbox/lightbox-assigned-to-users.html\", true);\n getFilteredUsers = function(text) {\n var _filterUsers, users;\n if (text == null) {\n text = \"\";\n }\n _filterUsers = function(text, user) {\n var username;\n if (selectedItem && _.find(selectedItem.watchers, function(x) {\n return x === user.id;\n })) {\n return false;\n }\n username = user.full_name_display.toUpperCase();\n text = text.toUpperCase();\n return _.contains(username, text);\n };\n users = _.clone($scope.activeUsers, true);\n users = _.filter(users, _.partial(_filterUsers, text));\n return users;\n };\n render = function(users) {\n var ctx, html;\n ctx = {\n selected: false,\n users: _.first(users, 5),\n showMore: users.length > 5\n };\n html = usersTemplate(ctx);\n html = $compile(html)($scope);\n return $el.find(\".ticket-watchers\").html(html);\n };\n closeLightbox = function() {\n lightboxKeyboardNavigationService.stop();\n return lightboxService.close($el);\n };\n $scope.$on(\"watcher:add\", function(ctx, item) {\n var users;\n selectedItem = item;\n users = getFilteredUsers();\n render(users);\n return lightboxService.open($el).then(function() {\n $el.find(\"input\").focus();\n return lightboxKeyboardNavigationService.init($el);\n });\n });\n $scope.$watch(\"usersSearch\", function(searchingText) {\n var users;\n if (searchingText == null) {\n return;\n }\n users = getFilteredUsers(searchingText);\n render(users);\n return $el.find(\"input\").focus();\n });\n $el.on(\"click\", \".user-list-single\", debounce(2000, function(event) {\n var target;\n closeLightbox();\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return $scope.$apply(function() {\n $scope.usersSearch = null;\n return $scope.$broadcast(\"watcher:added\", target.data(\"user-id\"));\n });\n }));\n $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n closeLightbox();\n return $scope.$apply(function() {\n return $scope.usersSearch = null;\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n templateUrl: \"common/lightbox/lightbox-users.html\",\n link: link\n };\n };\n\n module.directive(\"tgLbWatchers\", [\"$tgRepo\", \"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", WatchersLightboxDirective]);\n\n AttachmentPreviewLightboxDirective = function(lightboxService, $template, $compile) {\n var link;\n link = function($scope, $el, attrs) {\n return lightboxService.open($el);\n };\n return {\n templateUrl: 'common/lightbox/lightbox-attachment-preview.html',\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgLbAttachmentPreview\", [\"lightboxService\", \"$tgTemplate\", \"$compile\", AttachmentPreviewLightboxDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/loader.coffee\n */\n\n(function() {\n var Loader, LoaderDirective, module, sizeFormat, taiga, timeout;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n timeout = this.taiga.timeout;\n\n module = angular.module(\"taigaCommon\");\n\n LoaderDirective = function(tgLoader, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n tgLoader.onStart(function() {\n $(document.body).addClass(\"loader-active\");\n return $el.addClass(\"active\");\n });\n return tgLoader.onEnd(function() {\n $(document.body).removeClass(\"loader-active\");\n return $el.removeClass(\"active\");\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLoader\", [\"tgLoader\", \"$rootScope\", LoaderDirective]);\n\n Loader = function($rootscope) {\n var autoClose, config, lastResponseDate, open, pageLoaded, requestCount, start, startLoadTime;\n config = {\n minTime: 300\n };\n open = false;\n startLoadTime = 0;\n requestCount = 0;\n lastResponseDate = 0;\n pageLoaded = function(force) {\n var diff, endTime, timeoutValue;\n if (force == null) {\n force = false;\n }\n if (startLoadTime) {\n timeoutValue = 0;\n if (!force) {\n endTime = new Date().getTime();\n diff = endTime - startLoadTime;\n if (diff < config.minTime) {\n timeoutValue = config.minTime - diff;\n }\n }\n timeout(timeoutValue, function() {\n $rootscope.$broadcast(\"loader:end\");\n open = false;\n return window.prerenderReady = true;\n });\n }\n startLoadTime = 0;\n requestCount = 0;\n return lastResponseDate = 0;\n };\n autoClose = function() {\n var intervalAuto;\n return intervalAuto = setInterval((function() {\n if (lastResponseDate && requestCount === 0) {\n pageLoaded();\n return clearInterval(intervalAuto);\n }\n }), 50);\n };\n start = function() {\n startLoadTime = new Date().getTime();\n $rootscope.$broadcast(\"loader:start\");\n return open = true;\n };\n return {\n pageLoaded: pageLoaded,\n start: function(auto) {\n if (auto == null) {\n auto = false;\n }\n if (!open) {\n start();\n if (auto) {\n return autoClose();\n }\n }\n },\n onStart: function(fn) {\n return $rootscope.$on(\"loader:start\", fn);\n },\n onEnd: function(fn) {\n return $rootscope.$on(\"loader:end\", fn);\n },\n logRequest: function() {\n return requestCount++;\n },\n logResponse: function() {\n requestCount--;\n return lastResponseDate = new Date().getTime();\n }\n };\n };\n\n Loader.$inject = [\"$rootScope\"];\n\n module.factory(\"tgLoader\", Loader);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/lightboxes.coffee\n */\n\n(function() {\n var LoadingDirective, TgLoadingService, module,\n slice = [].slice;\n\n module = angular.module(\"taigaCommon\");\n\n TgLoadingService = function($compile) {\n var spinner;\n spinner = \"loading...\";\n return function() {\n var service;\n service = {\n settings: {\n target: null,\n scope: null,\n classes: [],\n timeout: 0,\n template: null\n },\n target: function(target) {\n service.settings.target = target;\n return service;\n },\n scope: function(scope) {\n service.settings.scope = scope;\n return service;\n },\n template: function(template) {\n service.settings.template = template;\n return service;\n },\n removeClasses: function() {\n var classess;\n classess = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n service.settings.classes = classess;\n return service;\n },\n timeout: function(timeout) {\n service.settings.timeout = timeout;\n return service;\n },\n start: function() {\n var target, timeoutId;\n target = service.settings.target;\n service.settings.classes.map(function(className) {\n return target.removeClass(className);\n });\n timeoutId = setTimeout((function() {\n if (!target.hasClass('loading')) {\n if (!service.settings.template) {\n service.settings.template = target.html();\n }\n target.addClass('loading');\n return target.html(spinner);\n }\n }), service.settings.timeout);\n service.settings.timeoutId = timeoutId;\n return service;\n },\n finish: function() {\n var removeClasses, target, timeoutId;\n target = service.settings.target;\n timeoutId = service.settings.timeoutId;\n if (timeoutId) {\n clearTimeout(timeoutId);\n removeClasses = service.settings.classes;\n removeClasses.map(function(className) {\n return service.settings.target.addClass(className);\n });\n target.html(service.settings.template);\n target.removeClass('loading');\n if (service.settings.scope) {\n $compile(target.contents())(service.settings.scope);\n }\n }\n return service;\n }\n };\n return service;\n };\n };\n\n TgLoadingService.$inject = [\"$compile\"];\n\n module.factory(\"$tgLoading\", TgLoadingService);\n\n LoadingDirective = function($loading) {\n var link;\n link = function($scope, $el, attr) {\n var currentLoading, template;\n currentLoading = null;\n template = $el.html();\n return $scope.$watch(attr.tgLoading, (function(_this) {\n return function(showLoading) {\n if (showLoading) {\n return currentLoading = $loading().target($el).timeout(100).template(template).scope($scope).start();\n } else if (currentLoading) {\n return currentLoading.finish();\n }\n };\n })(this));\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLoading\", [\"$tgLoading\", LoadingDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/popovers.coffee\n */\n\n(function() {\n var RelatedTaskStatusDirective, UsStatusDirective, bindOnce, debounce, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaCommon\");\n\n UsStatusDirective = function($repo, $template) {\n\n /*\n Print the status of a US and a popover to change it.\n - tg-us-status: The user story\n - on-update: Method call after US is updated\n \n Example:\n \n div.status(tg-us-status=\"us\" on-update=\"ctrl.loadSprintState()\")\n a.us-status(href=\"\", title=\"Status Name\")\n \n NOTE: This directive need 'usStatusById' and 'project'.\n */\n var link, template;\n template = $template.get(\"common/popover/popover-us-status.html\", true);\n link = function($scope, $el, $attrs) {\n var $ctrl, render, us;\n $ctrl = $el.controller();\n render = function(us) {\n var usStatusById, usStatusDom, usStatusDomParent;\n usStatusDomParent = $el.find(\".us-status\");\n usStatusDom = $el.find(\".us-status .us-status-bind\");\n usStatusById = $scope.usStatusById;\n if (usStatusById[us.status]) {\n usStatusDom.text(usStatusById[us.status].name);\n return usStatusDomParent.css(\"color\", usStatusById[us.status].color);\n }\n };\n $el.on(\"click\", \".us-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", debounce(2000, function(event) {\n var target, us;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n us = $scope.$eval($attrs.tgUsStatus);\n us.status = target.data(\"status-id\");\n render(us);\n $el.find(\".pop-status\").popover().close();\n return $scope.$apply(function() {\n return $repo.save(us).then(function() {\n return $scope.$eval($attrs.onUpdate);\n });\n });\n }));\n $scope.$on(\"userstories:loaded\", function() {\n return render($scope.$eval($attrs.tgUsStatus));\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n us = $scope.$eval($attrs.tgUsStatus);\n render(us);\n return bindOnce($scope, \"project\", function(project) {\n var html;\n html = template({\n \"statuses\": project.us_statuses\n });\n $el.append(html);\n if ($scope.project.my_permissions.indexOf(\"modify_us\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUsStatus\", [\"$tgRepo\", \"$tgTemplate\", UsStatusDirective]);\n\n RelatedTaskStatusDirective = function($repo, $template) {\n\n /*\n Print the status of a related task and a popover to change it.\n - tg-related-task-status: The related task\n - on-update: Method call after US is updated\n \n Example:\n \n div.status(tg-related-task-status=\"task\" on-update=\"ctrl.loadSprintState()\")\n a.task-status(href=\"\", title=\"Status Name\")\n \n NOTE: This directive need 'taskStatusById' and 'project'.\n */\n var link, selectionTemplate, updateTaskStatus;\n selectionTemplate = $template.get(\"common/popover/popover-related-task-status.html\", true);\n updateTaskStatus = function($el, task, taskStatusById) {\n var taskStatusDom, taskStatusDomParent;\n taskStatusDomParent = $el.find(\".us-status\");\n taskStatusDom = $el.find(\".task-status .task-status-bind\");\n if (taskStatusById[task.status]) {\n taskStatusDom.text(taskStatusById[task.status].name);\n return taskStatusDomParent.css('color', taskStatusById[task.status].color);\n }\n };\n link = function($scope, $el, $attrs) {\n var $ctrl, autoSave, notAutoSave, task;\n $ctrl = $el.controller();\n task = $scope.$eval($attrs.tgRelatedTaskStatus);\n notAutoSave = $scope.$eval($attrs.notAutoSave);\n autoSave = !notAutoSave;\n $el.on(\"click\", \".task-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", debounce(2000, function(event) {\n var target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n task.status = target.data(\"status-id\");\n $el.find(\".pop-status\").popover().close();\n updateTaskStatus($el, task, $scope.taskStatusById);\n if (autoSave) {\n return $scope.$apply(function() {\n return $repo.save(task).then(function() {\n $scope.$eval($attrs.onUpdate);\n return $scope.$emit(\"related-tasks:status-changed\");\n });\n });\n }\n }));\n taiga.bindOnce($scope, \"project\", function(project) {\n $el.append(selectionTemplate({\n 'statuses': project.task_statuses\n }));\n updateTaskStatus($el, task, $scope.taskStatusById);\n if (project.my_permissions.indexOf(\"modify_task\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRelatedTaskStatus\", [\"$tgRepo\", \"$tgTemplate\", RelatedTaskStatusDirective]);\n\n $.fn.popover = function() {\n var $el, close, closeAll, closePopover, isVisible, open;\n $el = this;\n isVisible = (function(_this) {\n return function() {\n var docViewBottom, docViewLeft, docViewRight, docViewTop, docViewWidth, elemBottom, elemLeft, elemRight, elemTop, elemWidth;\n $el.css({\n \"display\": \"block\",\n \"visibility\": \"hidden\"\n });\n docViewTop = $(window).scrollTop();\n docViewBottom = docViewTop + $(window).height();\n docViewWidth = $(window).width();\n docViewRight = docViewWidth;\n docViewLeft = 0;\n elemTop = $el.offset().top;\n elemBottom = elemTop + $el.height();\n elemWidth = $el.width();\n elemLeft = $el.offset().left;\n elemRight = $el.offset().left + elemWidth;\n $el.css({\n \"display\": \"none\",\n \"visibility\": \"visible\"\n });\n return (elemBottom <= docViewBottom) && (elemTop >= docViewTop) && (elemLeft >= docViewLeft) && (elemRight <= docViewRight);\n };\n })(this);\n closePopover = (function(_this) {\n return function(onClose) {\n if (onClose) {\n onClose.call($el);\n }\n $el.fadeOut(function() {\n return $el.removeClass(\"active\").removeClass(\"fix\");\n });\n return $el.off(\"popup:close\");\n };\n })(this);\n closeAll = (function(_this) {\n return function() {\n return $(\".popover.active\").each(function() {\n return $(this).trigger(\"popup:close\");\n });\n };\n })(this);\n open = (function(_this) {\n return function(onClose) {\n if ($el.hasClass(\"active\")) {\n return close();\n } else {\n closeAll();\n if (!isVisible()) {\n $el.addClass(\"fix\");\n }\n $el.fadeIn(function() {\n $el.addClass(\"active\");\n $(document.body).off(\"popover\");\n return $(document.body).one(\"click.popover\", function() {\n return closeAll();\n });\n });\n return $el.on(\"popup:close\", function(e) {\n return closePopover(onClose);\n });\n }\n };\n })(this);\n close = (function(_this) {\n return function() {\n return $el.trigger(\"popup:close\");\n };\n })(this);\n return {\n open: open,\n close: close,\n closeAll: closeAll\n };\n };\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/raven-logger.coffee\n */\n\n(function() {\n var ExceptionHandlerFactory, module, taiga;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\");\n\n ExceptionHandlerFactory = function($log, config) {\n var ravenConfig;\n this.config = config;\n ravenConfig = this.config.get(\"ravenConfig\", null);\n if (ravenConfig) {\n $log.debug(\"Using the RavenJS exception handler.\");\n Raven.config(ravenConfig).install();\n return function(exception, cause) {\n $log.error.apply($log, arguments);\n return Raven.captureException(exception);\n };\n } else {\n $log.debug(\"Using the default logging exception handler.\");\n return function(exception, cause) {\n return $log.error.apply($log, arguments);\n };\n }\n };\n\n module.factory(\"$exceptionHandler\", [\"$log\", \"$tgConfig\", ExceptionHandlerFactory]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/tags.coffee\n */\n\n(function() {\n var ColorizeTagsDirective, LbTagLineDirective, TagLineDirective, TagsDirective, bindOnce, module, taiga, trim,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n taiga = this.taiga;\n\n trim = this.taiga.trim;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaCommon\");\n\n TagsDirective = function() {\n var formatter, link, parser;\n formatter = function(v) {\n if (_.isArray(v)) {\n return v.join(\", \");\n }\n return \"\";\n };\n parser = function(v) {\n var result;\n if (!v) {\n return [];\n }\n result = _(v.split(\",\")).map(function(x) {\n return _.str.trim(x);\n });\n return result.value();\n };\n link = function($scope, $el, $attrs, $ctrl) {\n $ctrl.$formatters.push(formatter);\n $ctrl.$parsers.push(parser);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n require: \"ngModel\",\n link: link\n };\n };\n\n module.directive(\"tgTags\", TagsDirective);\n\n ColorizeTagsDirective = function() {\n var link, templates;\n templates = {\n backlog: _.template(\"<% _.each(tags, function(tag) { %>\\n \\\"><%- tag.name %>\\n<% }) %>\"),\n kanban: _.template(\"<% _.each(tags, function(tag) { %>\\n \\\" title=\\\"<%- tag.name %>\\\" />\\n<% }) %>\"),\n taskboard: _.template(\"<% _.each(tags, function(tag) { %>\\n \\\" title=\\\"<%- tag.name %>\\\" />\\n<% }) %>\")\n };\n link = function($scope, $el, $attrs, $ctrl) {\n var render;\n render = function(srcTags) {\n var html, tags, template;\n template = templates[$attrs.tgColorizeTagsType];\n srcTags.sort();\n tags = _.map(srcTags, function(tag) {\n var color;\n color = $scope.project.tags_colors[tag];\n return {\n name: tag,\n color: color\n };\n });\n html = template({\n tags: tags\n });\n return $el.html(html);\n };\n $scope.$watch($attrs.tgColorizeTags, function(tags) {\n if (tags != null) {\n return render(tags);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgColorizeTags\", ColorizeTagsDirective);\n\n LbTagLineDirective = function($rs, $template, $compile) {\n var COMMA_KEY, ENTER_KEY, link, templateTags;\n ENTER_KEY = 13;\n COMMA_KEY = 188;\n templateTags = $template.get(\"common/tag/lb-tag-line-tags.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var addValue, deleteValue, hideSaveButton, renderTags, resetInput, saveInputTag, showSaveButton;\n renderTags = function(tags, tagsColors) {\n var ctx, html;\n ctx = {\n tags: _.map(tags, function(t) {\n return {\n name: t,\n color: tagsColors[t]\n };\n })\n };\n _.map(ctx.tags, (function(_this) {\n return function(tag) {\n if (tag.color) {\n return tag.style = \"border-left: 5px solid \" + tag.color;\n }\n };\n })(this));\n html = $compile(templateTags(ctx))($scope);\n return $el.find(\"div.tags-container\").html(html);\n };\n showSaveButton = function() {\n return $el.find(\".save\").removeClass(\"hidden\");\n };\n hideSaveButton = function() {\n return $el.find(\".save\").addClass(\"hidden\");\n };\n resetInput = function() {\n $el.find(\"input\").val(\"\");\n return $el.find(\"input\").autocomplete(\"close\");\n };\n addValue = function(value) {\n var tags;\n value = trim(value.toLowerCase());\n if (value.length === 0) {\n return;\n }\n tags = _.clone($model.$modelValue, false);\n if (tags == null) {\n tags = [];\n }\n if (indexOf.call(tags, value) < 0) {\n tags.push(value);\n }\n $scope.$apply(function() {\n return $model.$setViewValue(tags);\n });\n return hideSaveButton();\n };\n deleteValue = function(value) {\n var tags;\n value = trim(value.toLowerCase());\n if (value.length === 0) {\n return;\n }\n tags = _.clone($model.$modelValue, false);\n tags = _.pull(tags, value);\n return $scope.$apply(function() {\n return $model.$setViewValue(tags);\n });\n };\n saveInputTag = function() {\n var value;\n value = $el.find(\"input\").val();\n addValue(value);\n return resetInput();\n };\n $el.on(\"keypress\", \"input\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n if (event.keyCode === ENTER_KEY) {\n event.preventDefault();\n return saveInputTag();\n } else if (String.fromCharCode(event.keyCode) === ',') {\n event.preventDefault();\n return saveInputTag();\n } else {\n if (target.val().length) {\n return showSaveButton();\n } else {\n return hideSaveButton();\n }\n }\n });\n $el.on(\"click\", \".save\", function(event) {\n event.preventDefault();\n return saveInputTag();\n });\n $el.on(\"click\", \".icon-delete\", function(event) {\n var target, value;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n value = target.siblings(\".tag-name\").text();\n return deleteValue(value);\n });\n bindOnce($scope, \"project\", function(project) {\n var positioningFunction;\n positioningFunction = function(position, elements) {\n var menu;\n menu = elements.element.element;\n menu.css(\"width\", elements.target.width);\n menu.css(\"top\", position.top);\n return menu.css(\"left\", position.left);\n };\n return $el.find(\"input\").autocomplete({\n source: _.keys(project.tags_colors),\n position: {\n my: \"left top\",\n using: positioningFunction\n },\n select: function(event, ui) {\n addValue(ui.item.value);\n return ui.item.value = \"\";\n }\n });\n });\n $scope.$watch($attrs.ngModel, function(tags) {\n var ref, tagsColors;\n tagsColors = ((ref = $scope.project) != null ? ref.tags_colors : void 0) || [];\n return renderTags(tags, tagsColors);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\",\n templateUrl: \"common/tag/lb-tag-line.html\"\n };\n };\n\n module.directive(\"tgLbTagLine\", [\"$tgResources\", \"$tgTemplate\", \"$compile\", LbTagLineDirective]);\n\n TagLineDirective = function($rootScope, $repo, $rs, $confirm, $qqueue, $template, $compile) {\n var COMMA_KEY, ENTER_KEY, ESC_KEY, link, templateTags;\n ENTER_KEY = 13;\n ESC_KEY = 27;\n COMMA_KEY = 188;\n templateTags = $template.get(\"common/tag/tags-line-tags.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var addValue, deleteValue, hideAddTagButton, hideAddTagButtonText, hideInput, hideSaveButton, isEditable, renderInReadModeOnly, renderTags, resetInput, saveInputTag, showAddTagButton, showAddTagButtonText, showInput, showSaveButton;\n isEditable = function() {\n if ($attrs.requiredPerm != null) {\n return $scope.project.my_permissions.indexOf($attrs.requiredPerm) !== -1;\n }\n return true;\n };\n renderTags = function(tags, tagsColors) {\n var ctx, html;\n ctx = {\n tags: _.map(tags, function(t) {\n return {\n name: t,\n color: tagsColors[t]\n };\n }),\n isEditable: isEditable()\n };\n html = $compile(templateTags(ctx))($scope);\n return $el.find(\"div.tags-container\").html(html);\n };\n renderInReadModeOnly = function() {\n $el.find(\".add-tag\").remove();\n $el.find(\"input\").remove();\n return $el.find(\".save\").remove();\n };\n showAddTagButton = function() {\n return $el.find(\".add-tag\").removeClass(\"hidden\");\n };\n hideAddTagButton = function() {\n return $el.find(\".add-tag\").addClass(\"hidden\");\n };\n showAddTagButtonText = function() {\n return $el.find(\".add-tag-text\").removeClass(\"hidden\");\n };\n hideAddTagButtonText = function() {\n return $el.find(\".add-tag-text\").addClass(\"hidden\");\n };\n showSaveButton = function() {\n return $el.find(\".save\").removeClass(\"hidden\");\n };\n hideSaveButton = function() {\n return $el.find(\".save\").addClass(\"hidden\");\n };\n showInput = function() {\n return $el.find(\"input\").removeClass(\"hidden\").focus();\n };\n hideInput = function() {\n return $el.find(\"input\").addClass(\"hidden\").blur();\n };\n resetInput = function() {\n $el.find(\"input\").val(\"\");\n return $el.find(\"input\").autocomplete(\"close\");\n };\n addValue = $qqueue.bindAdd(function(value) {\n var model, onError, onSuccess, tags;\n value = trim(value.toLowerCase());\n if (value.length === 0) {\n return;\n }\n tags = _.clone($model.$modelValue.tags, false);\n if (tags == null) {\n tags = [];\n }\n if (indexOf.call(tags, value) < 0) {\n tags.push(value);\n }\n model = $model.$modelValue.clone();\n model.tags = tags;\n $model.$setViewValue(model);\n onSuccess = function() {\n return $rootScope.$broadcast(\"object:updated\");\n };\n onError = function() {\n $confirm.notify(\"error\");\n model.revert();\n return $model.$setViewValue(model);\n };\n hideSaveButton();\n return $repo.save(model).then(onSuccess, onError);\n });\n deleteValue = $qqueue.bindAdd(function(value) {\n var model, onError, onSuccess, tags;\n value = trim(value.toLowerCase());\n if (value.length === 0) {\n return;\n }\n tags = _.clone($model.$modelValue.tags, false);\n tags = _.pull(tags, value);\n model = $model.$modelValue.clone();\n model.tags = tags;\n $model.$setViewValue(model);\n onSuccess = function() {\n return $rootScope.$broadcast(\"object:updated\");\n };\n onError = function() {\n $confirm.notify(\"error\");\n model.revert();\n return $model.$setViewValue(model);\n };\n return $repo.save(model).then(onSuccess, onError);\n });\n saveInputTag = function() {\n var value;\n value = $el.find(\"input\").val();\n addValue(value);\n return resetInput();\n };\n $el.on(\"keypress\", \"input\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n if (event.keyCode === ENTER_KEY) {\n return saveInputTag();\n } else if (String.fromCharCode(event.keyCode) === ',') {\n event.preventDefault();\n return saveInputTag();\n } else {\n if (target.val().length) {\n return showSaveButton();\n } else {\n return hideSaveButton();\n }\n }\n });\n $el.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === ESC_KEY) {\n resetInput();\n hideInput();\n hideSaveButton();\n return showAddTagButton();\n }\n });\n $el.on(\"click\", \".save\", function(event) {\n event.preventDefault();\n return saveInputTag();\n });\n $el.on(\"click\", \".add-tag\", function(event) {\n event.preventDefault();\n hideAddTagButton();\n return showInput();\n });\n $el.on(\"click\", \".icon-delete\", function(event) {\n var target, value;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n value = target.siblings(\".tag-name\").text();\n return deleteValue(value);\n });\n bindOnce($scope, \"project.tags_colors\", function(tags_colors) {\n var positioningFunction;\n if (!isEditable()) {\n renderInReadModeOnly();\n return;\n }\n showAddTagButton();\n positioningFunction = function(position, elements) {\n var menu;\n menu = elements.element.element;\n menu.css(\"width\", elements.target.width);\n menu.css(\"top\", position.top);\n return menu.css(\"left\", position.left);\n };\n return $el.find(\"input\").autocomplete({\n source: _.keys(tags_colors),\n position: {\n my: \"left top\",\n using: positioningFunction\n },\n select: function(event, ui) {\n addValue(ui.item.value);\n return ui.item.value = \"\";\n }\n });\n });\n $scope.$watch($attrs.ngModel, function(model) {\n var ref, ref1, tagsColors;\n if (!model) {\n return;\n }\n if ((ref = model.tags) != null ? ref.length : void 0) {\n hideAddTagButtonText();\n } else {\n showAddTagButtonText();\n }\n tagsColors = ((ref1 = $scope.project) != null ? ref1.tags_colors : void 0) || [];\n return renderTags(model.tags, tagsColors);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\",\n templateUrl: \"common/tag/tag-line.html\"\n };\n };\n\n module.directive(\"tgTagLine\", [\"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", TagLineDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/wisiwyg.coffee\n */\n\n(function() {\n var MarkitupDirective, bindOnce, module, taiga,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaCommon\");\n\n MarkitupDirective = function($rootscope, $rs, $selectedText, $template, $compile, $translate) {\n var link, previewTemplate;\n previewTemplate = $template.get(\"common/wysiwyg/wysiwyg-markitup-preview.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var addLine, cancelablePromise, closePreviewMode, element, markdownTitle, prepareUrlFormatting, preview, previewDomNode, renderMarkItUp, setCaretPosition, unbind, urlFormatting;\n element = angular.element($el);\n previewDomNode = $(\"
\", {\n \"class\": \"preview\"\n });\n closePreviewMode = function() {\n element.parents(\".markdown\").find(\".preview\").remove();\n return element.parents(\".markItUp\").show();\n };\n $scope.$on(\"markdown-editor:submit\", function() {\n return closePreviewMode();\n });\n cancelablePromise = null;\n preview = function() {\n var markItUpDomNode, markdownDomNode;\n markdownDomNode = element.parents(\".markdown\");\n markItUpDomNode = element.parents(\".markItUp\");\n return $rs.mdrender.render($scope.projectId, $model.$modelValue).then(function(data) {\n var html, markdown;\n html = previewTemplate({\n data: data.data\n });\n html = $compile(html)($scope);\n markdownDomNode.append(html);\n markItUpDomNode.hide();\n markdown = element.closest(\".markdown\");\n return markdown.on(\"mouseup.preview\", \".preview\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.target);\n if (!target.is('a') && $selectedText.get().length) {\n return;\n }\n markdown.off(\".preview\");\n return closePreviewMode();\n });\n });\n };\n setCaretPosition = function(textarea, caretPosition) {\n var line, range, scrollRelation, totalLines;\n if (textarea.createTextRange) {\n range = textarea.createTextRange();\n range.move(\"character\", caretPosition);\n range.select();\n } else if (textarea.selectionStart) {\n textarea.focus();\n textarea.setSelectionRange(caretPosition, caretPosition);\n }\n totalLines = textarea.value.split(\"\\n\").length;\n line = textarea.value.slice(0, +(caretPosition - 1) + 1 || 9e9).split(\"\\n\").length;\n scrollRelation = line / totalLines;\n return $el.scrollTop((scrollRelation * $el[0].scrollHeight) - ($el.height() / 2));\n };\n addLine = function(textarea, nline, replace) {\n var cursorPosition, j, key, len, line, lines;\n lines = textarea.value.split(\"\\n\");\n if (replace) {\n lines[nline] = replace + lines[nline];\n } else {\n lines[nline] = \"\";\n }\n cursorPosition = 0;\n for (key = j = 0, len = lines.length; j < len; key = ++j) {\n line = lines[key];\n cursorPosition += line.length + 1 || 1;\n if (key === nline) {\n break;\n }\n }\n textarea.value = lines.join(\"\\n\");\n if (replace) {\n return cursorPosition - lines[nline].length + replace.length - 1;\n } else {\n return cursorPosition;\n }\n };\n prepareUrlFormatting = function(markItUp) {\n var indices, regex, result;\n regex = /(<<<|>>>)/gi;\n result = 0;\n indices = [];\n while ((result = regex.exec(markItUp.textarea.value))) {\n indices.push(result.index);\n }\n return markItUp.donotparse = indices;\n };\n urlFormatting = function(markItUp) {\n var endIndex, ref, ref1, regex, result, startIndex, url, value;\n regex = /<<>>/gi;\n endIndex = 0;\n while (true) {\n result = regex.exec(markItUp.textarea.value);\n if (!result) {\n break;\n }\n if (ref1 = result.index, indexOf.call(markItUp.donotparse, ref1) < 0) {\n endIndex = result.index;\n break;\n }\n }\n value = markItUp.textarea.value;\n url = value.substring(startIndex, endIndex).replace('<<<', '').replace('>>>', '');\n url = url.replace('(', '%28').replace(')', '%29');\n url = url.replace('[', '%5B').replace(']', '%5D');\n value = value.substring(0, startIndex) + url + value.substring(endIndex + 3, value.length);\n markItUp.textarea.value = value;\n return markItUp.donotparse = void 0;\n };\n markdownTitle = function(markItUp, char) {\n var heading, i, j, n, ref;\n heading = \"\";\n n = $.trim(markItUp.selection || markItUp.placeHolder).length;\n for (i = j = 0, ref = n - 1; 0 <= ref ? j <= ref : j >= ref; i = 0 <= ref ? ++j : --j) {\n heading += char;\n }\n return \"\\n\" + heading + \"\\n\";\n };\n renderMarkItUp = function() {\n var markdownSettings;\n markdownSettings = {\n nameSpace: \"markdown\",\n onShiftEnter: {\n keepDefault: false,\n openWith: \"\\n\\n\"\n },\n onEnter: {\n keepDefault: false,\n replaceWith: function() {\n if (!$('.textcomplete-dropdown').is(':visible')) {\n return \"\\n\";\n }\n },\n afterInsert: function(data) {\n var cursorLine, emptyListItem, lastLine, lines, markdownCaretPositon, match, newLineContent, nline, replace;\n lines = data.textarea.value.split(\"\\n\");\n if (data.caretPosition > 0) {\n cursorLine = data.textarea.value.slice(0, +(data.caretPosition - 1) + 1 || 9e9).split(\"\\n\").length;\n } else {\n cursorLine = 1;\n }\n newLineContent = data.textarea.value.slice(data.caretPosition).split(\"\\n\")[0];\n lastLine = lines[cursorLine - 1];\n match = lastLine.match(/^(\\s*- ).*/);\n if (match) {\n emptyListItem = lastLine.match(/^(\\s*)\\-\\s$/);\n if (emptyListItem) {\n nline = cursorLine - 1;\n replace = null;\n } else {\n nline = cursorLine;\n replace = \"\" + match[1];\n }\n markdownCaretPositon = addLine(data.textarea, nline, replace);\n }\n match = lastLine.match(/^(\\s*\\* ).*/);\n if (match) {\n emptyListItem = lastLine.match(/^(\\s*\\* )$/);\n if (emptyListItem) {\n nline = cursorLine - 1;\n replace = null;\n } else {\n nline = cursorLine;\n replace = \"\" + match[1];\n }\n markdownCaretPositon = addLine(data.textarea, nline, replace);\n }\n match = lastLine.match(/^(\\s*)(\\d+)\\.\\s/);\n if (match) {\n emptyListItem = lastLine.match(/^(\\s*)(\\d+)\\.\\s$/);\n if (emptyListItem) {\n nline = cursorLine - 1;\n replace = null;\n } else {\n nline = cursorLine;\n replace = (match[1] + (parseInt(match[2], 10) + 1)) + \". \";\n }\n markdownCaretPositon = addLine(data.textarea, nline, replace);\n }\n if (markdownCaretPositon) {\n return setCaretPosition(data.textarea, markdownCaretPositon);\n }\n }\n },\n markupSet: [\n {\n name: $translate.instant(\"COMMON.WYSIWYG.H1_BUTTON\"),\n key: \"1\",\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.H1_SAMPLE_TEXT\"),\n closeWith: function(markItUp) {\n return markdownTitle(markItUp, \"=\");\n }\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.H2_BUTTON\"),\n key: \"2\",\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.H2_SAMPLE_TEXT\"),\n closeWith: function(markItUp) {\n return markdownTitle(markItUp, \"-\");\n }\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.H3_BUTTON\"),\n key: \"3\",\n openWith: \"### \",\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.H3_SAMPLE_TEXT\")\n }, {\n separator: \"---------------\"\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.BOLD_BUTTON\"),\n key: \"B\",\n openWith: \"**\",\n closeWith: \"**\",\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.BOLD_BUTTON_SAMPLE_TEXT\")\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.ITALIC_SAMPLE_TEXT\"),\n key: \"I\",\n openWith: \"_\",\n closeWith: \"_\",\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.ITALIC_SAMPLE_TEXT\")\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.STRIKE_BUTTON\"),\n key: \"S\",\n openWith: \"~~\",\n closeWith: \"~~\",\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.STRIKE_SAMPLE_TEXT\")\n }, {\n separator: \"---------------\"\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.BULLETED_LIST_BUTTON\"),\n openWith: \"- \",\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.BULLETED_LIST_SAMPLE_TEXT\")\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.NUMERIC_LIST_BUTTON\"),\n openWith: function(markItUp) {\n return markItUp.line + \". \";\n },\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.NUMERIC_LIST_SAMPLE_TEXT\")\n }, {\n separator: \"---------------\"\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.PICTURE_BUTTON\"),\n key: \"P\",\n openWith: \"![\",\n closeWith: '](<<<[![Url:!:http://]!]>>> \"[![Title]!]\")',\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.PICTURE_SAMPLE_TEXT\"),\n beforeInsert: function(markItUp) {\n return prepareUrlFormatting(markItUp);\n },\n afterInsert: function(markItUp) {\n return urlFormatting(markItUp);\n }\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.LINK_BUTTON\"),\n key: \"L\",\n openWith: \"[\",\n closeWith: '](<<<[![Url:!:http://]!]>>> \"[![Title]!]\")',\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.LINK_SAMPLE_TEXT\"),\n beforeInsert: function(markItUp) {\n return prepareUrlFormatting(markItUp);\n },\n afterInsert: function(markItUp) {\n return urlFormatting(markItUp);\n }\n }, {\n separator: \"---------------\"\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.QUOTE_BLOCK_BUTTON\"),\n openWith: \"> \",\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.QUOTE_BLOCK_SAMPLE_TEXT\")\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.CODE_BLOCK_BUTTON\"),\n openWith: \"```\\n\",\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.CODE_BLOCK_SAMPLE_TEXT\"),\n closeWith: \"\\n```\"\n }, {\n separator: \"---------------\"\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.PREVIEW_BUTTON\"),\n call: preview,\n className: \"preview-icon\"\n }\n ],\n afterInsert: function(event) {\n var target;\n target = angular.element(event.textarea);\n return $model.$setViewValue(target.val());\n }\n };\n return element.markItUpRemove().markItUp(markdownSettings).textcomplete([\n {\n cache: true,\n match: /(^|\\s)#([a-z0-9]+)$/i,\n search: function(term, callback) {\n var filter, searchProps, searchTypes;\n term = taiga.slugify(term);\n searchTypes = ['issues', 'tasks', 'userstories'];\n searchProps = ['ref', 'subject'];\n filter = (function(_this) {\n return function(item) {\n var j, len, prop;\n for (j = 0, len = searchProps.length; j < len; j++) {\n prop = searchProps[j];\n if (taiga.slugify(item[prop]).indexOf(term) >= 0) {\n return true;\n }\n }\n return false;\n };\n })(this);\n if (cancelablePromise) {\n cancelablePromise.abort();\n }\n cancelablePromise = $rs.search[\"do\"]($scope.projectId, term);\n cancelablePromise.then((function(_this) {\n return function(res) {\n var j, len, results, type;\n if (res.count < 1 || res.count === res.wikipages.length) {\n return callback([]);\n } else {\n results = [];\n for (j = 0, len = searchTypes.length; j < len; j++) {\n type = searchTypes[j];\n if (res[type] && res[type].length > 0) {\n results.push(callback(res[type].filter(filter), true));\n } else {\n results.push(void 0);\n }\n }\n return results;\n }\n };\n })(this));\n return callback([]);\n },\n replace: function(res) {\n return \"$1\\#\" + res.ref + \" \";\n },\n template: function(res, term) {\n return \"\\#\" + res.ref + \" - \" + res.subject;\n }\n }, {\n cache: true,\n match: /(^|\\s)@([a-z0-9\\-\\._]{2,})$/i,\n search: function(term, callback) {\n var searchProps, username;\n username = taiga.slugify(term);\n searchProps = ['username', 'full_name', 'full_name_display'];\n if ($scope.project.members.length < 1) {\n return callback([]);\n } else {\n return callback($scope.project.members.filter((function(_this) {\n return function(user) {\n var j, len, prop;\n for (j = 0, len = searchProps.length; j < len; j++) {\n prop = searchProps[j];\n if (taiga.slugify(user[prop]).indexOf(username) >= 0) {\n return true;\n }\n }\n return false;\n };\n })(this)));\n }\n },\n replace: function(user) {\n return \"$1@\" + user.username + \" \";\n },\n template: function(user) {\n return user.username + \" - \" + user.full_name_display;\n }\n }, {\n cache: true,\n match: /(^|\\s)\\[\\[([a-z0-9\\-]+)$/i,\n search: function(term, callback) {\n term = taiga.slugify(term);\n return $rs.search[\"do\"]($scope.projectId, term).then((function(_this) {\n return function(res) {\n if (res.count < 1) {\n callback([]);\n }\n if (res.count < 1 || !res.wikipages || res.wikipages.length <= 0) {\n callback([]);\n } else {\n callback(res.wikipages.filter(function(page) {\n return taiga.slugify(page['slug']).indexOf(term) >= 0;\n }), true);\n }\n return callback([]);\n };\n })(this));\n },\n replace: function(res) {\n return \"$1[[\" + res.slug + \"]]\";\n },\n template: function(res, term) {\n return res.slug;\n }\n }\n ], {\n debounce: 200\n });\n };\n renderMarkItUp();\n unbind = $rootscope.$on(\"$translateChangeEnd\", renderMarkItUp);\n element.on(\"keypress\", function(event) {\n return $scope.$apply();\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return unbind();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgMarkitup\", [\"$rootScope\", \"$tgResources\", \"$selectedText\", \"$tgTemplate\", \"$compile\", \"$translate\", MarkitupDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog/main.coffee\n */\n\n(function() {\n var BacklogFiltersDirective, bindOnce, debounceLeading, groupBy, mixOf, module, scopeDefer, taiga, toggleText;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n debounceLeading = this.taiga.debounceLeading;\n\n module = angular.module(\"taigaBacklog\");\n\n BacklogFiltersDirective = function($q, $log, $location, $templates) {\n var link, template, templateSelected;\n template = $templates.get(\"backlog/filters.html\", true);\n templateSelected = $templates.get(\"backlog/filter-selected.html\", true);\n link = function($scope, $el, $attrs) {\n var $ctrl, currentFiltersType, getFiltersType, initializeSelectedFilters, reloadUserstories, renderFilters, renderSelectedFilters, selectQFilter, selectedFilters, showCategories, showFilters, toggleFilterSelection;\n currentFiltersType = '';\n $ctrl = $el.closest(\".wrapper\").controller();\n selectedFilters = [];\n showFilters = function(title, type) {\n $el.find(\".filters-cats\").hide();\n $el.find(\".filter-list\").removeClass(\"hidden\");\n $el.find(\"h2.breadcrumb\").removeClass(\"hidden\");\n $el.find(\"h2 a.subfilter span.title\").html(title);\n $el.find(\"h2 a.subfilter span.title\").prop(\"data-type\", type);\n return currentFiltersType = getFiltersType();\n };\n showCategories = function() {\n $el.find(\".filters-cats\").show();\n $el.find(\".filter-list\").addClass(\"hidden\");\n return $el.find(\"h2.breadcrumb\").addClass(\"hidden\");\n };\n initializeSelectedFilters = function() {\n var i, len, name, ref, val, values;\n showCategories();\n selectedFilters = [];\n ref = $scope.filters;\n for (name in ref) {\n values = ref[name];\n for (i = 0, len = values.length; i < len; i++) {\n val = values[i];\n if (val.selected) {\n selectedFilters.push(val);\n }\n }\n }\n return renderSelectedFilters();\n };\n renderSelectedFilters = function() {\n var html;\n _.map(selectedFilters, (function(_this) {\n return function(f) {\n if (f.color) {\n return f.style = \"border-left: 3px solid \" + f.color;\n }\n };\n })(this));\n html = templateSelected({\n filters: selectedFilters\n });\n return $el.find(\".filters-applied\").html(html);\n };\n renderFilters = function(filters) {\n var html;\n _.map(filters, (function(_this) {\n return function(f) {\n if (f.color) {\n return f.style = \"border-left: 3px solid \" + f.color;\n }\n };\n })(this));\n html = template({\n filters: filters\n });\n return $el.find(\".filter-list\").html(html);\n };\n getFiltersType = function() {\n return $el.find(\"h2 a.subfilter span.title\").prop('data-type');\n };\n reloadUserstories = function() {\n currentFiltersType = getFiltersType();\n return $q.all([$ctrl.loadUserstories(), $ctrl.generateFilters()]).then(function() {\n var currentFilters;\n currentFilters = $scope.filters[currentFiltersType];\n return renderFilters(_.reject(currentFilters, \"selected\"));\n });\n };\n toggleFilterSelection = function(type, id) {\n var filter, filters;\n currentFiltersType = getFiltersType();\n filters = $scope.filters[type];\n filter = _.find(filters, {\n id: id\n });\n filter.selected = !filter.selected;\n if (filter.selected) {\n selectedFilters.push(filter);\n $scope.$apply(function() {\n return $ctrl.selectFilter(type, id);\n });\n } else {\n selectedFilters = _.reject(selectedFilters, function(selected) {\n return filter.type === selected.type && filter.id === selected.id;\n });\n $ctrl.unselectFilter(type, id);\n }\n renderSelectedFilters(selectedFilters);\n if (type === currentFiltersType) {\n renderFilters(_.reject(filters, \"selected\"));\n }\n return reloadUserstories();\n };\n selectQFilter = debounceLeading(100, function(value) {\n if (value === void 0) {\n return;\n }\n if (value.length === 0) {\n $ctrl.replaceFilter(\"q\", null);\n } else {\n $ctrl.replaceFilter(\"q\", value);\n }\n return reloadUserstories();\n });\n $scope.$watch(\"filtersQ\", selectQFilter);\n $scope.$on(\"backlog:loaded\", function(ctx) {\n return initializeSelectedFilters();\n });\n $scope.$on(\"filters:update\", function(ctx) {\n return $ctrl.generateFilters().then(function() {\n var filters;\n filters = $scope.filters[currentFiltersType];\n if (currentFiltersType) {\n return renderFilters(_.reject(filters, \"selected\"));\n }\n });\n });\n $el.on(\"click\", \".filters-cats > ul > li > a\", function(event) {\n var tags, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n tags = $scope.filters[target.data(\"type\")];\n renderFilters(_.reject(tags, \"selected\"));\n return showFilters(target.attr(\"title\"), target.data('type'));\n });\n $el.on(\"click\", \".filters-inner > .filters-step-cat > .breadcrumb > .back\", function(event) {\n event.preventDefault();\n return showCategories();\n });\n $el.on(\"click\", \".filters-applied a\", function(event) {\n var id, target, type;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n id = target.data(\"id\");\n type = target.data(\"type\");\n return toggleFilterSelection(type, id);\n });\n return $el.on(\"click\", \".filter-list .single-filter\", function(event) {\n var id, target, type;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n if (target.hasClass(\"active\")) {\n target.removeClass(\"active\");\n } else {\n target.addClass(\"active\");\n }\n id = target.data(\"id\");\n type = target.data(\"type\");\n return toggleFilterSelection(type, id);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogFilters\", [\"$q\", \"$log\", \"$tgLocation\", \"$tgTemplate\", BacklogFiltersDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog/lightboxes.coffee\n */\n\n(function() {\n var CreateEditSprint, bindOnce, debounce, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaBacklog\");\n\n CreateEditSprint = function($repo, $confirm, $rs, $rootscope, lightboxService, $loading, $translate) {\n var link;\n link = function($scope, $el, attrs) {\n var createSprint, getLastSprint, hasErrors, remove, resetSprint, submit;\n hasErrors = false;\n createSprint = true;\n resetSprint = function() {\n return $scope.sprint = {\n project: null,\n name: null,\n estimated_start: null,\n estimated_finish: null\n };\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var broadcastEvent, currentLoading, form, newSprint, prettyDate, promise, submitButton, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n submitButton = $el.find(\".submit-button\");\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n hasErrors = true;\n $el.find(\".last-sprint-name\").addClass(\"disappear\");\n return;\n }\n hasErrors = false;\n newSprint = angular.copy($scope.sprint);\n broadcastEvent = null;\n if (createSprint) {\n newSprint.estimated_start = moment(newSprint.estimated_start, prettyDate).format(\"YYYY-MM-DD\");\n newSprint.estimated_finish = moment(newSprint.estimated_finish, prettyDate).format(\"YYYY-MM-DD\");\n promise = $repo.create(\"milestones\", newSprint);\n broadcastEvent = \"sprintform:create:success\";\n } else {\n newSprint.setAttr(\"estimated_start\", moment(newSprint.estimated_start, prettyDate).format(\"YYYY-MM-DD\"));\n newSprint.setAttr(\"estimated_finish\", moment(newSprint.estimated_finish, prettyDate).format(\"YYYY-MM-DD\"));\n promise = $repo.save(newSprint);\n broadcastEvent = \"sprintform:edit:success\";\n }\n currentLoading = $loading().target(submitButton).start();\n promise.then(function(data) {\n currentLoading.finish();\n if (createSprint) {\n $scope.sprintsCounter += 1;\n }\n $rootscope.$broadcast(broadcastEvent, data);\n return lightboxService.close($el);\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"light-error\", data._error_message);\n } else if (data.__all__) {\n return $confirm.notify(\"light-error\", data.__all__[0]);\n }\n });\n };\n })(this));\n remove = function() {\n var message, title;\n title = $translate.instant(\"LIGHTBOX.DELETE_SPRINT.TITLE\");\n message = $scope.sprint.name;\n return $confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var onError, onSuccess;\n onSuccess = function() {\n askResponse.finish();\n $scope.milestonesCounter -= 1;\n lightboxService.close($el);\n return $rootscope.$broadcast(\"sprintform:remove:success\", $scope.sprint);\n };\n onError = function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n };\n return $repo.remove($scope.sprint).then(onSuccess, onError);\n };\n })(this));\n };\n getLastSprint = function() {\n var openSprints, sortedSprints;\n openSprints = _.filter($scope.sprints, function(sprint) {\n return !sprint.closed;\n });\n sortedSprints = _.sortBy(openSprints, function(sprint) {\n return moment(sprint.estimated_finish, 'YYYY-MM-DD').format('X');\n });\n return sortedSprints[sortedSprints.length - 1];\n };\n $scope.$on(\"sprintform:create\", function(event, projectId) {\n var estimatedFinish, estimatedStart, form, lastSprint, lastSprintNameDom, prettyDate, text;\n resetSprint();\n form = $el.find(\"form\").checksley();\n form.reset();\n createSprint = true;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n $scope.sprint.project = projectId;\n $scope.sprint.name = null;\n $scope.sprint.slug = null;\n lastSprint = getLastSprint();\n estimatedStart = moment();\n if (lastSprint) {\n estimatedStart = moment(lastSprint.estimated_finish);\n } else if ($scope.sprint.estimated_start) {\n estimatedStart = moment($scope.sprint.estimated_start);\n }\n $scope.sprint.estimated_start = estimatedStart.format(prettyDate);\n estimatedFinish = moment().add(2, \"weeks\");\n if (lastSprint) {\n estimatedFinish = moment(lastSprint.estimated_finish).add(2, \"weeks\");\n } else if ($scope.sprint.estimated_finish) {\n estimatedFinish = moment($scope.sprint.estimated_finish);\n }\n $scope.sprint.estimated_finish = estimatedFinish.format(prettyDate);\n lastSprintNameDom = $el.find(\".last-sprint-name\");\n if ((lastSprint != null ? lastSprint.name : void 0) != null) {\n text = $translate.instant(\"LIGHTBOX.ADD_EDIT_SPRINT.LAST_SPRINT_NAME\", {\n lastSprint: lastSprint.name\n });\n lastSprintNameDom.html(text);\n }\n $el.find(\".delete-sprint\").addClass(\"hidden\");\n text = $translate.instant(\"LIGHTBOX.ADD_EDIT_SPRINT.TITLE\");\n $el.find(\".title\").text(text);\n text = $translate.instant(\"COMMON.CREATE\");\n $el.find(\".button-green\").text(text);\n lightboxService.open($el);\n $el.find(\".sprint-name\").focus();\n return $el.find(\".last-sprint-name\").removeClass(\"disappear\");\n });\n $scope.$on(\"sprintform:edit\", function(ctx, sprint) {\n var editSprint, prettyDate, save;\n resetSprint();\n createSprint = false;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n $scope.$apply(function() {\n $scope.sprint = sprint;\n $scope.sprint.estimated_start = moment($scope.sprint.estimated_start).format(prettyDate);\n return $scope.sprint.estimated_finish = moment($scope.sprint.estimated_finish).format(prettyDate);\n });\n $el.find(\".delete-sprint\").removeClass(\"hidden\");\n editSprint = $translate.instant(\"BACKLOG.EDIT_SPRINT\");\n $el.find(\".title\").text(editSprint);\n save = $translate.instant(\"COMMON.SAVE\");\n $el.find(\".button-green\").text(save);\n lightboxService.open($el);\n $el.find(\".sprint-name\").focus().select();\n return $el.find(\".last-sprint-name\").addClass(\"disappear\");\n });\n $el.on(\"keyup\", \".sprint-name\", function(event) {\n if ($el.find(\".sprint-name\").val().length > 0 || hasErrors) {\n return $el.find(\".last-sprint-name\").addClass(\"disappear\");\n } else {\n return $el.find(\".last-sprint-name\").removeClass(\"disappear\");\n }\n });\n $el.on(\"submit\", \"form\", submit);\n $el.on(\"click\", \".delete-sprint .icon-delete\", function(event) {\n event.preventDefault();\n return remove();\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return resetSprint();\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateEditSprint\", [\"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$rootScope\", \"lightboxService\", \"$tgLoading\", \"$translate\", CreateEditSprint]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog/main.coffee\n */\n\n(function() {\n var BacklogController, BacklogDirective, BurndownBacklogGraphDirective, TgBacklogProgressBarDirective, ToggleBurndownVisibility, UsPointsDirective, UsRolePointsSelectorDirective, bindMethods, bindOnce, generateHash, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n timeout = this.taiga.timeout;\n\n bindMethods = this.taiga.bindMethods;\n\n generateHash = this.taiga.generateHash;\n\n module = angular.module(\"taigaBacklog\");\n\n BacklogController = (function(superClass) {\n extend(BacklogController, superClass);\n\n BacklogController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\", \"$tgLoading\", \"tgResources\"];\n\n function BacklogController(scope1, rootscope, repo, confirm, rs, params1, q, location, appMetaService, navUrls, events, analytics, translate, loading, rs2) {\n var promise;\n this.scope = scope1;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params1;\n this.q = q;\n this.location = location;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.events = events;\n this.analytics = analytics;\n this.translate = translate;\n this.loading = loading;\n this.rs2 = rs2;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"BACKLOG.SECTION_NAME\");\n this.showTags = false;\n this.activeFilters = false;\n this.scope.showGraphPlaceholder = null;\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"BACKLOG.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.translate.instant(\"BACKLOG.PAGE_DESCRIPTION\", {\n projectName: _this.scope.project.name,\n projectDescription: _this.scope.project.description\n });\n _this.appMetaService.setAll(title, description);\n if (_this.rs.userstories.getShowTags(_this.scope.projectId)) {\n _this.showTags = true;\n return _this.scope.$broadcast(\"showTags\", _this.showTags);\n }\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n BacklogController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"usform:bulk:success\", (function(_this) {\n return function() {\n _this.loadUserstories();\n _this.loadProjectStats();\n return _this.analytics.trackEvent(\"userstory\", \"create\", \"bulk create userstory on backlog\", 1);\n };\n })(this));\n this.scope.$on(\"sprintform:create:success\", (function(_this) {\n return function() {\n _this.loadSprints();\n _this.loadProjectStats();\n return _this.analytics.trackEvent(\"sprint\", \"create\", \"create sprint on backlog\", 1);\n };\n })(this));\n this.scope.$on(\"usform:new:success\", (function(_this) {\n return function() {\n _this.loadUserstories();\n _this.loadProjectStats();\n _this.rootscope.$broadcast(\"filters:update\");\n return _this.analytics.trackEvent(\"userstory\", \"create\", \"create userstory on backlog\", 1);\n };\n })(this));\n this.scope.$on(\"sprintform:edit:success\", (function(_this) {\n return function() {\n return _this.loadProjectStats();\n };\n })(this));\n this.scope.$on(\"sprintform:remove:success\", (function(_this) {\n return function(event, sprint) {\n _this.loadSprints();\n _this.loadProjectStats();\n _this.loadUserstories();\n if (sprint.closed) {\n _this.loadClosedSprints();\n }\n return _this.rootscope.$broadcast(\"filters:update\");\n };\n })(this));\n this.scope.$on(\"usform:edit:success\", (function(_this) {\n return function() {\n _this.loadUserstories();\n return _this.rootscope.$broadcast(\"filters:update\");\n };\n })(this));\n this.scope.$on(\"sprint:us:move\", this.moveUs);\n this.scope.$on(\"sprint:us:moved\", this.loadSprints);\n this.scope.$on(\"sprint:us:moved\", this.loadProjectStats);\n this.scope.$on(\"backlog:load-closed-sprints\", this.loadClosedSprints);\n return this.scope.$on(\"backlog:unload-closed-sprints\", this.unloadClosedSprints);\n };\n\n BacklogController.prototype.initializeSubscription = function() {\n var routingKey1, routingKey2;\n routingKey1 = \"changes.project.\" + this.scope.projectId + \".userstories\";\n this.events.subscribe(this.scope, routingKey1, (function(_this) {\n return function(message) {\n _this.loadUserstories();\n return _this.loadSprints();\n };\n })(this));\n routingKey2 = \"changes.project.\" + this.scope.projectId + \".milestones\";\n return this.events.subscribe(this.scope, routingKey2, (function(_this) {\n return function(message) {\n return _this.loadSprints();\n };\n })(this));\n };\n\n BacklogController.prototype.toggleShowTags = function() {\n return this.scope.$apply((function(_this) {\n return function() {\n _this.showTags = !_this.showTags;\n return _this.rs.userstories.storeShowTags(_this.scope.projectId, _this.showTags);\n };\n })(this));\n };\n\n BacklogController.prototype.toggleActiveFilters = function() {\n return this.activeFilters = !this.activeFilters;\n };\n\n BacklogController.prototype.loadProjectStats = function() {\n return this.rs.projects.stats(this.scope.projectId).then((function(_this) {\n return function(stats) {\n var totalPoints;\n _this.scope.stats = stats;\n totalPoints = stats.total_points ? stats.total_points : stats.defined_points;\n if (totalPoints) {\n _this.scope.stats.completedPercentage = Math.round(100 * stats.closed_points / totalPoints);\n } else {\n _this.scope.stats.completedPercentage = 0;\n }\n _this.scope.showGraphPlaceholder = !((stats.total_points != null) && (stats.total_milestones != null));\n return stats;\n };\n })(this));\n };\n\n BacklogController.prototype.unloadClosedSprints = function() {\n return this.scope.$apply((function(_this) {\n return function() {\n _this.scope.closedSprints = [];\n return _this.rootscope.$broadcast(\"closed-sprints:reloaded\", []);\n };\n })(this));\n };\n\n BacklogController.prototype.loadClosedSprints = function() {\n var params;\n params = {\n closed: true\n };\n return this.rs.sprints.list(this.scope.projectId, params).then((function(_this) {\n return function(result) {\n var j, len, sprint, sprints;\n sprints = result.milestones;\n _this.scope.totalClosedMilestones = result.closed;\n for (j = 0, len = sprints.length; j < len; j++) {\n sprint = sprints[j];\n sprint.user_stories = _.sortBy(sprint.user_stories, \"sprint_order\");\n }\n _this.scope.closedSprints = sprints;\n _this.scope.closedSprintsById = groupBy(sprints, function(x) {\n return x.id;\n });\n _this.rootscope.$broadcast(\"closed-sprints:reloaded\", sprints);\n return sprints;\n };\n })(this));\n };\n\n BacklogController.prototype.loadSprints = function() {\n var params;\n params = {\n closed: false\n };\n return this.rs.sprints.list(this.scope.projectId, params).then((function(_this) {\n return function(result) {\n var j, len, sprint, sprints;\n sprints = result.milestones;\n _this.scope.totalMilestones = sprints;\n _this.scope.totalClosedMilestones = result.closed;\n _this.scope.totalOpenMilestones = result.open;\n _this.scope.totalMilestones = _this.scope.totalOpenMilestones + _this.scope.totalClosedMilestones;\n for (j = 0, len = sprints.length; j < len; j++) {\n sprint = sprints[j];\n sprint.user_stories = _.sortBy(sprint.user_stories, \"sprint_order\");\n }\n _this.scope.sprints = sprints;\n _this.scope.openSprints = _.filter(sprints, function(sprint) {\n return !sprint.closed;\n }).reverse();\n if (!_this.scope.closedSprints) {\n _this.scope.closedSprints = [];\n }\n _this.scope.sprintsCounter = sprints.length;\n _this.scope.sprintsById = groupBy(sprints, function(x) {\n return x.id;\n });\n _this.rootscope.$broadcast(\"sprints:loaded\", sprints);\n _this.scope.currentSprint = _this.findCurrentSprint();\n return sprints;\n };\n })(this));\n };\n\n BacklogController.prototype.restoreFilters = function() {\n var selectedStatuses, selectedTags;\n selectedTags = this.scope.oldSelectedTags;\n selectedStatuses = this.scope.oldSelectedStatuses;\n if (!selectedStatuses && !selectedStatuses) {\n return;\n }\n this.scope.filtersQ = this.scope.filtersQOld;\n this.replaceFilter(\"q\", this.scope.filtersQ);\n _.each([selectedTags, selectedStatuses], (function(_this) {\n return function(filterGrp) {\n return _.each(filterGrp, function(item) {\n var filter, filters;\n filters = _this.scope.filters[item.type];\n filter = _.find(filters, {\n id: item.id\n });\n filter.selected = true;\n return _this.selectFilter(item.type, item.id);\n });\n };\n })(this));\n return this.loadUserstories();\n };\n\n BacklogController.prototype.resetFilters = function() {\n var selectedStatuses, selectedTags;\n selectedTags = _.filter(this.scope.filters.tags, \"selected\");\n selectedStatuses = _.filter(this.scope.filters.status, \"selected\");\n this.scope.oldSelectedTags = selectedTags;\n this.scope.oldSelectedStatuses = selectedStatuses;\n this.scope.filtersQOld = this.scope.filtersQ;\n this.scope.filtersQ = void 0;\n this.replaceFilter(\"q\", this.scope.filtersQ);\n _.each([selectedTags, selectedStatuses], (function(_this) {\n return function(filterGrp) {\n return _.each(filterGrp, function(item) {\n var filter, filters;\n filters = _this.scope.filters[item.type];\n filter = _.find(filters, {\n id: item.id\n });\n filter.selected = false;\n return _this.unselectFilter(item.type, item.id);\n });\n };\n })(this));\n return this.loadUserstories();\n };\n\n BacklogController.prototype.loadUserstories = function() {\n var promise;\n this.scope.httpParams = this.getUrlFilters();\n this.rs.userstories.storeQueryParams(this.scope.projectId, this.scope.httpParams);\n promise = this.rs.userstories.listUnassigned(this.scope.projectId, this.scope.httpParams);\n return promise.then((function(_this) {\n return function(userstories) {\n _this.scope.userstories = _.sortBy(userstories, \"backlog_order\");\n _this.setSearchDataFilters();\n scopeDefer(_this.scope, function() {\n return _this.scope.$broadcast(\"userstories:loaded\");\n });\n return userstories;\n };\n })(this));\n };\n\n BacklogController.prototype.loadBacklog = function() {\n return this.q.all([this.loadProjectStats(), this.loadSprints(), this.loadUserstories()]);\n };\n\n BacklogController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n if (!project.is_backlog_activated) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.closedMilestones = !!project.total_closed_milestones;\n _this.scope.$emit('project:loaded', project);\n _this.scope.points = _.sortBy(project.points, \"order\");\n _this.scope.pointsById = groupBy(project.points, function(x) {\n return x.id;\n });\n _this.scope.usStatusById = groupBy(project.us_statuses, function(x) {\n return x.id;\n });\n _this.scope.usStatusList = _.sortBy(project.us_statuses, \"id\");\n return project;\n };\n })(this));\n };\n\n BacklogController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n promise.then((function(_this) {\n return function(project) {\n _this.fillUsersAndRoles(project.members, project.roles);\n return _this.initializeSubscription();\n };\n })(this));\n return promise.then((function(_this) {\n return function() {\n return _this.loadBacklog();\n };\n })(this)).then((function(_this) {\n return function() {\n return _this.generateFilters();\n };\n })(this)).then((function(_this) {\n return function() {\n return _this.scope.$emit(\"backlog:loaded\");\n };\n })(this));\n };\n\n BacklogController.prototype.prepareBulkUpdateData = function(uses, field) {\n if (field == null) {\n field = \"backlog_order\";\n }\n return _.map(uses, function(x) {\n return {\n \"us_id\": x.id,\n \"order\": x[field]\n };\n });\n };\n\n BacklogController.prototype.resortUserStories = function(uses, field) {\n var index, item, items, j, len;\n if (field == null) {\n field = \"backlog_order\";\n }\n items = [];\n for (index = j = 0, len = uses.length; j < len; index = ++j) {\n item = uses[index];\n item[field] = index;\n if (item.isModified()) {\n items.push(item);\n }\n }\n return items;\n };\n\n BacklogController.prototype.moveUs = function(ctx, usList, newUsIndex, newSprintId) {\n var data, items, j, l, len, len1, len2, m, movedFromClosedSprint, movedToClosedSprint, newSprint, oldSprintId, project, promise, promises, sprint, us, userstories;\n oldSprintId = usList[0].milestone;\n project = usList[0].project;\n movedFromClosedSprint = false;\n movedToClosedSprint = false;\n sprint = this.scope.sprintsById[oldSprintId];\n if (!sprint && this.scope.closedSprintsById) {\n sprint = this.scope.closedSprintsById[oldSprintId];\n if (sprint) {\n movedFromClosedSprint = true;\n }\n }\n newSprint = this.scope.sprintsById[newSprintId];\n if (!newSprint && newSprintId) {\n newSprint = this.scope.closedSprintsById[newSprintId];\n if (newSprint) {\n movedToClosedSprint = true;\n }\n }\n if (newSprintId === oldSprintId) {\n items = null;\n userstories = null;\n if (newSprintId === null) {\n userstories = this.scope.userstories;\n } else {\n userstories = newSprint.user_stories;\n }\n this.scope.$apply(function() {\n var args, j, key, len, r, us;\n for (key = j = 0, len = usList.length; j < len; key = ++j) {\n us = usList[key];\n r = userstories.indexOf(us);\n userstories.splice(r, 1);\n }\n args = [newUsIndex, 0].concat(usList);\n return Array.prototype.splice.apply(userstories, args);\n });\n if (newSprintId === null) {\n items = this.resortUserStories(userstories, \"backlog_order\");\n data = this.prepareBulkUpdateData(items, \"backlog_order\");\n this.rs.userstories.bulkUpdateBacklogOrder(project, data).then((function(_this) {\n return function() {\n var j, len, results, us;\n results = [];\n for (j = 0, len = usList.length; j < len; j++) {\n us = usList[j];\n results.push(_this.rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId));\n }\n return results;\n };\n })(this));\n } else {\n items = this.resortUserStories(userstories, \"sprint_order\");\n data = this.prepareBulkUpdateData(items, \"sprint_order\");\n this.rs.userstories.bulkUpdateSprintOrder(project, data).then((function(_this) {\n return function() {\n var j, len, results, us;\n results = [];\n for (j = 0, len = usList.length; j < len; j++) {\n us = usList[j];\n results.push(_this.rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId));\n }\n return results;\n };\n })(this));\n }\n return promise;\n }\n if (newSprintId === null) {\n for (j = 0, len = usList.length; j < len; j++) {\n us = usList[j];\n us.milestone = null;\n }\n this.scope.$apply((function(_this) {\n return function() {\n var args, key, l, len1, r, results;\n args = [newUsIndex, 0].concat(usList);\n Array.prototype.splice.apply(_this.scope.userstories, args);\n results = [];\n for (key = l = 0, len1 = usList.length; l < len1; key = ++l) {\n us = usList[key];\n r = sprint.user_stories.indexOf(us);\n results.push(sprint.user_stories.splice(r, 1));\n }\n return results;\n };\n })(this));\n promise = this.repo.save(us);\n promise = promise.then((function(_this) {\n return function() {\n items = _this.resortUserStories(_this.scope.userstories, \"backlog_order\");\n data = _this.prepareBulkUpdateData(items, \"backlog_order\");\n return _this.rs.userstories.bulkUpdateBacklogOrder(us.project, data).then(function() {\n _this.rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId);\n if (movedFromClosedSprint) {\n return _this.rootscope.$broadcast(\"backlog:load-closed-sprints\");\n }\n });\n };\n })(this));\n promise.then(null, function() {\n return console.log(\"FAIL\");\n });\n return promise;\n }\n if (oldSprintId === null) {\n for (l = 0, len1 = usList.length; l < len1; l++) {\n us = usList[l];\n us.milestone = newSprintId;\n }\n this.scope.$apply((function(_this) {\n return function() {\n var args, key, len2, m, r, results;\n args = [newUsIndex, 0].concat(usList);\n Array.prototype.splice.apply(newSprint.user_stories, args);\n results = [];\n for (key = m = 0, len2 = usList.length; m < len2; key = ++m) {\n us = usList[key];\n r = _this.scope.userstories.indexOf(us);\n results.push(_this.scope.userstories.splice(r, 1));\n }\n return results;\n };\n })(this));\n } else {\n for (m = 0, len2 = usList.length; m < len2; m++) {\n us = usList[m];\n us.milestone = newSprintId;\n }\n this.scope.$apply((function(_this) {\n return function() {\n var args, len3, n, r, results;\n args = [newUsIndex, 0].concat(usList);\n Array.prototype.splice.apply(newSprint.user_stories, args);\n results = [];\n for (n = 0, len3 = usList.length; n < len3; n++) {\n us = usList[n];\n r = sprint.user_stories.indexOf(us);\n results.push(sprint.user_stories.splice(r, 1));\n }\n return results;\n };\n })(this));\n }\n promises = _.map(usList, (function(_this) {\n return function(us) {\n return _this.repo.save(us);\n };\n })(this));\n promise = this.q.all(promises).then((function(_this) {\n return function() {\n items = _this.resortUserStories(newSprint.user_stories, \"sprint_order\");\n data = _this.prepareBulkUpdateData(items, \"sprint_order\");\n _this.rs.userstories.bulkUpdateSprintOrder(project, data).then(function(result) {\n return _this.rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId);\n });\n _this.rs.userstories.bulkUpdateBacklogOrder(project, data).then(function() {\n var len3, n, results;\n results = [];\n for (n = 0, len3 = usList.length; n < len3; n++) {\n us = usList[n];\n results.push(_this.rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId));\n }\n return results;\n });\n if (movedToClosedSprint || movedFromClosedSprint) {\n return _this.scope.$broadcast(\"backlog:load-closed-sprints\");\n }\n };\n })(this));\n promise.then(null, function() {\n return console.log(\"FAIL\");\n });\n return promise;\n };\n\n BacklogController.prototype.isFilterSelected = function(type, id) {\n if ((this.searchdata[type] != null) && this.searchdata[type][id]) {\n return true;\n }\n return false;\n };\n\n BacklogController.prototype.setSearchDataFilters = function() {\n var name, results, urlfilters, val, value;\n urlfilters = this.getUrlFilters();\n if (urlfilters.q) {\n this.scope.filtersQ = this.scope.filtersQ || urlfilters.q;\n }\n this.searchdata = {};\n results = [];\n for (name in urlfilters) {\n value = urlfilters[name];\n if (this.searchdata[name] == null) {\n this.searchdata[name] = {};\n }\n results.push((function() {\n var j, len, ref1, results1;\n ref1 = taiga.toString(value).split(\",\");\n results1 = [];\n for (j = 0, len = ref1.length; j < len; j++) {\n val = ref1[j];\n results1.push(this.searchdata[name][val] = true);\n }\n return results1;\n }).call(this));\n }\n return results;\n };\n\n BacklogController.prototype.getUrlFilters = function() {\n return _.pick(this.location.search(), \"status\", \"tags\", \"q\");\n };\n\n BacklogController.prototype.generateFilters = function() {\n var loadFilters, urlfilters;\n urlfilters = this.getUrlFilters();\n this.scope.filters = {};\n loadFilters = {};\n loadFilters.project = this.scope.projectId;\n loadFilters.tags = urlfilters.tags;\n loadFilters.status = urlfilters.status;\n loadFilters.q = urlfilters.q;\n loadFilters.milestone = 'null';\n return this.rs.userstories.filtersData(loadFilters).then((function(_this) {\n return function(data) {\n var choicesFiltersFormat, selectedStatuses, selectedTags, tagsFilterFormat;\n choicesFiltersFormat = function(choices, type, byIdObject) {\n return _.map(choices, function(t) {\n t.type = type;\n return t;\n });\n };\n tagsFilterFormat = function(tags) {\n return _.map(tags, function(t) {\n t.id = t.name;\n t.type = 'tags';\n return t;\n });\n };\n _this.scope.filters.status = choicesFiltersFormat(data.statuses, \"status\", _this.scope.usStatusById);\n _this.scope.filters.tags = tagsFilterFormat(data.tags);\n selectedTags = _.filter(_this.scope.filters.tags, \"selected\");\n selectedTags = _.map(selectedTags, \"id\");\n selectedStatuses = _.filter(_this.scope.filters.status, \"selected\");\n selectedStatuses = _.map(selectedStatuses, \"id\");\n _this.markSelectedFilters(_this.scope.filters, urlfilters);\n return _this.rs.userstories.storeQueryParams(_this.scope.projectId, {\n \"status\": selectedStatuses,\n \"tags\": selectedTags,\n \"project\": _this.scope.projectId,\n \"milestone\": null\n });\n };\n })(this));\n };\n\n BacklogController.prototype.markSelectedFilters = function(filters, urlfilters) {\n var isSelected, j, key, len, name, obj, ref1, ref2, results, searchdata, val, value;\n searchdata = {};\n ref1 = _.omit(urlfilters, \"page\", \"orderBy\");\n for (name in ref1) {\n value = ref1[name];\n if (searchdata[name] == null) {\n searchdata[name] = {};\n }\n ref2 = (\"\" + value).split(\",\");\n for (j = 0, len = ref2.length; j < len; j++) {\n val = ref2[j];\n searchdata[name][val] = true;\n }\n }\n isSelected = function(type, id) {\n if ((searchdata[type] != null) && searchdata[type][id]) {\n return true;\n }\n return false;\n };\n results = [];\n for (key in filters) {\n value = filters[key];\n results.push((function() {\n var l, len1, results1;\n results1 = [];\n for (l = 0, len1 = value.length; l < len1; l++) {\n obj = value[l];\n results1.push(obj.selected = isSelected(obj.type, obj.id) ? true : void 0);\n }\n return results1;\n })());\n }\n return results;\n };\n\n BacklogController.prototype.updateUserStoryStatus = function() {\n this.setSearchDataFilters();\n return this.generateFilters().then((function(_this) {\n return function() {\n _this.rootscope.$broadcast(\"filters:update\");\n return _this.loadProjectStats();\n };\n })(this));\n };\n\n BacklogController.prototype.editUserStory = function(projectId, ref, $event) {\n var currentLoading, target;\n target = $($event.target);\n currentLoading = this.loading().target(target).removeClasses(\"icon-edit\").timeout(200).start();\n return this.rs.userstories.getByRef(projectId, ref).then((function(_this) {\n return function(us) {\n return _this.rs2.attachments.list(\"us\", us.id, projectId).then(function(attachments) {\n _this.rootscope.$broadcast(\"usform:edit\", us, attachments.toJS());\n return currentLoading.finish();\n });\n };\n })(this));\n };\n\n BacklogController.prototype.deleteUserStory = function(us) {\n var message, title;\n title = this.translate.instant(\"US.TITLE_DELETE_ACTION\");\n message = us.subject;\n return this.confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var promise;\n _this.scope.userstories = _.without(_this.scope.userstories, us);\n promise = _this.repo.remove(us);\n promise.then(function() {\n askResponse.finish();\n return _this.loadBacklog();\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return _this.confirm.notify(\"error\");\n });\n };\n })(this));\n };\n\n BacklogController.prototype.addNewUs = function(type) {\n switch (type) {\n case \"standard\":\n return this.rootscope.$broadcast(\"usform:new\", this.scope.projectId, this.scope.project.default_us_status, this.scope.usStatusList);\n case \"bulk\":\n return this.rootscope.$broadcast(\"usform:bulk\", this.scope.projectId, this.scope.project.default_us_status);\n }\n };\n\n BacklogController.prototype.addNewSprint = function() {\n return this.rootscope.$broadcast(\"sprintform:create\", this.scope.projectId);\n };\n\n BacklogController.prototype.findCurrentSprint = function() {\n var currentDate;\n currentDate = new Date().getTime();\n return _.find(this.scope.sprints, function(sprint) {\n var end, start;\n start = moment(sprint.estimated_start, 'YYYY-MM-DD').format('x');\n end = moment(sprint.estimated_finish, 'YYYY-MM-DD').format('x');\n return currentDate >= start && currentDate <= end;\n });\n };\n\n return BacklogController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"BacklogController\", BacklogController);\n\n BacklogDirective = function($repo, $rootscope, $translate) {\n var doomLineTemplate, link, linkDoomLine, linkFilters, linkToolbar, showHideFilter, showHideTags;\n doomLineTemplate = _.template(\"
<%- text %>
\");\n linkDoomLine = function($scope, $el, $attrs, $ctrl) {\n var addDoomLineDom, getUsItems, reloadDoomLine, removeDoomlineDom;\n reloadDoomLine = function() {\n var current_sum, domElement, i, j, len, ref1, results, stats, total_points, us;\n if (($scope.stats != null) && ($scope.stats.total_points != null) && $scope.stats.total_points !== 0) {\n removeDoomlineDom();\n stats = $scope.stats;\n total_points = stats.total_points;\n current_sum = stats.assigned_points;\n if (!$scope.userstories) {\n return;\n }\n ref1 = $scope.userstories;\n results = [];\n for (i = j = 0, len = ref1.length; j < len; i = ++j) {\n us = ref1[i];\n current_sum += us.total_points;\n if (current_sum > total_points) {\n domElement = $el.find('.backlog-table-body .us-item-row')[i];\n addDoomLineDom(domElement);\n break;\n } else {\n results.push(void 0);\n }\n }\n return results;\n }\n };\n removeDoomlineDom = function() {\n return $el.find(\".doom-line\").remove();\n };\n addDoomLineDom = function(element) {\n var text;\n text = $translate.instant(\"BACKLOG.DOOMLINE\");\n return $(element).before(doomLineTemplate({\n \"text\": text\n }));\n };\n getUsItems = function() {\n var rowElements;\n rowElements = $el.find('.backlog-table-body .us-item-row');\n return _.map(rowElements, function(x) {\n return angular.element(x);\n });\n };\n $scope.$on(\"userstories:loaded\", reloadDoomLine);\n return $scope.$watch(\"stats\", reloadDoomLine);\n };\n linkToolbar = function($scope, $el, $attrs, $ctrl) {\n var checkSelected, getUsToMove, lastChecked, moveToCurrentSprint, moveToLatestSprint, moveUssToSprint, shiftPressed;\n getUsToMove = function() {\n var ussDom;\n ussDom = $el.find(\".backlog-table-body input:checkbox:checked\");\n return _.map(ussDom, function(item) {\n var itemScope;\n item = $(item).closest('.tg-scope');\n itemScope = item.scope();\n itemScope.us.milestone = $scope.sprints[0].id;\n return itemScope.us;\n });\n };\n moveUssToSprint = function(selectedUss, sprint) {\n var extraPoints, totalExtraPoints, ussCurrent;\n ussCurrent = _($scope.userstories);\n $scope.userstories = ussCurrent.without.apply(ussCurrent, selectedUss).value();\n extraPoints = _.map(selectedUss, function(v, k) {\n return v.total_points;\n });\n totalExtraPoints = _.reduce(extraPoints, function(acc, num) {\n return acc + num;\n });\n sprint.user_stories = _.union(sprint.user_stories, selectedUss);\n sprint.total_points += totalExtraPoints;\n $repo.saveAll(selectedUss).then(function() {\n $ctrl.loadSprints();\n return $ctrl.loadProjectStats();\n });\n return $el.find(\".move-to-sprint\").hide();\n };\n moveToCurrentSprint = function(selectedUss) {\n return moveUssToSprint(selectedUss, $scope.currentSprint);\n };\n moveToLatestSprint = function(selectedUss) {\n return moveUssToSprint(selectedUss, $scope.sprints[0]);\n };\n shiftPressed = false;\n lastChecked = null;\n checkSelected = function(target) {\n var moveToSprintDom, selectedUsDom;\n lastChecked = target.closest(\".us-item-row\");\n target.closest('.us-item-row').toggleClass('ui-multisortable-multiple');\n moveToSprintDom = $el.find(\".move-to-sprint\");\n selectedUsDom = $el.find(\".backlog-table-body input:checkbox:checked\");\n if (selectedUsDom.length > 0 && $scope.sprints.length > 0) {\n return moveToSprintDom.show();\n } else {\n return moveToSprintDom.hide();\n }\n };\n $(window).on(\"keydown.shift-pressed keyup.shift-pressed\", function(event) {\n shiftPressed = !!event.shiftKey;\n return true;\n });\n $el.on(\"change\", \".backlog-table-body input:checkbox\", function(event) {\n var current, elements, nextAll, prevAll, target;\n if (lastChecked && shiftPressed) {\n elements = [];\n current = $(event.currentTarget).closest(\".us-item-row\");\n nextAll = lastChecked.nextAll();\n prevAll = lastChecked.prevAll();\n if (_.some(nextAll, function(next) {\n return next === current[0];\n })) {\n elements = lastChecked.nextUntil(current);\n } else if (_.some(prevAll, function(prev) {\n return prev === current[0];\n })) {\n elements = lastChecked.prevUntil(current);\n }\n _.map(elements, function(elm) {\n var input;\n input = $(elm).find(\"input:checkbox\");\n input.prop('checked', true);\n return checkSelected(input);\n });\n }\n target = angular.element(event.currentTarget);\n target.closest(\".us-item-row\").toggleClass('is-checked');\n return checkSelected(target);\n });\n $el.on(\"click\", \"#move-to-latest-sprint\", (function(_this) {\n return function(event) {\n var ussToMove;\n ussToMove = getUsToMove();\n return $scope.$apply(_.partial(moveToLatestSprint, ussToMove));\n };\n })(this));\n $el.on(\"click\", \"#move-to-current-sprint\", (function(_this) {\n return function(event) {\n var ussToMove;\n ussToMove = getUsToMove();\n return $scope.$apply(_.partial(moveToCurrentSprint, ussToMove));\n };\n })(this));\n return $el.on(\"click\", \"#show-tags\", function(event) {\n event.preventDefault();\n $ctrl.toggleShowTags();\n return showHideTags($ctrl);\n });\n };\n showHideTags = function($ctrl) {\n var elm, text;\n elm = angular.element(\"#show-tags\");\n if ($ctrl.showTags) {\n elm.addClass(\"active\");\n text = $translate.instant(\"BACKLOG.TAGS.HIDE\");\n return elm.text(text);\n } else {\n elm.removeClass(\"active\");\n text = $translate.instant(\"BACKLOG.TAGS.SHOW\");\n return elm.text(text);\n }\n };\n showHideFilter = function($scope, $el, $ctrl) {\n var hideText, showText, sidebar, target;\n sidebar = $el.find(\"sidebar.filters-bar\");\n sidebar.one(\"transitionend\", function() {\n return timeout(150, function() {\n $rootscope.$broadcast(\"resize\");\n return $('.burndown').css(\"visibility\", \"visible\");\n });\n });\n target = angular.element(\"#show-filters-button\");\n $('.burndown').css(\"visibility\", \"hidden\");\n sidebar.toggleClass(\"active\");\n target.toggleClass(\"active\");\n hideText = $translate.instant(\"BACKLOG.FILTERS.HIDE\");\n showText = $translate.instant(\"BACKLOG.FILTERS.SHOW\");\n toggleText(target, [hideText, showText]);\n if (!sidebar.hasClass(\"active\")) {\n $ctrl.resetFilters();\n } else {\n $ctrl.restoreFilters();\n }\n return $ctrl.toggleActiveFilters();\n };\n linkFilters = function($scope, $el, $attrs, $ctrl) {\n $scope.filtersSearch = {};\n return $el.on(\"click\", \"#show-filters-button\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n return showHideFilter($scope, $el, $ctrl);\n });\n });\n };\n link = function($scope, $el, $attrs, $rootscope) {\n var $ctrl, filters;\n $ctrl = $el.controller();\n linkToolbar($scope, $el, $attrs, $ctrl);\n linkFilters($scope, $el, $attrs, $ctrl);\n linkDoomLine($scope, $el, $attrs, $ctrl);\n $el.find(\".backlog-table-body\").disableSelection();\n filters = $ctrl.getUrlFilters();\n if (filters.status || filters.tags || filters.q) {\n showHideFilter($scope, $el, $ctrl);\n }\n $scope.$on(\"showTags\", function() {\n return showHideTags($ctrl);\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return $(window).off(\".shift-pressed\");\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklog\", [\"$tgRepo\", \"$rootScope\", \"$translate\", BacklogDirective]);\n\n UsRolePointsSelectorDirective = function($rootscope, $template, $compile, $translate) {\n var link, selectionTemplate;\n selectionTemplate = $template.get(\"backlog/us-role-points-popover.html\", true);\n link = function($scope, $el, $attrs) {\n bindOnce($scope, \"project\", function(project) {\n var numberOfRoles, roles;\n roles = _.filter(project.roles, \"computable\");\n numberOfRoles = _.size(roles);\n if (numberOfRoles > 1) {\n return $el.append($compile(selectionTemplate({\n \"roles\": roles\n }))($scope));\n } else {\n $el.find(\".icon-arrow-bottom\").remove();\n return $el.find(\".header-points\").addClass(\"not-clickable\");\n }\n });\n $scope.$on(\"uspoints:select\", function(ctx, roleId, roleName) {\n $el.find(\".popover\").popover().close();\n return $el.find(\".header-points\").html(roleName + \"/Total\");\n });\n $scope.$on(\"uspoints:clear-selection\", function(ctx, roleId) {\n var text;\n $el.find(\".popover\").popover().close();\n text = $translate.instant(\"COMMON.FIELDS.POINTS\");\n return $el.find(\".header-points\").text(text);\n });\n $el.on(\"click\", function(event) {\n var target;\n target = angular.element(event.target);\n if (target.is(\"span\") || target.is(\"div\")) {\n event.stopPropagation();\n }\n return $el.find(\".popover\").popover().open();\n });\n $el.on(\"click\", \".clear-selection\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $rootscope.$broadcast(\"uspoints:clear-selection\");\n });\n $el.on(\"click\", \".role\", function(event) {\n var rolScope, target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n rolScope = target.scope();\n return $rootscope.$broadcast(\"uspoints:select\", target.data(\"role-id\"), target.text());\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUsRolePointsSelector\", [\"$rootScope\", \"$tgTemplate\", \"$compile\", UsRolePointsSelectorDirective]);\n\n UsPointsDirective = function($tgEstimationsService, $repo, $tgTemplate) {\n var link, rolesTemplate;\n rolesTemplate = $tgTemplate.get(\"common/estimation/us-points-roles-popover.html\", true);\n link = function($scope, $el, $attrs) {\n var $ctrl, bindClickElements, estimationProcess, filteringRoleId, renderRolesSelector, selectedRoleId, updatingSelectedRoleId;\n $ctrl = $el.controller();\n updatingSelectedRoleId = null;\n selectedRoleId = null;\n filteringRoleId = null;\n estimationProcess = null;\n $scope.$on(\"uspoints:select\", function(ctx, roleId, roleName) {\n var us;\n us = $scope.$eval($attrs.tgBacklogUsPoints);\n selectedRoleId = roleId;\n return estimationProcess.render();\n });\n $scope.$on(\"uspoints:clear-selection\", function(ctx) {\n var us;\n us = $scope.$eval($attrs.tgBacklogUsPoints);\n selectedRoleId = null;\n return estimationProcess.render();\n });\n $scope.$watch($attrs.tgBacklogUsPoints, function(us) {\n var roles;\n if (us) {\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project);\n roles = estimationProcess.calculateRoles();\n if (roles.length === 0) {\n $el.find(\".icon-arrow-bottom\").remove();\n $el.find(\"a.us-points\").addClass(\"not-clickable\");\n } else if (roles.length === 1) {\n selectedRoleId = _.keys(us.points)[0];\n }\n if (estimationProcess.isEditable) {\n bindClickElements();\n }\n estimationProcess.onSelectedPointForRole = function(roleId, pointId) {\n return this.save(roleId, pointId).then(function() {\n return $ctrl.loadProjectStats();\n });\n };\n estimationProcess.render = function() {\n var ctx, html, mainTemplate, pointId, pointObj, template, text, title, totalPoints;\n totalPoints = this.calculateTotalPoints();\n if ((selectedRoleId == null) || roles.length === 1) {\n text = totalPoints;\n title = totalPoints;\n } else {\n pointId = this.us.points[selectedRoleId];\n pointObj = this.pointsById[pointId];\n text = pointObj.name + \" / \" + totalPoints + \"\";\n title = pointObj.name + \" / \" + totalPoints;\n }\n ctx = {\n totalPoints: totalPoints,\n roles: this.calculateRoles(),\n editable: this.isEditable,\n text: text,\n title: title\n };\n mainTemplate = \"common/estimation/us-estimation-total.html\";\n template = $tgTemplate.get(mainTemplate, true);\n html = template(ctx);\n return this.$el.html(html);\n };\n return estimationProcess.render();\n }\n });\n renderRolesSelector = function() {\n var html, roles;\n roles = estimationProcess.calculateRoles();\n html = rolesTemplate({\n \"roles\": roles\n });\n $el.append(html);\n return $el.find(\".pop-role\").popover().open(function() {\n return $(this).remove();\n });\n };\n bindClickElements = function() {\n $el.on(\"click\", \"a.us-points span\", function(event) {\n var us;\n event.preventDefault();\n event.stopPropagation();\n us = $scope.$eval($attrs.tgBacklogUsPoints);\n updatingSelectedRoleId = selectedRoleId;\n if (selectedRoleId != null) {\n return estimationProcess.renderPointsSelector(selectedRoleId);\n } else {\n return renderRolesSelector();\n }\n });\n return $el.on(\"click\", \".role\", function(event) {\n var popRolesDom, target, us;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n us = $scope.$eval($attrs.tgBacklogUsPoints);\n updatingSelectedRoleId = target.data(\"role-id\");\n popRolesDom = $el.find(\".pop-role\");\n popRolesDom.find(\"a\").removeClass(\"active\");\n popRolesDom.find(\"a[data-role-id='\" + updatingSelectedRoleId + \"']\").addClass(\"active\");\n return estimationProcess.renderPointsSelector(updatingSelectedRoleId);\n });\n };\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogUsPoints\", [\"$tgEstimationsService\", \"$tgRepo\", \"$tgTemplate\", UsPointsDirective]);\n\n ToggleBurndownVisibility = function($storage) {\n var hide, link, show;\n hide = function() {\n $(\".js-burndown-graph\").removeClass(\"shown\");\n $(\".js-toggle-burndown-visibility-button\").removeClass(\"active\");\n return $(\".js-burndown-graph\").removeClass(\"open\");\n };\n show = function(firstLoad) {\n $(\".js-toggle-burndown-visibility-button\").addClass(\"active\");\n if (firstLoad) {\n return $(\".js-burndown-graph\").addClass(\"shown\");\n } else {\n return $(\".js-burndown-graph\").addClass(\"open\");\n }\n };\n link = function($scope, $el, $attrs) {\n var firstLoad, hash, toggleGraph;\n firstLoad = true;\n hash = generateHash([\"is-burndown-grpahs-collapsed\"]);\n $scope.isBurndownGraphCollapsed = $storage.get(hash) || false;\n toggleGraph = function() {\n if ($scope.isBurndownGraphCollapsed) {\n hide(firstLoad);\n } else {\n show(firstLoad);\n }\n return firstLoad = false;\n };\n $scope.$watch(\"showGraphPlaceholder\", function() {\n if ($scope.showGraphPlaceholder != null) {\n $scope.isBurndownGraphCollapsed = $scope.isBurndownGraphCollapsed || $scope.showGraphPlaceholder;\n return toggleGraph();\n }\n });\n $el.on(\"click\", \".js-toggle-burndown-visibility-button\", function() {\n $scope.isBurndownGraphCollapsed = !$scope.isBurndownGraphCollapsed;\n $storage.set(hash, $scope.isBurndownGraphCollapsed);\n return toggleGraph();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgToggleBurndownVisibility\", [\"$tgStorage\", ToggleBurndownVisibility]);\n\n BurndownBacklogGraphDirective = function($translate) {\n var link, redrawChart;\n redrawChart = function(element, dataToDraw) {\n var client_increment_line, colors, data, evolution_line, j, milestonesRange, optimal_line, options, ref1, results, team_increment_line, width, zero_line;\n width = element.width();\n element.height(width / 6);\n milestonesRange = (function() {\n results = [];\n for (var j = 0, ref1 = dataToDraw.milestones.length - 1; 0 <= ref1 ? j <= ref1 : j >= ref1; 0 <= ref1 ? j++ : j--){ results.push(j); }\n return results;\n }).apply(this);\n data = [];\n zero_line = _.map(dataToDraw.milestones, function(ml) {\n return 0;\n });\n data.push({\n data: _.zip(milestonesRange, zero_line),\n lines: {\n fillColor: \"rgba(0,0,0,0)\"\n },\n points: {\n show: false\n }\n });\n optimal_line = _.map(dataToDraw.milestones, function(ml) {\n return ml.optimal;\n });\n data.push({\n data: _.zip(milestonesRange, optimal_line),\n lines: {\n fillColor: \"rgba(120,120,120,0.2)\"\n }\n });\n evolution_line = _.filter(_.map(dataToDraw.milestones, function(ml) {\n return ml.evolution;\n }), function(evolution) {\n return evolution != null;\n });\n data.push({\n data: _.zip(milestonesRange, evolution_line),\n lines: {\n fillColor: \"rgba(102,153,51,0.3)\"\n }\n });\n client_increment_line = _.map(dataToDraw.milestones, function(ml) {\n return -ml[\"team-increment\"] - ml[\"client-increment\"];\n });\n data.push({\n data: _.zip(milestonesRange, client_increment_line),\n lines: {\n fillColor: \"rgba(255,51,51,0.3)\"\n }\n });\n team_increment_line = _.map(dataToDraw.milestones, function(ml) {\n return -ml[\"team-increment\"];\n });\n data.push({\n data: _.zip(milestonesRange, team_increment_line),\n lines: {\n fillColor: \"rgba(153,51,51,0.3)\"\n }\n });\n colors = [\"rgba(0,0,0,1)\", \"rgba(120,120,120,0.2)\", \"rgba(102,153,51,1)\", \"rgba(153,51,51,1)\", \"rgba(255,51,51,1)\"];\n options = {\n grid: {\n borderWidth: {\n top: 0,\n right: 1,\n left: 0,\n bottom: 0\n },\n borderColor: \"#ccc\",\n hoverable: true\n },\n xaxis: {\n ticks: dataToDraw.milestones.length,\n axisLabel: $translate.instant(\"BACKLOG.CHART.XAXIS_LABEL\"),\n axisLabelUseCanvas: true,\n axisLabelFontSizePixels: 12,\n axisLabelFontFamily: \"Verdana, Arial, Helvetica, Tahoma, sans-serif\",\n axisLabelPadding: 5,\n tickFormatter: function(val, axis) {\n return \"\";\n }\n },\n yaxis: {\n axisLabel: $translate.instant(\"BACKLOG.CHART.YAXIS_LABEL\"),\n axisLabelUseCanvas: true,\n axisLabelFontSizePixels: 12,\n axisLabelFontFamily: \"Verdana, Arial, Helvetica, Tahoma, sans-serif\",\n axisLabelPadding: 5\n },\n series: {\n shadowSize: 0,\n lines: {\n show: true,\n fill: true\n },\n points: {\n show: true,\n fill: true,\n radius: 4,\n lineWidth: 2\n }\n },\n colors: colors,\n tooltip: true,\n tooltipOpts: {\n content: function(label, xval, yval, flotItem) {\n var ctx;\n if (flotItem.seriesIndex === 1) {\n ctx = {\n sprintName: dataToDraw.milestones[xval].name,\n value: Math.abs(yval)\n };\n return $translate.instant(\"BACKLOG.CHART.OPTIMAL\", ctx);\n } else if (flotItem.seriesIndex === 2) {\n ctx = {\n sprintName: dataToDraw.milestones[xval].name,\n value: Math.abs(yval)\n };\n return $translate.instant(\"BACKLOG.CHART.REAL\", ctx);\n } else if (flotItem.seriesIndex === 3) {\n ctx = {\n sprintName: dataToDraw.milestones[xval].name,\n value: Math.abs(yval)\n };\n return $translate.instant(\"BACKLOG.CHART.INCREMENT_CLIENT\", ctx);\n } else {\n ctx = {\n sprintName: dataToDraw.milestones[xval].name,\n value: Math.abs(yval)\n };\n return $translate.instant(\"BACKLOG.CHART.INCREMENT_TEAM\", ctx);\n }\n }\n }\n };\n element.empty();\n return element.plot(data, options).data(\"plot\");\n };\n link = function($scope, $el, $attrs) {\n var element;\n element = angular.element($el);\n $scope.$watch(\"stats\", function(value) {\n if ($scope.stats != null) {\n redrawChart(element, $scope.stats);\n return $scope.$on(\"resize\", function() {\n return redrawChart(element, $scope.stats);\n });\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBurndownBacklogGraph\", [\"$translate\", BurndownBacklogGraphDirective]);\n\n TgBacklogProgressBarDirective = function($template, $compile) {\n var adjustPercentaje, link, render, template;\n template = $template.get(\"backlog/progress-bar.html\", true);\n render = function(scope, el, projectPointsPercentaje, closedPointsPercentaje) {\n var html;\n html = template({\n projectPointsPercentaje: projectPointsPercentaje,\n closedPointsPercentaje: closedPointsPercentaje\n });\n html = $compile(html)(scope);\n return el.html(html);\n };\n adjustPercentaje = function(percentage) {\n var adjusted;\n adjusted = _.max([0, percentage]);\n adjusted = _.min([100, adjusted]);\n return Math.round(adjusted);\n };\n link = function($scope, $el, $attrs) {\n var element;\n element = angular.element($el);\n $scope.$watch($attrs.tgBacklogProgressBar, function(stats) {\n var closedPoints, closedPointsPercentaje, definedPoints, projectPointsPercentaje, totalPoints;\n if (stats != null) {\n totalPoints = stats.total_points ? stats.total_points : stats.defined_points;\n definedPoints = stats.defined_points;\n closedPoints = stats.closed_points;\n if (definedPoints > totalPoints) {\n projectPointsPercentaje = totalPoints * 100 / definedPoints;\n closedPointsPercentaje = closedPoints * 100 / definedPoints;\n } else {\n projectPointsPercentaje = 100;\n closedPointsPercentaje = closedPoints * 100 / totalPoints;\n }\n projectPointsPercentaje = adjustPercentaje(projectPointsPercentaje - 3);\n closedPointsPercentaje = adjustPercentaje(closedPointsPercentaje - 3);\n return render($scope, $el, projectPointsPercentaje, closedPointsPercentaje);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogProgressBar\", [\"$tgTemplate\", \"$compile\", TgBacklogProgressBarDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog/sortable.coffee\n */\n\n(function() {\n var BacklogEmptySortableDirective, BacklogSortableDirective, SprintSortableDirective, bindOnce, deleteElement, groupBy, mixOf, module, scopeDefer, taiga, toggleText;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n module = angular.module(\"taigaBacklog\");\n\n deleteElement = function(el) {\n el.scope().$destroy();\n el.off();\n return el.remove();\n };\n\n BacklogSortableDirective = function($repo, $rs, $rootscope, $tgConfirm, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var getUsIndex;\n getUsIndex = (function(_this) {\n return function(us) {\n return $(us).index(\".backlog-table-body .row\");\n };\n })(this);\n bindOnce($scope, \"project\", function(project) {\n var filterError;\n if (!(project.my_permissions.indexOf(\"modify_us\") > -1)) {\n return;\n }\n filterError = function() {\n var text;\n text = $translate.instant(\"BACKLOG.SORTABLE_FILTER_ERROR\");\n return $tgConfirm.notify(\"error\", text);\n };\n $el.sortable({\n items: \".us-item-row\",\n cancel: \".popover\",\n connectWith: \".sprint\",\n dropOnEmpty: true,\n placeholder: \"row us-item-row us-item-drag sortable-placeholder\",\n scroll: true,\n disableHorizontalScroll: true,\n tolerance: \"pointer\",\n revert: false,\n start: function() {\n return $(document.body).addClass(\"drag-active\");\n },\n stop: function() {\n $(document.body).removeClass(\"drag-active\");\n if ($el.hasClass(\"active-filters\")) {\n $el.sortable(\"cancel\");\n return filterError();\n }\n }\n });\n $el.on(\"multiplesortreceive\", function(event, ui) {\n var itemIndex, itemUs;\n if ($el.hasClass(\"active-filters\")) {\n ui.source.sortable(\"cancel\");\n filterError();\n return;\n }\n itemUs = ui.item.scope().us;\n itemIndex = getUsIndex(ui.item);\n deleteElement(ui.item);\n $scope.$emit(\"sprint:us:move\", [itemUs], itemIndex, null);\n return ui.item.find('a').removeClass('noclick');\n });\n $el.on(\"multiplesortstop\", function(event, ui) {\n var index, items, us;\n if ($(ui.items[0]).parent().length === 0) {\n return;\n }\n if ($el.hasClass(\"active-filters\")) {\n return;\n }\n items = _.sortBy(ui.items, function(item) {\n return $(item).index();\n });\n index = _.min(_.map(items, function(item) {\n return getUsIndex(item);\n }));\n us = _.map(items, function(item) {\n var itemUs;\n item = $(item);\n itemUs = item.scope().us;\n setTimeout(((function(_this) {\n return function() {\n return item.find('a').removeClass('noclick');\n };\n })(this)), 300);\n return itemUs;\n });\n return $scope.$emit(\"sprint:us:move\", us, index, null);\n });\n return $el.on(\"sortstart\", function(event, ui) {\n return ui.item.find('a').addClass('noclick');\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n BacklogEmptySortableDirective = function($repo, $rs, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n bindOnce($scope, \"project\", function(project) {\n if (project.my_permissions.indexOf(\"modify_us\") > -1) {\n $el.sortable({\n items: \".us-item-row\",\n dropOnEmpty: true\n });\n return $el.on(\"sortreceive\", function(event, ui) {\n var itemIndex, itemUs;\n itemUs = ui.item.scope().us;\n itemIndex = ui.item.index();\n deleteElement(ui.item);\n $scope.$emit(\"sprint:us:move\", [itemUs], itemIndex, null);\n return ui.item.find('a').removeClass('noclick');\n });\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n SprintSortableDirective = function($repo, $rs, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, \"project\", function(project) {\n if (project.my_permissions.indexOf(\"modify_us\") > -1) {\n $el.sortable({\n scroll: true,\n dropOnEmpty: true,\n items: \".sprint-table .milestone-us-item-row\",\n disableHorizontalScroll: true,\n connectWith: \".sprint,.backlog-table-body,.empty-backlog\",\n placeholder: \"row us-item-row sortable-placeholder\",\n forcePlaceholderSize: true\n });\n $el.on(\"multiplesortreceive\", function(event, ui) {\n var index, items, us;\n items = _.sortBy(ui.items, function(item) {\n return $(item).index();\n });\n index = _.min(_.map(items, function(item) {\n return $(item).index();\n }));\n us = _.map(items, function(item) {\n var itemUs;\n item = $(item);\n itemUs = item.scope().us;\n deleteElement(item);\n return itemUs;\n });\n return $scope.$emit(\"sprint:us:move\", us, index, $scope.sprint.id);\n });\n $el.on(\"multiplesortstop\", function(event, ui) {\n var itemIndex, itemUs;\n if (ui.item.parent().length === 0) {\n return;\n }\n itemUs = ui.item.scope().us;\n itemIndex = ui.item.index();\n setTimeout(((function(_this) {\n return function() {\n return ui.item.find('a').removeClass('noclick');\n };\n })(this)), 300);\n return $scope.$emit(\"sprint:us:move\", [itemUs], itemIndex, $scope.sprint.id);\n });\n return $el.on(\"sortstart\", function(event, ui) {\n return ui.item.find('a').addClass('noclick');\n });\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogSortable\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", \"$tgConfirm\", \"$translate\", BacklogSortableDirective]);\n\n module.directive(\"tgBacklogEmptySortable\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", BacklogEmptySortableDirective]);\n\n module.directive(\"tgSprintSortable\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", SprintSortableDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog/sprints.coffee\n */\n\n(function() {\n var BacklogSprintDirective, BacklogSprintHeaderDirective, ToggleExcludeClosedSprintsVisualization, module, taiga;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaBacklog\");\n\n BacklogSprintDirective = function($repo, $rootscope) {\n var link, slideOptions, sprintTableMinHeight, toggleSprint;\n sprintTableMinHeight = 50;\n slideOptions = {\n duration: 500,\n easing: 'linear'\n };\n toggleSprint = (function(_this) {\n return function($el) {\n var sprintArrow, sprintTable;\n sprintTable = $el.find(\".sprint-table\");\n sprintArrow = $el.find(\".icon-arrow-up\");\n sprintArrow.toggleClass('active');\n return sprintTable.toggleClass('open');\n };\n })(this);\n link = function($scope, $el, $attrs) {\n $scope.$watch($attrs.tgBacklogSprint, function(sprint) {\n sprint = $scope.$eval($attrs.tgBacklogSprint);\n if (sprint.closed) {\n return $el.addClass(\"sprint-closed\");\n } else {\n return toggleSprint($el);\n }\n });\n $el.on(\"click\", \".sprint-name > .icon-arrow-up\", function(event) {\n event.preventDefault();\n toggleSprint($el);\n return $el.find(\".sprint-table\").slideToggle(slideOptions);\n });\n $el.on(\"click\", \".sprint-name > .icon-edit\", function(event) {\n var sprint;\n event.preventDefault();\n sprint = $scope.$eval($attrs.tgBacklogSprint);\n return $rootscope.$broadcast(\"sprintform:edit\", sprint);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogSprint\", [\"$tgRepo\", \"$rootScope\", BacklogSprintDirective]);\n\n BacklogSprintHeaderDirective = function($navUrls, $template, $compile, $translate) {\n var link, template;\n template = $template.get(\"backlog/sprint-header.html\");\n link = function($scope, $el, $attrs, $model) {\n var isEditable, isVisible, prettyDate, render;\n prettyDate = $translate.instant(\"BACKLOG.SPRINTS.DATE\");\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_milestone\") !== -1;\n };\n isVisible = function() {\n return $scope.project.my_permissions.indexOf(\"view_milestones\") !== -1;\n };\n render = function(sprint) {\n var compiledTemplate, ctx, estimatedDateRange, finish, start, taskboardUrl, templateScope;\n taskboardUrl = $navUrls.resolve(\"project-taskboard\", {\n project: $scope.project.slug,\n sprint: sprint.slug\n });\n start = moment(sprint.estimated_start).format(prettyDate);\n finish = moment(sprint.estimated_finish).format(prettyDate);\n estimatedDateRange = start + \"-\" + finish;\n ctx = {\n name: sprint.name,\n taskboardUrl: taskboardUrl,\n estimatedDateRange: estimatedDateRange,\n closedPoints: sprint.closed_points || 0,\n totalPoints: sprint.total_points || 0,\n isVisible: isVisible(),\n isEditable: isEditable()\n };\n templateScope = $scope.$new();\n _.assign(templateScope, ctx);\n compiledTemplate = $compile(template)(templateScope);\n return $el.html(compiledTemplate);\n };\n $scope.$watch($attrs.ngModel, function(sprint) {\n return render(sprint);\n });\n $scope.$on(\"sprintform:edit:success\", function() {\n return render($model.$modelValue);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgBacklogSprintHeader\", [\"$tgNavUrls\", \"$tgTemplate\", \"$compile\", \"$translate\", BacklogSprintHeaderDirective]);\n\n ToggleExcludeClosedSprintsVisualization = function($rootscope, $loading, $translate) {\n var excludeClosedSprints, link;\n excludeClosedSprints = true;\n link = function($scope, $el, $attrs) {\n var currentLoading, loadingElm;\n loadingElm = $(\"
\");\n $el.after(loadingElm);\n currentLoading = null;\n $el.on(\"click\", function(event) {\n event.preventDefault();\n excludeClosedSprints = !excludeClosedSprints;\n currentLoading = $loading().target(loadingElm).start();\n if (excludeClosedSprints) {\n return $rootscope.$broadcast(\"backlog:unload-closed-sprints\");\n } else {\n return $rootscope.$broadcast(\"backlog:load-closed-sprints\");\n }\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return $scope.$on(\"closed-sprints:reloaded\", (function(_this) {\n return function(ctx, sprints) {\n var key, text;\n currentLoading.finish();\n if (sprints.length > 0) {\n key = \"BACKLOG.SPRINTS.ACTION_HIDE_CLOSED_SPRINTS\";\n } else {\n key = \"BACKLOG.SPRINTS.ACTION_SHOW_CLOSED_SPRINTS\";\n }\n text = $translate.instant(key);\n return $el.find(\".text\").text(text);\n };\n })(this));\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogToggleClosedSprintsVisualization\", [\"$rootScope\", \"$tgLoading\", \"$translate\", ToggleExcludeClosedSprintsVisualization]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard/charts.coffee\n */\n\n(function() {\n var SprintGraphDirective, bindOnce, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n timeout = this.taiga.timeout;\n\n module = angular.module(\"taigaTaskboard\");\n\n SprintGraphDirective = function($translate) {\n var link, redrawChart;\n redrawChart = function(element, dataToDraw) {\n var data, days, options, width;\n width = element.width();\n element.height(240);\n days = _.map(dataToDraw, function(x) {\n return moment(x.day);\n });\n data = [];\n data.unshift({\n data: _.zip(days, _.map(dataToDraw, function(d) {\n return d.optimal_points;\n })),\n lines: {\n fillColor: \"rgba(120,120,120,0.2)\"\n }\n });\n data.unshift({\n data: _.zip(days, _.map(dataToDraw, function(d) {\n return d.open_points;\n })),\n lines: {\n fillColor: \"rgba(102,153,51,0.3)\"\n }\n });\n options = {\n grid: {\n borderWidth: {\n top: 0,\n right: 1,\n left: 0,\n bottom: 0\n },\n borderColor: '#ccc',\n hoverable: true\n },\n xaxis: {\n tickSize: [1, \"day\"],\n min: days[0],\n max: _.last(days),\n mode: \"time\",\n daysNames: days,\n axisLabel: $translate.instant(\"TASKBOARD.CHARTS.XAXIS_LABEL\"),\n axisLabelUseCanvas: true,\n axisLabelFontSizePixels: 12,\n axisLabelFontFamily: 'Verdana, Arial, Helvetica, Tahoma, sans-serif',\n axisLabelPadding: 5\n },\n yaxis: {\n min: 0,\n axisLabel: $translate.instant(\"TASKBOARD.CHARTS.YAXIS_LABEL\"),\n axisLabelUseCanvas: true,\n axisLabelFontSizePixels: 12,\n axisLabelFontFamily: 'Verdana, Arial, Helvetica, Tahoma, sans-serif',\n axisLabelPadding: 5\n },\n series: {\n shadowSize: 0,\n lines: {\n show: true,\n fill: true\n },\n points: {\n show: true,\n fill: true,\n radius: 4,\n lineWidth: 2\n }\n },\n colors: [\"rgba(102,153,51,1)\", \"rgba(120,120,120,0.2)\"],\n tooltip: true,\n tooltipOpts: {\n content: function(label, xval, yval, flotItem) {\n var formattedDate, roundedValue;\n formattedDate = moment(xval).format($translate.instant(\"TASKBOARD.CHARTS.DATE\"));\n roundedValue = Math.round(yval);\n if (flotItem.seriesIndex === 1) {\n return $translate.instant(\"TASKBOARD.CHARTS.OPTIMAL\", {\n formattedDate: formattedDate,\n roundedValue: roundedValue\n });\n } else {\n return $translate.instant(\"TASKBOARD.CHARTS.REAL\", {\n formattedDate: formattedDate,\n roundedValue: roundedValue\n });\n }\n }\n }\n };\n element.empty();\n return element.plot(data, options).data(\"plot\");\n };\n link = function($scope, $el, $attrs) {\n var element;\n element = angular.element($el);\n $scope.$on(\"resize\", function() {\n if ($scope.stats) {\n return redrawChart(element, $scope.stats.days);\n }\n });\n $scope.$on(\"taskboard:graph:toggle-visibility\", function() {\n $el.parent().toggleClass('open');\n return timeout(100, function() {\n if ($scope.stats) {\n return redrawChart(element, $scope.stats.days);\n }\n });\n });\n $scope.$watch('stats', function(value) {\n if ($scope.stats == null) {\n return;\n }\n return redrawChart(element, $scope.stats.days);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgSprintGraph\", [\"$translate\", SprintGraphDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard/lightboxes.coffee\n */\n\n(function() {\n var CreateBulkTasksDirective, CreateEditTaskDirective, bindOnce, debounce, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n CreateEditTaskDirective = function($repo, $model, $rs, $rootscope, $loading, lightboxService, $translate, $q, attachmentsService) {\n var link;\n link = function($scope, $el, attrs) {\n var attachmentsToAdd, attachmentsToDelete, createAttachments, deleteAttachments, resetAttachments, submit, submitButton;\n $scope.isNew = true;\n attachmentsToAdd = Immutable.List();\n attachmentsToDelete = Immutable.List();\n resetAttachments = function() {\n attachmentsToAdd = Immutable.List();\n return attachmentsToDelete = Immutable.List();\n };\n $scope.addAttachment = function(attachment) {\n return attachmentsToAdd = attachmentsToAdd.push(attachment);\n };\n $scope.deleteAttachment = function(attachment) {\n return attachmentsToDelete = attachmentsToDelete.push(attachment);\n };\n createAttachments = function(obj) {\n var promises;\n promises = _.map(attachmentsToAdd.toJS(), function(attachment) {\n return attachmentsService.upload(attachment.file, obj.id, $scope.task.project, 'task');\n });\n return $q.all(promises);\n };\n deleteAttachments = function(obj) {\n var promises;\n console.log(attachmentsToDelete.toJS());\n promises = _.map(attachmentsToDelete.toJS(), function(attachment) {\n return attachmentsService[\"delete\"](\"task\", attachment.id);\n });\n return $q.all(promises);\n };\n $scope.$on(\"taskform:new\", function(ctx, sprintId, usId) {\n var create, newTask;\n $scope.task = {\n project: $scope.projectId,\n milestone: sprintId,\n user_story: usId,\n is_archived: false,\n status: $scope.project.default_task_status,\n assigned_to: null,\n tags: []\n };\n $scope.isNew = true;\n $scope.attachments = Immutable.List();\n resetAttachments();\n create = $translate.instant(\"COMMON.CREATE\");\n $el.find(\".button-green\").html(create);\n newTask = $translate.instant(\"LIGHTBOX.CREATE_EDIT_TASK.TITLE\");\n $el.find(\".title\").html(newTask + \" \");\n $el.find(\".tag-input\").val(\"\");\n return lightboxService.open($el);\n });\n $scope.$on(\"taskform:edit\", function(ctx, task, attachments) {\n var edit, save;\n $scope.task = task;\n $scope.isNew = false;\n $scope.attachments = Immutable.fromJS(attachments);\n resetAttachments();\n save = $translate.instant(\"COMMON.SAVE\");\n edit = $translate.instant(\"LIGHTBOX.CREATE_EDIT_TASK.ACTION_EDIT\");\n $el.find(\".button-green\").html(save);\n $el.find(\".title\").html(edit + \" \");\n $el.find(\".tag-input\").val(\"\");\n return lightboxService.open($el);\n });\n submitButton = $el.find(\".submit-button\");\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var broadcastEvent, currentLoading, form, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n if ($scope.isNew) {\n promise = $repo.create(\"tasks\", $scope.task);\n broadcastEvent = \"taskform:new:success\";\n } else {\n promise = $repo.save($scope.task);\n broadcastEvent = \"taskform:edit:success\";\n }\n promise.then(function(data) {\n createAttachments(data);\n deleteAttachments(data);\n return data;\n });\n currentLoading = $loading().target(submitButton).start();\n return promise.then(function(data) {\n currentLoading.finish();\n lightboxService.close($el);\n return $rootscope.$broadcast(broadcastEvent, data);\n });\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n CreateBulkTasksDirective = function($repo, $rs, $rootscope, $loading, lightboxService) {\n var link;\n link = function($scope, $el, attrs) {\n var submit, submitButton;\n $scope.form = {\n data: \"\",\n usId: null\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, data, form, projectId, promise, sprintId, usId;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n data = $scope.form.data;\n projectId = $scope.projectId;\n sprintId = $scope.form.sprintId;\n usId = $scope.form.usId;\n promise = $rs.tasks.bulkCreate(projectId, sprintId, usId, data);\n promise.then(function(result) {\n currentLoading.finish();\n $rootscope.$broadcast(\"taskform:bulk:success\", result);\n return lightboxService.close($el);\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return console.log(\"FAIL\");\n });\n };\n })(this));\n $scope.$on(\"taskform:bulk\", function(ctx, sprintId, usId) {\n lightboxService.open($el);\n return $scope.form = {\n data: \"\",\n sprintId: sprintId,\n usId: usId\n };\n });\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module = angular.module(\"taigaTaskboard\");\n\n module.directive(\"tgLbCreateEditTask\", [\"$tgRepo\", \"$tgModel\", \"$tgResources\", \"$rootScope\", \"$tgLoading\", \"lightboxService\", \"$translate\", \"$q\", \"tgAttachmentsService\", CreateEditTaskDirective]);\n\n module.directive(\"tgLbCreateBulkTasks\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", \"$tgLoading\", \"lightboxService\", CreateBulkTasksDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard.coffee\n */\n\n(function() {\n var TaskboardController, TaskboardDirective, TaskboardSquishColumnDirective, TaskboardTaskDirective, TaskboardUserDirective, bindMethods, bindOnce, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n toggleText = this.taiga.toggleText;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n scopeDefer = this.taiga.scopeDefer;\n\n timeout = this.taiga.timeout;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaTaskboard\");\n\n TaskboardController = (function(superClass) {\n extend(TaskboardController, superClass);\n\n TaskboardController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"tgAppMetaService\", \"$tgLocation\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\"];\n\n function TaskboardController(scope, rootscope, repo, confirm, rs1, params1, q, appMetaService, location, navUrls, events, analytics, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs1;\n this.params = params1;\n this.q = q;\n this.appMetaService = appMetaService;\n this.location = location;\n this.navUrls = navUrls;\n this.events = events;\n this.analytics = analytics;\n this.translate = translate;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"TASKBOARD.SECTION_NAME\");\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n return _this._setMeta();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n TaskboardController.prototype._setMeta = function() {\n var description, prettyDate, title;\n prettyDate = this.translate.instant(\"BACKLOG.SPRINTS.DATE\");\n title = this.translate.instant(\"TASKBOARD.PAGE_TITLE\", {\n projectName: this.scope.project.name,\n sprintName: this.scope.sprint.name\n });\n description = this.translate.instant(\"TASKBOARD.PAGE_DESCRIPTION\", {\n projectName: this.scope.project.name,\n sprintName: this.scope.sprint.name,\n startDate: moment(this.scope.sprint.estimated_start).format(prettyDate),\n endDate: moment(this.scope.sprint.estimated_finish).format(prettyDate),\n completedPercentage: this.scope.stats.completedPercentage || \"0\",\n completedPoints: this.scope.stats.completedPointsSum || \"--\",\n totalPoints: this.scope.stats.totalPointsSum || \"--\",\n openTasks: this.scope.stats.openTasks || \"--\",\n totalTasks: this.scope.stats.total_tasks || \"--\"\n });\n return this.appMetaService.setAll(title, description);\n };\n\n TaskboardController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"taskform:bulk:success\", (function(_this) {\n return function() {\n _this.loadTaskboard();\n return _this.analytics.trackEvent(\"task\", \"create\", \"bulk create task on taskboard\", 1);\n };\n })(this));\n this.scope.$on(\"taskform:new:success\", (function(_this) {\n return function() {\n _this.loadTaskboard();\n return _this.analytics.trackEvent(\"task\", \"create\", \"create task on taskboard\", 1);\n };\n })(this));\n this.scope.$on(\"taskform:edit:success\", (function(_this) {\n return function() {\n return _this.loadTaskboard();\n };\n })(this));\n this.scope.$on(\"taskboard:task:move\", this.taskMove);\n return this.scope.$on(\"assigned-to:added\", (function(_this) {\n return function(ctx, userId, task) {\n var promise;\n task.assigned_to = userId;\n promise = _this.repo.save(task);\n return promise.then(null, function() {\n return console.log(\"FAIL\");\n });\n };\n })(this));\n };\n\n TaskboardController.prototype.initializeSubscription = function() {\n var routingKey, routingKey1;\n routingKey = \"changes.project.\" + this.scope.projectId + \".tasks\";\n this.events.subscribe(this.scope, routingKey, (function(_this) {\n return function(message) {\n return _this.loadTaskboard();\n };\n })(this));\n routingKey1 = \"changes.project.\" + this.scope.projectId + \".userstories\";\n return this.events.subscribe(this.scope, routingKey1, (function(_this) {\n return function(message) {\n _this.refreshTagsColors();\n _this.loadSprintStats();\n return _this.loadSprint();\n };\n })(this));\n };\n\n TaskboardController.prototype.loadProject = function() {\n return this.rs.projects.get(this.scope.projectId).then((function(_this) {\n return function(project) {\n if (!project.is_backlog_activated) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.project = project;\n _this.scope.pointsList = _.sortBy(project.points, \"order\");\n _this.scope.pointsById = groupBy(project.points, function(e) {\n return e.id;\n });\n _this.scope.roleById = groupBy(project.roles, function(e) {\n return e.id;\n });\n _this.scope.taskStatusList = _.sortBy(project.task_statuses, \"order\");\n _this.scope.usStatusList = _.sortBy(project.us_statuses, \"order\");\n _this.scope.usStatusById = groupBy(project.us_statuses, function(e) {\n return e.id;\n });\n _this.scope.$emit('project:loaded', project);\n _this.fillUsersAndRoles(project.members, project.roles);\n return project;\n };\n })(this));\n };\n\n TaskboardController.prototype.loadSprintStats = function() {\n return this.rs.sprints.stats(this.scope.projectId, this.scope.sprintId).then((function(_this) {\n return function(stats) {\n var completedPointsSum, remainingPointsSum, remainingTasks, totalPointsSum;\n totalPointsSum = _.reduce(_.values(stats.total_points), (function(res, n) {\n return res + n;\n }), 0);\n completedPointsSum = _.reduce(_.values(stats.completed_points), (function(res, n) {\n return res + n;\n }), 0);\n remainingPointsSum = totalPointsSum - completedPointsSum;\n remainingTasks = stats.total_tasks - stats.completed_tasks;\n _this.scope.stats = stats;\n _this.scope.stats.totalPointsSum = totalPointsSum;\n _this.scope.stats.completedPointsSum = completedPointsSum;\n _this.scope.stats.remainingPointsSum = remainingPointsSum;\n _this.scope.stats.remainingTasks = remainingTasks;\n if (stats.totalPointsSum) {\n _this.scope.stats.completedPercentage = Math.round(100 * stats.completedPointsSum / stats.totalPointsSum);\n } else {\n _this.scope.stats.completedPercentage = 0;\n }\n _this.scope.stats.openTasks = stats.total_tasks - stats.completed_tasks;\n return stats;\n };\n })(this));\n };\n\n TaskboardController.prototype.refreshTagsColors = function() {\n return this.rs.projects.tagsColors(this.scope.projectId).then((function(_this) {\n return function(tags_colors) {\n return _this.scope.project.tags_colors = tags_colors;\n };\n })(this));\n };\n\n TaskboardController.prototype.loadSprint = function() {\n return this.rs.sprints.get(this.scope.projectId, this.scope.sprintId).then((function(_this) {\n return function(sprint) {\n _this.scope.sprint = sprint;\n _this.scope.userstories = _.sortBy(sprint.user_stories, \"sprint_order\");\n return sprint;\n };\n })(this));\n };\n\n TaskboardController.prototype.loadTasks = function() {\n return this.rs.tasks.list(this.scope.projectId, this.scope.sprintId).then((function(_this) {\n return function(tasks) {\n var i, j, k, len, len1, len2, ref, ref1, ref2, status, task, us, usId;\n _this.scope.tasks = _.sortBy(tasks, 'taskboard_order');\n _this.scope.usTasks = {};\n ref = _.union(_this.scope.userstories, [\n {\n id: null\n }\n ]);\n for (i = 0, len = ref.length; i < len; i++) {\n us = ref[i];\n _this.scope.usTasks[us.id] = {};\n ref1 = _this.scope.taskStatusList;\n for (j = 0, len1 = ref1.length; j < len1; j++) {\n status = ref1[j];\n _this.scope.usTasks[us.id][status.id] = [];\n }\n }\n ref2 = _this.scope.tasks;\n for (k = 0, len2 = ref2.length; k < len2; k++) {\n task = ref2[k];\n if ((_this.scope.usTasks[task.user_story] != null) && (_this.scope.usTasks[task.user_story][task.status] != null)) {\n _this.scope.usTasks[task.user_story][task.status].push(task);\n }\n }\n if (tasks.length === 0) {\n if (_this.scope.userstories.length > 0) {\n usId = _this.scope.userstories[0].id;\n } else {\n usId = null;\n }\n _this.scope.usTasks[usId][_this.scope.taskStatusList[0].id].push({\n isPlaceholder: true\n });\n }\n return tasks;\n };\n })(this));\n };\n\n TaskboardController.prototype.loadTaskboard = function() {\n return this.q.all([\n this.refreshTagsColors(), this.loadSprintStats(), this.loadSprint().then((function(_this) {\n return function() {\n return _this.loadTasks();\n };\n })(this))\n ]);\n };\n\n TaskboardController.prototype.loadInitialData = function() {\n var params, promise;\n params = {\n pslug: this.params.pslug,\n sslug: this.params.sslug\n };\n promise = this.repo.resolve(params).then((function(_this) {\n return function(data) {\n _this.scope.projectId = data.project;\n _this.scope.sprintId = data.milestone;\n _this.initializeSubscription();\n return data;\n };\n })(this));\n return promise.then((function(_this) {\n return function() {\n return _this.loadProject();\n };\n })(this)).then((function(_this) {\n return function() {\n return _this.loadTaskboard();\n };\n })(this));\n };\n\n TaskboardController.prototype.refreshTasksOrder = function(tasks) {\n var data, items;\n items = this.resortTasks(tasks);\n data = this.prepareBulkUpdateData(items);\n return this.rs.tasks.bulkUpdateTaskTaskboardOrder(this.scope.project.id, data);\n };\n\n TaskboardController.prototype.resortTasks = function(tasks) {\n var i, index, item, items, len;\n items = [];\n for (index = i = 0, len = tasks.length; i < len; index = ++i) {\n item = tasks[index];\n item[\"taskboard_order\"] = index;\n if (item.isModified()) {\n items.push(item);\n }\n }\n return items;\n };\n\n TaskboardController.prototype.prepareBulkUpdateData = function(uses) {\n return _.map(uses, function(x) {\n return {\n \"task_id\": x.id,\n \"order\": x[\"taskboard_order\"]\n };\n });\n };\n\n TaskboardController.prototype.taskMove = function(ctx, task, usId, statusId, order) {\n var promise, r, tasks;\n r = this.scope.usTasks[task.user_story][task.status].indexOf(task);\n this.scope.usTasks[task.user_story][task.status].splice(r, 1);\n tasks = this.scope.usTasks[usId][statusId];\n tasks.splice(order, 0, task);\n task.user_story = usId;\n task.status = statusId;\n task.taskboard_order = order;\n promise = this.repo.save(task);\n this.rootscope.$broadcast(\"sprint:task:moved\", task);\n promise.then((function(_this) {\n return function() {\n _this.refreshTasksOrder(tasks);\n return _this.loadSprintStats();\n };\n })(this));\n return promise.then(null, (function(_this) {\n return function() {\n return console.log(\"FAIL TASK SAVE\");\n };\n })(this));\n };\n\n TaskboardController.prototype.addNewTask = function(type, us) {\n switch (type) {\n case \"standard\":\n return this.rootscope.$broadcast(\"taskform:new\", this.scope.sprintId, us != null ? us.id : void 0);\n case \"bulk\":\n return this.rootscope.$broadcast(\"taskform:bulk\", this.scope.sprintId, us != null ? us.id : void 0);\n }\n };\n\n TaskboardController.prototype.editTaskAssignedTo = function(task) {\n return this.rootscope.$broadcast(\"assigned-to:add\", task);\n };\n\n return TaskboardController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"TaskboardController\", TaskboardController);\n\n TaskboardDirective = function($rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl, tableBodyDom;\n $ctrl = $el.controller();\n $el.on(\"click\", \".toggle-analytics-visibility\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n target.toggleClass('active');\n return $rootscope.$broadcast(\"taskboard:graph:toggle-visibility\");\n });\n tableBodyDom = $el.find(\".taskboard-table-body\");\n tableBodyDom.on(\"scroll\", function(event) {\n var tableHeaderDom, target;\n target = angular.element(event.currentTarget);\n tableHeaderDom = $el.find(\".taskboard-table-header .taskboard-table-inner\");\n return tableHeaderDom.css(\"left\", -1 * target.scrollLeft());\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgTaskboard\", [\"$rootScope\", TaskboardDirective]);\n\n TaskboardTaskDirective = function($rootscope, $loading, $rs, $rs2) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n $el.disableSelection();\n $scope.$watch(\"task\", function(task) {\n if (task.is_blocked && !$el.hasClass(\"blocked\")) {\n return $el.addClass(\"blocked\");\n } else if (!task.is_blocked && $el.hasClass(\"blocked\")) {\n return $el.removeClass(\"blocked\");\n }\n });\n return $el.find(\".icon-edit\").on(\"click\", function(event) {\n if ($el.find('.icon-edit').hasClass('noclick')) {\n return;\n }\n return $scope.$apply(function() {\n var currentLoading, target, task;\n target = $(event.target);\n currentLoading = $loading().target(target).timeout(200).removeClasses(\"icon-edit\").start();\n task = $scope.task;\n return $rs.tasks.getByRef(task.project, task.ref).then((function(_this) {\n return function(editingTask) {\n return $rs2.attachments.list(\"task\", editingTask.id, editingTask.project).then(function(attachments) {\n $rootscope.$broadcast(\"taskform:edit\", editingTask, attachments.toJS());\n return currentLoading.finish();\n });\n };\n })(this));\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgTaskboardTask\", [\"$rootScope\", \"$tgLoading\", \"$tgResources\", \"tgResources\", TaskboardTaskDirective]);\n\n TaskboardSquishColumnDirective = function(rs) {\n var avatarWidth, link, maxColumnWidth;\n avatarWidth = 40;\n maxColumnWidth = 300;\n link = function($scope, $el, $attrs) {\n var getCeilWidth, recalculateStatusColumnWidth, recalculateTaskboardWidth, refreshTaskboardTableWidth, setStatusColumnWidth;\n $scope.$on(\"sprint:task:moved\", (function(_this) {\n return function() {\n return recalculateTaskboardWidth();\n };\n })(this));\n bindOnce($scope, \"usTasks\", function(project) {\n $scope.statusesFolded = rs.tasks.getStatusColumnModes($scope.project.id);\n $scope.usFolded = rs.tasks.getUsRowModes($scope.project.id, $scope.sprintId);\n return recalculateTaskboardWidth();\n });\n $scope.foldStatus = function(status) {\n $scope.statusesFolded[status.id] = !!!$scope.statusesFolded[status.id];\n rs.tasks.storeStatusColumnModes($scope.projectId, $scope.statusesFolded);\n return recalculateTaskboardWidth();\n };\n $scope.foldUs = function(us) {\n if (!us) {\n $scope.usFolded[null] = !!!$scope.usFolded[null];\n } else {\n $scope.usFolded[us.id] = !!!$scope.usFolded[us.id];\n }\n rs.tasks.storeUsRowModes($scope.projectId, $scope.sprintId, $scope.usFolded);\n return recalculateTaskboardWidth();\n };\n getCeilWidth = (function(_this) {\n return function(usId, statusId) {\n var tasks, tasksMatrixSize, width;\n tasks = $scope.usTasks[usId][statusId].length;\n if ($scope.statusesFolded[statusId]) {\n if (tasks && $scope.usFolded[usId]) {\n tasksMatrixSize = Math.round(Math.sqrt(tasks));\n width = avatarWidth * tasksMatrixSize;\n } else {\n width = avatarWidth;\n }\n return width;\n }\n return 0;\n };\n })(this);\n setStatusColumnWidth = (function(_this) {\n return function(statusId, width) {\n var column;\n column = $el.find(\".squish-status-\" + statusId);\n if (width) {\n return column.css('max-width', width);\n } else {\n return column.css(\"max-width\", maxColumnWidth);\n }\n };\n })(this);\n refreshTaskboardTableWidth = (function(_this) {\n return function() {\n var columnWidths, columns, totalWidth;\n columnWidths = [];\n columns = $el.find(\".task-colum-name\");\n columnWidths = _.map(columns, function(column) {\n return $(column).outerWidth(true);\n });\n totalWidth = _.reduce(columnWidths, function(total, width) {\n return total + width;\n });\n return $el.find('.taskboard-table-inner').css(\"width\", totalWidth);\n };\n })(this);\n recalculateStatusColumnWidth = (function(_this) {\n return function(statusId) {\n var statusFoldedWidth;\n statusFoldedWidth = getCeilWidth(null, statusId);\n _.forEach($scope.userstories, function(us) {\n var width;\n width = getCeilWidth(us.id, statusId);\n if (width > statusFoldedWidth) {\n return statusFoldedWidth = width;\n }\n });\n return setStatusColumnWidth(statusId, statusFoldedWidth);\n };\n })(this);\n return recalculateTaskboardWidth = (function(_this) {\n return function() {\n _.forEach($scope.taskStatusList, function(status) {\n return recalculateStatusColumnWidth(status.id);\n });\n refreshTaskboardTableWidth();\n };\n })(this);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgTaskboardSquishColumn\", [\"$tgResources\", TaskboardSquishColumnDirective]);\n\n TaskboardUserDirective = function($log, $translate) {\n var clickable, link;\n clickable = false;\n link = function($scope, $el, $attrs) {\n var username_label;\n username_label = $el.parent().find(\"a.task-assigned\");\n username_label.addClass(\"not-clickable\");\n $scope.$watch('task.assigned_to', function(assigned_to) {\n var user;\n user = $scope.usersById[assigned_to];\n if (user === void 0) {\n _.assign($scope, {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\"),\n imgurl: \"/\" + window._version + \"/images/unnamed.png\",\n clickable: clickable\n });\n } else {\n _.assign($scope, {\n name: user.full_name_display,\n imgurl: user.photo,\n clickable: clickable\n });\n }\n return username_label.text($scope.name);\n });\n return bindOnce($scope, \"project\", function(project) {\n if (project.my_permissions.indexOf(\"modify_task\") > -1) {\n clickable = true;\n $el.find(\".avatar-assigned-to\").on(\"click\", (function(_this) {\n return function(event) {\n var $ctrl;\n if ($el.find('a').hasClass('noclick')) {\n return;\n }\n $ctrl = $el.controller();\n return $ctrl.editTaskAssignedTo($scope.task);\n };\n })(this));\n username_label.removeClass(\"not-clickable\");\n return username_label.on(\"click\", function(event) {\n var $ctrl;\n if ($el.find('a').hasClass('noclick')) {\n return;\n }\n $ctrl = $el.controller();\n return $ctrl.editTaskAssignedTo($scope.task);\n });\n }\n });\n };\n return {\n link: link,\n templateUrl: \"taskboard/taskboard-user.html\",\n scope: {\n \"usersById\": \"=users\",\n \"project\": \"=\",\n \"task\": \"=\"\n }\n };\n };\n\n module.directive(\"tgTaskboardUserAvatar\", [\"$log\", \"$translate\", TaskboardUserDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard/sortable.coffee\n */\n\n(function() {\n var TaskboardSortableDirective, bindOnce, groupBy, mixOf, module, scopeDefer, taiga, toggleText;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n module = angular.module(\"taigaBacklog\");\n\n TaskboardSortableDirective = function($repo, $rs, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n bindOnce($scope, \"project\", function(project) {\n var deleteElement, itemEl, newParentScope, oldParentScope, tdom;\n if (!(project.my_permissions.indexOf(\"modify_us\") > -1)) {\n return;\n }\n oldParentScope = null;\n newParentScope = null;\n itemEl = null;\n tdom = $el;\n deleteElement = function(itemEl) {\n itemEl.scope().$destroy();\n itemEl.off();\n return itemEl.remove();\n };\n tdom.sortable({\n handle: \".taskboard-task-inner\",\n dropOnEmpty: true,\n connectWith: \".taskboard-tasks-box\",\n revert: 400\n });\n tdom.on(\"sortstop\", function(event, ui) {\n var itemIndex, itemTask, newStatusId, newUsId, oldStatusId, oldUsId, parentEl;\n parentEl = ui.item.parent();\n itemEl = ui.item;\n itemTask = itemEl.scope().task;\n itemIndex = itemEl.index();\n newParentScope = parentEl.scope();\n oldUsId = oldParentScope.us ? oldParentScope.us.id : null;\n oldStatusId = oldParentScope.st.id;\n newUsId = newParentScope.us ? newParentScope.us.id : null;\n newStatusId = newParentScope.st.id;\n if (newStatusId !== oldStatusId || newUsId !== oldUsId) {\n deleteElement(itemEl);\n }\n $scope.$apply(function() {\n return $rootscope.$broadcast(\"taskboard:task:move\", itemTask, newUsId, newStatusId, itemIndex);\n });\n return ui.item.find('a').removeClass('noclick');\n });\n return tdom.on(\"sortstart\", function(event, ui) {\n oldParentScope = ui.item.parent().scope();\n return ui.item.find('a').addClass('noclick');\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgTaskboardSortable\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", TaskboardSortableDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/kanban/main.coffee\n */\n\n(function() {\n var KanbanArchivedStatusHeaderDirective, KanbanArchivedStatusIntroDirective, KanbanController, KanbanDirective, KanbanSquishColumnDirective, KanbanUserDirective, KanbanUserstoryDirective, KanbanWipLimitDirective, bindMethods, bindOnce, defaultViewMode, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText, viewModes,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n timeout = this.taiga.timeout;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaKanban\");\n\n defaultViewMode = \"maximized\";\n\n viewModes = [\"maximized\", \"minimized\"];\n\n KanbanController = (function(superClass) {\n extend(KanbanController, superClass);\n\n KanbanController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\"];\n\n function KanbanController(scope, rootscope, repo, confirm, rs1, params1, q, location, appMetaService, navUrls, events, analytics, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs1;\n this.params = params1;\n this.q = q;\n this.location = location;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.events = events;\n this.analytics = analytics;\n this.translate = translate;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"KANBAN.SECTION_NAME\");\n this.scope.statusViewModes = {};\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"KANBAN.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.translate.instant(\"KANBAN.PAGE_DESCRIPTION\", {\n projectName: _this.scope.project.name,\n projectDescription: _this.scope.project.description\n });\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n KanbanController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"usform:new:success\", (function(_this) {\n return function() {\n _this.loadUserstories();\n _this.refreshTagsColors();\n return _this.analytics.trackEvent(\"userstory\", \"create\", \"create userstory on kanban\", 1);\n };\n })(this));\n this.scope.$on(\"usform:bulk:success\", (function(_this) {\n return function() {\n _this.loadUserstories();\n return _this.analytics.trackEvent(\"userstory\", \"create\", \"bulk create userstory on kanban\", 1);\n };\n })(this));\n this.scope.$on(\"usform:edit:success\", (function(_this) {\n return function() {\n _this.loadUserstories();\n return _this.refreshTagsColors();\n };\n })(this));\n this.scope.$on(\"assigned-to:added\", this.onAssignedToChanged);\n this.scope.$on(\"kanban:us:move\", this.moveUs);\n this.scope.$on(\"kanban:show-userstories-for-status\", this.loadUserStoriesForStatus);\n return this.scope.$on(\"kanban:hide-userstories-for-status\", this.hideUserStoriesForStatus);\n };\n\n KanbanController.prototype.addNewUs = function(type, statusId) {\n switch (type) {\n case \"standard\":\n return this.rootscope.$broadcast(\"usform:new\", this.scope.projectId, statusId, this.scope.usStatusList);\n case \"bulk\":\n return this.rootscope.$broadcast(\"usform:bulk\", this.scope.projectId, statusId);\n }\n };\n\n KanbanController.prototype.changeUsAssignedTo = function(us) {\n return this.rootscope.$broadcast(\"assigned-to:add\", us);\n };\n\n KanbanController.prototype.onAssignedToChanged = function(ctx, userid, us) {\n var promise;\n us.assigned_to = userid;\n promise = this.repo.save(us);\n return promise.then(null, function() {\n return console.log(\"FAIL\");\n });\n };\n\n KanbanController.prototype.refreshTagsColors = function() {\n return this.rs.projects.tagsColors(this.scope.projectId).then((function(_this) {\n return function(tags_colors) {\n return _this.scope.project.tags_colors = tags_colors;\n };\n })(this));\n };\n\n KanbanController.prototype.loadUserstories = function() {\n var params, promise;\n params = {\n status__is_archived: false\n };\n promise = this.rs.userstories.listAll(this.scope.projectId, params).then((function(_this) {\n return function(userstories) {\n var i, j, k, len, len1, len2, ref, ref1, ref2, status, us, usByStatus, us_archived;\n _this.scope.userstories = userstories;\n usByStatus = _.groupBy(userstories, \"status\");\n us_archived = [];\n ref = _this.scope.usStatusList;\n for (i = 0, len = ref.length; i < len; i++) {\n status = ref[i];\n if (usByStatus[status.id] == null) {\n usByStatus[status.id] = [];\n }\n if (_this.scope.usByStatus != null) {\n ref1 = _this.scope.usByStatus[status.id];\n for (j = 0, len1 = ref1.length; j < len1; j++) {\n us = ref1[j];\n if (us.status !== status.id) {\n us_archived.push(us);\n }\n }\n }\n if (status.is_archived && (_this.scope.usByStatus != null) && _this.scope.usByStatus[status.id].length !== 0) {\n ref2 = _this.scope.usByStatus[status.id].concat(us_archived);\n for (k = 0, len2 = ref2.length; k < len2; k++) {\n us = ref2[k];\n if (us.status === status.id) {\n usByStatus[status.id].push(us);\n }\n }\n }\n usByStatus[status.id] = _.sortBy(usByStatus[status.id], \"kanban_order\");\n }\n if (userstories.length === 0) {\n status = _this.scope.usStatusList[0];\n usByStatus[status.id].push({\n isPlaceholder: true\n });\n }\n _this.scope.usByStatus = usByStatus;\n scopeDefer(_this.scope, function() {\n return _this.scope.$broadcast(\"userstories:loaded\", userstories);\n });\n return userstories;\n };\n })(this));\n promise.then((function(_this) {\n return function() {\n return _this.scope.$broadcast(\"redraw:wip\");\n };\n })(this));\n return promise;\n };\n\n KanbanController.prototype.loadUserStoriesForStatus = function(ctx, statusId) {\n var params;\n params = {\n status: statusId\n };\n return this.rs.userstories.listAll(this.scope.projectId, params).then((function(_this) {\n return function(userstories) {\n _this.scope.usByStatus[statusId] = _.sortBy(userstories, \"kanban_order\");\n _this.scope.$broadcast(\"kanban:shown-userstories-for-status\", statusId, userstories);\n return userstories;\n };\n })(this));\n };\n\n KanbanController.prototype.hideUserStoriesForStatus = function(ctx, statusId) {\n this.scope.usByStatus[statusId] = [];\n return this.scope.$broadcast(\"kanban:hidden-userstories-for-status\", statusId);\n };\n\n KanbanController.prototype.loadKanban = function() {\n return this.q.all([this.refreshTagsColors(), this.loadUserstories()]);\n };\n\n KanbanController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n if (!project.is_kanban_activated) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.projectId = project.id;\n _this.scope.points = _.sortBy(project.points, \"order\");\n _this.scope.pointsById = groupBy(project.points, function(x) {\n return x.id;\n });\n _this.scope.usStatusById = groupBy(project.us_statuses, function(x) {\n return x.id;\n });\n _this.scope.usStatusList = _.sortBy(project.us_statuses, \"order\");\n _this.generateStatusViewModes();\n _this.scope.$emit(\"project:loaded\", project);\n return project;\n };\n })(this));\n };\n\n KanbanController.prototype.initializeSubscription = function() {\n var routingKey1;\n routingKey1 = \"changes.project.\" + this.scope.projectId + \".userstories\";\n return this.events.subscribe(this.scope, routingKey1, (function(_this) {\n return function(message) {\n return _this.loadUserstories();\n };\n })(this));\n };\n\n KanbanController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise.then((function(_this) {\n return function(project) {\n _this.fillUsersAndRoles(project.members, project.roles);\n _this.initializeSubscription();\n return _this.loadKanban();\n };\n })(this));\n };\n\n KanbanController.prototype.generateStatusViewModes = function() {\n var i, len, mode, ref, status, storedStatusViewModes;\n storedStatusViewModes = this.rs.kanban.getStatusViewModes(this.scope.projectId);\n this.scope.statusViewModes = {};\n ref = this.scope.usStatusList;\n for (i = 0, len = ref.length; i < len; i++) {\n status = ref[i];\n mode = storedStatusViewModes[status.id] || defaultViewMode;\n this.scope.statusViewModes[status.id] = mode;\n }\n return this.storeStatusViewModes();\n };\n\n KanbanController.prototype.storeStatusViewModes = function() {\n return this.rs.kanban.storeStatusViewModes(this.scope.projectId, this.scope.statusViewModes);\n };\n\n KanbanController.prototype.updateStatusViewMode = function(statusId, newViewMode) {\n this.scope.statusViewModes[statusId] = newViewMode;\n return this.storeStatusViewModes();\n };\n\n KanbanController.prototype.isMaximized = function(statusId) {\n var mode;\n mode = this.scope.statusViewModes[statusId] || defaultViewMode;\n return mode === 'maximized';\n };\n\n KanbanController.prototype.isMinimized = function(statusId) {\n var mode;\n mode = this.scope.statusViewModes[statusId] || defaultViewMode;\n return mode === 'minimized';\n };\n\n KanbanController.prototype.prepareBulkUpdateData = function(uses, field) {\n if (field == null) {\n field = \"kanban_order\";\n }\n return _.map(uses, function(x) {\n return {\n \"us_id\": x.id,\n \"order\": x[field]\n };\n });\n };\n\n KanbanController.prototype.resortUserStories = function(uses) {\n var i, index, item, items, len;\n items = [];\n for (index = i = 0, len = uses.length; i < len; index = ++i) {\n item = uses[index];\n item.kanban_order = index;\n if (item.isModified()) {\n items.push(item);\n }\n }\n return items;\n };\n\n KanbanController.prototype.moveUs = function(ctx, us, oldStatusId, newStatusId, index) {\n var itemsToSave, promise, r;\n if (oldStatusId !== newStatusId) {\n r = this.scope.usByStatus[oldStatusId].indexOf(us);\n this.scope.usByStatus[oldStatusId].splice(r, 1);\n this.scope.usByStatus[newStatusId].splice(index, 0, us);\n us.status = newStatusId;\n } else {\n r = this.scope.usByStatus[newStatusId].indexOf(us);\n this.scope.usByStatus[newStatusId].splice(r, 1);\n this.scope.usByStatus[newStatusId].splice(index, 0, us);\n }\n itemsToSave = this.resortUserStories(this.scope.usByStatus[newStatusId]);\n this.scope.usByStatus[newStatusId] = _.sortBy(this.scope.usByStatus[newStatusId], \"kanban_order\");\n promise = this.repo.save(us);\n promise = promise.then((function(_this) {\n return function() {\n var data;\n itemsToSave = _.reject(itemsToSave, {\n \"id\": us.id\n });\n data = _this.prepareBulkUpdateData(itemsToSave);\n return _this.rs.userstories.bulkUpdateKanbanOrder(us.project, data).then(function() {\n return itemsToSave;\n });\n };\n })(this));\n return promise;\n };\n\n return KanbanController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"KanbanController\", KanbanController);\n\n KanbanDirective = function($repo, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n var tableBodyDom;\n tableBodyDom = $el.find(\".kanban-table-body\");\n tableBodyDom.on(\"scroll\", function(event) {\n var tableHeaderDom, target;\n target = angular.element(event.currentTarget);\n tableHeaderDom = $el.find(\".kanban-table-header .kanban-table-inner\");\n return tableHeaderDom.css(\"left\", -1 * target.scrollLeft());\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanban\", [\"$tgRepo\", \"$rootScope\", KanbanDirective]);\n\n KanbanArchivedStatusHeaderDirective = function($rootscope, $translate) {\n var hideArchivedText, link, showArchivedText;\n showArchivedText = $translate.instant(\"KANBAN.ACTION_SHOW_ARCHIVED\");\n hideArchivedText = $translate.instant(\"KANBAN.ACTION_HIDE_ARCHIVED\");\n link = function($scope, $el, $attrs) {\n var hidden, status;\n status = $scope.$eval($attrs.tgKanbanArchivedStatusHeader);\n hidden = true;\n $scope[\"class\"] = \"icon-open-eye\";\n $scope.title = showArchivedText;\n $el.on(\"click\", function(event) {\n hidden = !hidden;\n return $scope.$apply(function() {\n if (hidden) {\n $scope[\"class\"] = \"icon-open-eye\";\n $scope.title = showArchivedText;\n return $rootscope.$broadcast(\"kanban:hide-userstories-for-status\", status.id);\n } else {\n $scope[\"class\"] = \"icon-closed-eye\";\n $scope.title = hideArchivedText;\n return $rootscope.$broadcast(\"kanban:show-userstories-for-status\", status.id);\n }\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanArchivedStatusHeader\", [\"$rootScope\", \"$translate\", KanbanArchivedStatusHeaderDirective]);\n\n KanbanArchivedStatusIntroDirective = function($translate) {\n var link, userStories;\n userStories = [];\n link = function($scope, $el, $attrs) {\n var hiddenUserStoriexText, status, updateIntroText;\n hiddenUserStoriexText = $translate.instant(\"KANBAN.HIDDEN_USER_STORIES\");\n status = $scope.$eval($attrs.tgKanbanArchivedStatusIntro);\n $el.text(hiddenUserStoriexText);\n updateIntroText = function() {\n if (userStories.length > 0) {\n return $el.text(\"\");\n } else {\n return $el.text(hiddenUserStoriexText);\n }\n };\n $scope.$on(\"kanban:us:move\", function(ctx, itemUs, oldStatusId, newStatusId, itemIndex) {\n var r;\n if (status.id === newStatusId) {\n if (status.id === oldStatusId) {\n r = userStories.indexOf(itemUs);\n userStories.splice(r, 1);\n userStories.splice(itemIndex, 0, itemUs);\n } else {\n itemUs.isArchived = true;\n userStories.splice(itemIndex, 0, itemUs);\n }\n } else if (status.id === oldStatusId) {\n itemUs.isArchived = false;\n r = userStories.indexOf(itemUs);\n userStories.splice(r, 1);\n }\n return updateIntroText();\n });\n $scope.$on(\"kanban:shown-userstories-for-status\", function(ctx, statusId, userStoriesLoaded) {\n if (statusId === status.id) {\n userStories = _.filter(userStoriesLoaded, function(us) {\n return us.status === status.id;\n });\n return updateIntroText();\n }\n });\n $scope.$on(\"kanban:hidden-userstories-for-status\", function(ctx, statusId) {\n if (statusId === status.id) {\n userStories = [];\n return updateIntroText();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanArchivedStatusIntro\", [\"$translate\", KanbanArchivedStatusIntroDirective]);\n\n KanbanUserstoryDirective = function($rootscope, $loading, $rs, $rs2) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n $el.disableSelection();\n $scope.$watch(\"us\", function(us) {\n if (us.is_blocked && !$el.hasClass(\"blocked\")) {\n return $el.addClass(\"blocked\");\n } else if (!us.is_blocked && $el.hasClass(\"blocked\")) {\n return $el.removeClass(\"blocked\");\n }\n });\n $el.on('click', '.icon-edit', function(event) {\n var currentLoading, target, us;\n if ($el.find(\".icon-edit\").hasClass(\"noclick\")) {\n return;\n }\n target = $(event.target);\n currentLoading = $loading().target(target).timeout(200).removeClasses(\"icon-edit\").start();\n us = $model.$modelValue;\n return $rs.userstories.getByRef(us.project, us.ref).then((function(_this) {\n return function(editingUserStory) {\n return $rs2.attachments.list(\"us\", us.id, us.project).then(function(attachments) {\n $rootscope.$broadcast(\"usform:edit\", editingUserStory, attachments.toJS());\n return currentLoading.finish();\n });\n };\n })(this));\n });\n $scope.getTemplateUrl = function() {\n if ($scope.us.isPlaceholder) {\n return \"common/components/kanban-placeholder.html\";\n } else {\n return \"kanban/kanban-task.html\";\n }\n };\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n template: '',\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgKanbanUserstory\", [\"$rootScope\", \"$tgLoading\", \"$tgResources\", \"tgResources\", KanbanUserstoryDirective]);\n\n KanbanSquishColumnDirective = function(rs) {\n var link;\n link = function($scope, $el, $attrs) {\n var updateTableWidth;\n $scope.$on(\"project:loaded\", function(event, project) {\n $scope.folds = rs.kanban.getStatusColumnModes(project.id);\n return updateTableWidth();\n });\n $scope.foldStatus = function(status) {\n $scope.folds[status.id] = !!!$scope.folds[status.id];\n rs.kanban.storeStatusColumnModes($scope.projectId, $scope.folds);\n updateTableWidth();\n };\n return updateTableWidth = function() {\n var columnWidths, totalWidth;\n columnWidths = _.map($scope.usStatusList, function(status) {\n if ($scope.folds[status.id]) {\n return 40;\n } else {\n return 310;\n }\n });\n totalWidth = _.reduce(columnWidths, function(total, width) {\n return total + width;\n });\n return $el.find('.kanban-table-inner').css(\"width\", totalWidth);\n };\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanSquishColumn\", [\"$tgResources\", KanbanSquishColumnDirective]);\n\n KanbanWipLimitDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var redrawWipLimit, status;\n $el.disableSelection();\n status = $scope.$eval($attrs.tgKanbanWipLimit);\n redrawWipLimit = (function(_this) {\n return function() {\n $el.find(\".kanban-wip-limit\").remove();\n return timeout(200, function() {\n var element;\n element = $el.find(\".kanban-task\")[status.wip_limit];\n if (element) {\n return angular.element(element).before(\"
\");\n }\n });\n };\n })(this);\n if (status && !status.is_archived) {\n $scope.$on(\"redraw:wip\", redrawWipLimit);\n $scope.$on(\"kanban:us:move\", redrawWipLimit);\n $scope.$on(\"usform:new:success\", redrawWipLimit);\n $scope.$on(\"usform:bulk:success\", redrawWipLimit);\n }\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanWipLimit\", KanbanWipLimitDirective);\n\n KanbanUserDirective = function($log, $compile, $translate) {\n var clickable, link, template;\n template = _.template(\"
\\n class=\\\"not-clickable\\\"<% } %>>\\n \\\" alt=\\\"<%- name %>\\\" class=\\\"avatar\\\">\\n \\n
\");\n clickable = false;\n link = function($scope, $el, $attrs, $model) {\n var render, username_label, wtid;\n username_label = $el.parent().find(\"a.task-assigned\");\n username_label.addClass(\"not-clickable\");\n if (!$attrs.tgKanbanUserAvatar) {\n return $log.error(\"KanbanUserDirective: no attr is defined\");\n }\n wtid = $scope.$watch($attrs.tgKanbanUserAvatar, function(v) {\n var user;\n if ($scope.usersById == null) {\n $log.error(\"KanbanUserDirective requires userById set in scope.\");\n return wtid();\n } else {\n user = $scope.usersById[v];\n return render(user);\n }\n });\n render = function(user) {\n var ctx, html;\n if (user === void 0) {\n ctx = {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\"),\n imgurl: \"/\" + window._version + \"/images/unnamed.png\",\n clickable: clickable\n };\n } else {\n ctx = {\n name: user.full_name_display,\n imgurl: user.photo,\n clickable: clickable\n };\n }\n html = $compile(template(ctx))($scope);\n $el.html(html);\n return username_label.text(ctx.name);\n };\n bindOnce($scope, \"project\", function(project) {\n if (project.my_permissions.indexOf(\"modify_us\") > -1) {\n clickable = true;\n $el.on(\"click\", (function(_this) {\n return function(event) {\n var $ctrl, us;\n if ($el.find(\"a\").hasClass(\"noclick\")) {\n return;\n }\n us = $model.$modelValue;\n $ctrl = $el.controller();\n return $ctrl.changeUsAssignedTo(us);\n };\n })(this));\n username_label.removeClass(\"not-clickable\");\n return username_label.on(\"click\", function(event) {\n var $ctrl, us;\n if ($el.find(\"a\").hasClass(\"noclick\")) {\n return;\n }\n us = $model.$modelValue;\n $ctrl = $el.controller();\n return $ctrl.changeUsAssignedTo(us);\n });\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgKanbanUserAvatar\", [\"$log\", \"$compile\", \"$translate\", KanbanUserDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/kanban/sortable.coffee\n */\n\n(function() {\n var KanbanSortableDirective, bindOnce, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n timeout = this.taiga.timeout;\n\n module = angular.module(\"taigaKanban\");\n\n KanbanSortableDirective = function($repo, $rs, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n bindOnce($scope, \"project\", function(project) {\n var deleteElement, itemEl, newParentScope, oldParentScope, tdom;\n if (!(project.my_permissions.indexOf(\"modify_us\") > -1)) {\n return;\n }\n oldParentScope = null;\n newParentScope = null;\n itemEl = null;\n tdom = $el;\n deleteElement = function(itemEl) {\n itemEl.scope().$destroy();\n itemEl.off();\n return itemEl.remove();\n };\n tdom.sortable({\n handle: \".kanban-task-inner\",\n dropOnEmpty: true,\n connectWith: \".kanban-uses-box\",\n revert: 400\n });\n tdom.on(\"sortstop\", function(event, ui) {\n var itemIndex, itemUs, newStatusId, oldStatusId, parentEl;\n parentEl = ui.item.parent();\n itemEl = ui.item;\n itemUs = itemEl.scope().us;\n itemIndex = itemEl.index();\n newParentScope = parentEl.scope();\n newStatusId = newParentScope.s.id;\n oldStatusId = oldParentScope.s.id;\n if (newStatusId !== oldStatusId) {\n deleteElement(itemEl);\n }\n $scope.$apply(function() {\n return $rootscope.$broadcast(\"kanban:us:move\", itemUs, itemUs.status, newStatusId, itemIndex);\n });\n return ui.item.find('a').removeClass('noclick');\n });\n return tdom.on(\"sortstart\", function(event, ui) {\n oldParentScope = ui.item.parent().scope();\n return ui.item.find('a').addClass('noclick');\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanSortable\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", KanbanSortableDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues/detail.coffee\n */\n\n(function() {\n var IssueDetailController, IssuePriorityButtonDirective, IssueSeverityButtonDirective, IssueStatusButtonDirective, IssueStatusDisplayDirective, IssueTypeButtonDirective, PromoteIssueToUsButtonDirective, bindMethods, bindOnce, groupBy, joinStr, mixOf, module, taiga, toString,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaIssues\");\n\n IssueDetailController = (function(superClass) {\n extend(IssueDetailController, superClass);\n\n IssueDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$log\", \"tgAppMetaService\", \"$tgAnalytics\", \"$tgNavUrls\", \"$translate\"];\n\n function IssueDetailController(scope, rootscope, repo, confirm, rs, params, q, location, log, appMetaService, analytics, navUrls, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.log = log;\n this.appMetaService = appMetaService;\n this.analytics = analytics;\n this.navUrls = navUrls;\n this.translate = translate;\n bindMethods(this);\n this.scope.issueRef = this.params.issueref;\n this.scope.sectionName = this.translate.instant(\"ISSUES.SECTION_NAME\");\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n _this._setMeta();\n return _this.initializeOnDeleteGoToUrl();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n IssueDetailController.prototype._setMeta = function() {\n var description, ref, ref1, ref2, ref3, title;\n title = this.translate.instant(\"ISSUE.PAGE_TITLE\", {\n issueRef: \"#\" + this.scope.issue.ref,\n issueSubject: this.scope.issue.subject,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"ISSUE.PAGE_DESCRIPTION\", {\n issueStatus: ((ref = this.scope.statusById[this.scope.issue.status]) != null ? ref.name : void 0) || \"--\",\n issueType: ((ref1 = this.scope.typeById[this.scope.issue.type]) != null ? ref1.name : void 0) || \"--\",\n issueSeverity: ((ref2 = this.scope.severityById[this.scope.issue.severity]) != null ? ref2.name : void 0) || \"--\",\n issuePriority: ((ref3 = this.scope.priorityById[this.scope.issue.priority]) != null ? ref3.name : void 0) || \"--\",\n issueDescription: angular.element(this.scope.issue.description_html || \"\").text()\n });\n return this.appMetaService.setAll(title, description);\n };\n\n IssueDetailController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"attachment:create\", (function(_this) {\n return function() {\n return _this.analytics.trackEvent(\"attachment\", \"create\", \"create attachment on issue\", 1);\n };\n })(this));\n this.scope.$on(\"promote-issue-to-us:success\", (function(_this) {\n return function() {\n _this.analytics.trackEvent(\"issue\", \"promoteToUserstory\", \"promote issue to userstory\", 1);\n _this.rootscope.$broadcast(\"object:updated\");\n return _this.loadIssue();\n };\n })(this));\n this.scope.$on(\"comment:new\", (function(_this) {\n return function() {\n return _this.loadIssue();\n };\n })(this));\n return this.scope.$on(\"custom-attributes-values:edit\", (function(_this) {\n return function() {\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this));\n };\n\n IssueDetailController.prototype.initializeOnDeleteGoToUrl = function() {\n var ctx;\n ctx = {\n project: this.scope.project.slug\n };\n if (this.scope.project.is_issues_activated) {\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-issues\", ctx);\n } else {\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project\", ctx);\n }\n };\n\n IssueDetailController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n _this.scope.statusList = project.issue_statuses;\n _this.scope.statusById = groupBy(project.issue_statuses, function(x) {\n return x.id;\n });\n _this.scope.typeById = groupBy(project.issue_types, function(x) {\n return x.id;\n });\n _this.scope.typeList = _.sortBy(project.issue_types, \"order\");\n _this.scope.severityList = project.severities;\n _this.scope.severityById = groupBy(project.severities, function(x) {\n return x.id;\n });\n _this.scope.priorityList = project.priorities;\n _this.scope.priorityById = groupBy(project.priorities, function(x) {\n return x.id;\n });\n return project;\n };\n })(this));\n };\n\n IssueDetailController.prototype.loadIssue = function() {\n return this.rs.issues.getByRef(this.scope.projectId, this.params.issueref).then((function(_this) {\n return function(issue) {\n var ctx, ref, ref1;\n _this.scope.issue = issue;\n _this.scope.issueId = issue.id;\n _this.scope.commentModel = issue;\n if (((ref = _this.scope.issue.neighbors.previous) != null ? ref.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.issue.neighbors.previous.ref\n };\n _this.scope.previousUrl = _this.navUrls.resolve(\"project-issues-detail\", ctx);\n }\n if (((ref1 = _this.scope.issue.neighbors.next) != null ? ref1.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.issue.neighbors.next.ref\n };\n return _this.scope.nextUrl = _this.navUrls.resolve(\"project-issues-detail\", ctx);\n }\n };\n })(this));\n };\n\n IssueDetailController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise.then((function(_this) {\n return function(project) {\n _this.fillUsersAndRoles(project.members, project.roles);\n return _this.loadIssue();\n };\n })(this));\n };\n\n\n /*\n * Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n * See app/modules/components/vote-button for more info\n */\n\n IssueDetailController.prototype.onUpvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssue();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.issues.upvote(this.scope.issueId).then(onSuccess, onError);\n };\n\n IssueDetailController.prototype.onDownvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssue();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.issues.downvote(this.scope.issueId).then(onSuccess, onError);\n };\n\n\n /*\n * Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n * See app/modules/components/watch-button for more info\n */\n\n IssueDetailController.prototype.onWatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssue();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.issues.watch(this.scope.issueId).then(onSuccess, onError);\n };\n\n IssueDetailController.prototype.onUnwatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssue();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.issues.unwatch(this.scope.issueId).then(onSuccess, onError);\n };\n\n return IssueDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"IssueDetailController\", IssueDetailController);\n\n IssueStatusDisplayDirective = function($template, $compile) {\n var link, template;\n template = $template.get(\"common/components/status-display.html\", true);\n link = function($scope, $el, $attrs) {\n var render;\n render = function(issue) {\n var html, status;\n status = $scope.statusById[issue.status];\n html = template({\n is_closed: status.is_closed,\n status: status\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $scope.$watch($attrs.ngModel, function(issue) {\n if (issue != null) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssueStatusDisplay\", [\"$tgTemplate\", \"$compile\", IssueStatusDisplayDirective]);\n\n IssueStatusButtonDirective = function($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) {\n var link, template;\n template = $template.get(\"issue/issues-status-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_issue\") !== -1;\n };\n render = (function(_this) {\n return function(issue) {\n var html, status;\n status = $scope.statusById[issue.status];\n html = template({\n status: status,\n statuses: $scope.statusList,\n editable: isEditable()\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n })(this);\n save = $qqueue.bindAdd((function(_this) {\n return function(statusId) {\n var currentLoading, issue, onError, onSuccess;\n $.fn.popover().closeAll();\n issue = $model.$modelValue.clone();\n issue.status = statusId;\n currentLoading = $loading().target($el).start();\n onSuccess = function() {\n $model.$setViewValue(issue);\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n issue.revert();\n $model.$setViewValue(issue);\n return currentLoading.finish();\n };\n return $repo.save(issue).then(onSuccess, onError);\n };\n })(this));\n $el.on(\"click\", \".js-edit-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", function(event) {\n var target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n return save(target.data(\"status-id\"));\n });\n $scope.$watch($attrs.ngModel, function(issue) {\n if (issue) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssueStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", IssueStatusButtonDirective]);\n\n IssueTypeButtonDirective = function($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) {\n var link, template;\n template = $template.get(\"issue/issue-type-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_issue\") !== -1;\n };\n render = (function(_this) {\n return function(issue) {\n var html, type;\n type = $scope.typeById[issue.type];\n html = template({\n type: type,\n typees: $scope.typeList,\n editable: isEditable()\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n })(this);\n save = $qqueue.bindAdd((function(_this) {\n return function(type) {\n var currentLoading, issue, onError, onSuccess;\n $.fn.popover().closeAll();\n issue = $model.$modelValue.clone();\n issue.type = type;\n currentLoading = $loading().target($el.find(\".level-name\")).start();\n onSuccess = function() {\n $model.$setViewValue(issue);\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n issue.revert();\n $model.$setViewValue(issue);\n return currentLoading.finish();\n };\n return $repo.save(issue).then(onSuccess, onError);\n };\n })(this));\n $el.on(\"click\", \".type-data\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-type\").popover().open();\n });\n $el.on(\"click\", \".type\", function(event) {\n var target, type;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n type = target.data(\"type-id\");\n return save(type);\n });\n $scope.$watch($attrs.ngModel, function(issue) {\n if (issue) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssueTypeButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", IssueTypeButtonDirective]);\n\n IssueSeverityButtonDirective = function($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) {\n var link, template;\n template = $template.get(\"issue/issue-severity-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_issue\") !== -1;\n };\n render = (function(_this) {\n return function(issue) {\n var html, severity;\n severity = $scope.severityById[issue.severity];\n html = template({\n severity: severity,\n severityes: $scope.severityList,\n editable: isEditable()\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n })(this);\n save = $qqueue.bindAdd((function(_this) {\n return function(severity) {\n var currentLoading, issue, onError, onSuccess;\n $.fn.popover().closeAll();\n issue = $model.$modelValue.clone();\n issue.severity = severity;\n currentLoading = $loading().target($el.find(\".level-name\")).start();\n onSuccess = function() {\n $model.$setViewValue(issue);\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n issue.revert();\n $model.$setViewValue(issue);\n return currentLoading.finish();\n };\n return $repo.save(issue).then(onSuccess, onError);\n };\n })(this));\n $el.on(\"click\", \".severity-data\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-severity\").popover().open();\n });\n $el.on(\"click\", \".severity\", function(event) {\n var severity, target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n severity = target.data(\"severity-id\");\n return save(severity);\n });\n $scope.$watch($attrs.ngModel, function(issue) {\n if (issue) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssueSeverityButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", IssueSeverityButtonDirective]);\n\n IssuePriorityButtonDirective = function($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) {\n var link, template;\n template = $template.get(\"issue/issue-priority-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_issue\") !== -1;\n };\n render = (function(_this) {\n return function(issue) {\n var html, priority;\n priority = $scope.priorityById[issue.priority];\n html = template({\n priority: priority,\n priorityes: $scope.priorityList,\n editable: isEditable()\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n })(this);\n save = $qqueue.bindAdd((function(_this) {\n return function(priority) {\n var currentLoading, issue, onError, onSuccess;\n $.fn.popover().closeAll();\n issue = $model.$modelValue.clone();\n issue.priority = priority;\n currentLoading = $loading().target($el.find(\".level-name\")).start();\n onSuccess = function() {\n $model.$setViewValue(issue);\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n issue.revert();\n $model.$setViewValue(issue);\n return currentLoading.finish();\n };\n return $repo.save(issue).then(onSuccess, onError);\n };\n })(this));\n $el.on(\"click\", \".priority-data\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-priority\").popover().open();\n });\n $el.on(\"click\", \".priority\", function(event) {\n var priority, target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n priority = target.data(\"priority-id\");\n return save(priority);\n });\n $scope.$watch($attrs.ngModel, function(issue) {\n if (issue) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssuePriorityButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", IssuePriorityButtonDirective]);\n\n PromoteIssueToUsButtonDirective = function($rootScope, $repo, $confirm, $qqueue, $translate) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var save;\n save = $qqueue.bindAdd((function(_this) {\n return function(issue, askResponse) {\n var data, onError, onSuccess;\n data = {\n generated_from_issue: issue.id,\n project: issue.project,\n subject: issue.subject,\n description: issue.description,\n tags: issue.tags,\n is_blocked: issue.is_blocked,\n blocked_note: issue.blocked_note\n };\n onSuccess = function() {\n askResponse.finish();\n $confirm.notify(\"success\");\n return $rootScope.$broadcast(\"promote-issue-to-us:success\");\n };\n onError = function() {\n askResponse.finish();\n return $confirm.notify(\"error\");\n };\n return $repo.create(\"userstories\", data).then(onSuccess, onError);\n };\n })(this));\n $el.on(\"click\", \"a\", function(event) {\n var issue, message, subtitle, title;\n event.preventDefault();\n issue = $model.$modelValue;\n title = $translate.instant(\"ISSUES.CONFIRM_PROMOTE.TITLE\");\n message = $translate.instant(\"ISSUES.CONFIRM_PROMOTE.MESSAGE\");\n subtitle = issue.subject;\n return $confirm.ask(title, subtitle, message).then((function(_this) {\n return function(response) {\n return save(issue, response);\n };\n })(this));\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n restrict: \"AE\",\n require: \"ngModel\",\n templateUrl: \"issue/promote-issue-to-us-button.html\",\n link: link\n };\n };\n\n module.directive(\"tgPromoteIssueToUsButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgQqueue\", \"$translate\", PromoteIssueToUsButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues/lightboxes.coffee\n */\n\n(function() {\n var CreateBulkIssuesDirective, CreateIssueDirective, bindOnce, debounce, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaIssues\");\n\n CreateIssueDirective = function($repo, $confirm, $rootscope, lightboxService, $loading, $q, attachmentsService) {\n var link;\n link = function($scope, $el, $attrs) {\n var attachmentsToAdd, createAttachments, form, resetAttachments, submit, submitButton;\n form = $el.find(\"form\").checksley();\n $scope.issue = {};\n $scope.attachments = Immutable.List();\n $scope.$on(\"issueform:new\", function(ctx, project) {\n var attachmentsToAdd;\n attachmentsToAdd = Immutable.List();\n $el.find(\".tag-input\").val(\"\");\n lightboxService.open($el);\n return $scope.issue = {\n project: project.id,\n subject: \"\",\n status: project.default_issue_status,\n type: project.default_issue_type,\n priority: project.default_priority,\n severity: project.default_severity,\n tags: []\n };\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n createAttachments = function(obj) {\n var promises;\n promises = _.map(attachmentsToAdd.toJS(), function(attachment) {\n return attachmentsService.upload(attachment.file, obj.id, $scope.issue.project, 'issue');\n });\n return $q.all(promises);\n };\n attachmentsToAdd = Immutable.List();\n resetAttachments = function() {\n return attachmentsToAdd = Immutable.List();\n };\n $scope.addAttachment = function(attachment) {\n return attachmentsToAdd = attachmentsToAdd.push(attachment);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.create(\"issues\", $scope.issue);\n promise.then(function(data) {\n return createAttachments(data);\n });\n promise.then(function(data) {\n currentLoading.finish();\n $rootscope.$broadcast(\"issueform:new:success\", data);\n lightboxService.close($el);\n return $confirm.notify(\"success\");\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateIssue\", [\"$tgRepo\", \"$tgConfirm\", \"$rootScope\", \"lightboxService\", \"$tgLoading\", \"$q\", \"tgAttachmentsService\", CreateIssueDirective]);\n\n CreateBulkIssuesDirective = function($repo, $rs, $confirm, $rootscope, $loading, lightboxService) {\n var link;\n link = function($scope, $el, attrs) {\n var submit, submitButton;\n $scope.$on(\"issueform:bulk\", function(ctx, projectId, status) {\n lightboxService.open($el);\n return $scope[\"new\"] = {\n projectId: projectId,\n bulk: \"\"\n };\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, data, form, projectId, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n data = $scope[\"new\"].bulk;\n projectId = $scope[\"new\"].projectId;\n promise = $rs.issues.bulkCreate(projectId, data);\n promise.then(function(result) {\n currentLoading.finish();\n $rootscope.$broadcast(\"issueform:new:success\", result);\n lightboxService.close($el);\n return $confirm.notify(\"success\");\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateBulkIssues\", [\"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$rootScope\", \"$tgLoading\", \"lightboxService\", CreateBulkIssuesDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues/list.coffee\n */\n\n(function() {\n var IssueAssignedToInlineEditionDirective, IssueStatusInlineEditionDirective, IssuesController, IssuesDirective, IssuesFiltersDirective, bindOnce, debounceLeading, groupBy, joinStr, mixOf, module, startswith, taiga, toString, trim,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n trim = this.taiga.trim;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n debounceLeading = this.taiga.debounceLeading;\n\n startswith = this.taiga.startswith;\n\n module = angular.module(\"taigaIssues\");\n\n IssuesController = (function(superClass) {\n extend(IssuesController, superClass);\n\n IssuesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$tgUrls\", \"$routeParams\", \"$q\", \"$tgLocation\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\"];\n\n function IssuesController(scope, rootscope, repo, confirm, rs, urls, params, q, location, appMetaService, navUrls, events, analytics, translate) {\n var filters, promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.urls = urls;\n this.params = params;\n this.q = q;\n this.location = location;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.events = events;\n this.analytics = analytics;\n this.translate = translate;\n this.loadIssues = bind(this.loadIssues, this);\n this.scope.sectionName = \"Issues\";\n this.scope.filters = {};\n if (_.isEmpty(this.location.search())) {\n filters = this.rs.issues.getFilters(this.params.pslug);\n filters.page = 1;\n this.location.search(filters);\n this.location.replace();\n return;\n }\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ISSUES.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.translate.instant(\"ISSUES.PAGE_DESCRIPTION\", {\n projectName: _this.scope.project.name,\n projectDescription: _this.scope.project.description\n });\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"issueform:new:success\", (function(_this) {\n return function() {\n _this.analytics.trackEvent(\"issue\", \"create\", \"create issue on issues list\", 1);\n return _this.loadIssues();\n };\n })(this));\n }\n\n IssuesController.prototype.initializeSubscription = function() {\n var routingKey;\n routingKey = \"changes.project.\" + this.scope.projectId + \".issues\";\n return this.events.subscribe(this.scope, routingKey, (function(_this) {\n return function(message) {\n return _this.loadIssues();\n };\n })(this));\n };\n\n IssuesController.prototype.storeFilters = function() {\n return this.rs.issues.storeFilters(this.params.pslug, this.location.search());\n };\n\n IssuesController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n if (!project.is_issues_activated) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n _this.scope.issueStatusById = groupBy(project.issue_statuses, function(x) {\n return x.id;\n });\n _this.scope.issueStatusList = _.sortBy(project.issue_statuses, \"order\");\n _this.scope.severityById = groupBy(project.severities, function(x) {\n return x.id;\n });\n _this.scope.severityList = _.sortBy(project.severities, \"order\");\n _this.scope.priorityById = groupBy(project.priorities, function(x) {\n return x.id;\n });\n _this.scope.priorityList = _.sortBy(project.priorities, \"order\");\n _this.scope.issueTypes = _.sortBy(project.issue_types, \"order\");\n _this.scope.issueTypeById = groupBy(project.issue_types, function(x) {\n return x.id;\n });\n return project;\n };\n })(this));\n };\n\n IssuesController.prototype.getUrlFilters = function() {\n var filters;\n filters = _.pick(this.location.search(), \"page\", \"tags\", \"status\", \"types\", \"q\", \"severities\", \"priorities\", \"assignedTo\", \"createdBy\", \"orderBy\");\n if (!filters.page) {\n filters.page = 1;\n }\n return filters;\n };\n\n IssuesController.prototype.getUrlFilter = function(name) {\n var filters;\n filters = _.pick(this.location.search(), name);\n return filters[name];\n };\n\n IssuesController.prototype.loadMyFilters = function() {\n return this.rs.issues.getMyFilters(this.scope.projectId).then((function(_this) {\n return function(filters) {\n return _.map(filters, function(value, key) {\n return {\n id: key,\n name: key,\n type: \"myFilters\",\n selected: false\n };\n });\n };\n })(this));\n };\n\n IssuesController.prototype.removeNotExistingFiltersFromUrl = function() {\n var currentSearch, existingValues, filterName, filterValue, splittedValues, urlfilters;\n currentSearch = this.location.search();\n urlfilters = this.getUrlFilters();\n for (filterName in urlfilters) {\n filterValue = urlfilters[filterName];\n if (filterName === \"page\" || filterName === \"orderBy\" || filterName === \"q\") {\n continue;\n }\n if (filterName === \"tags\") {\n splittedValues = _.map((\"\" + filterValue).split(\",\"));\n } else {\n splittedValues = _.map((\"\" + filterValue).split(\",\"), function(x) {\n if (x === \"null\") {\n return null;\n } else {\n return parseInt(x);\n }\n });\n }\n existingValues = _.intersection(splittedValues, _.map(this.scope.filters[filterName], \"id\"));\n if (splittedValues.length !== existingValues.length) {\n this.location.search(filterName, existingValues.join());\n }\n }\n if (currentSearch !== this.location.search()) {\n return this.location.replace();\n }\n };\n\n IssuesController.prototype.markSelectedFilters = function(filters, urlfilters) {\n var isSelected, j, key, len, name, obj, ref, ref1, results, searchdata, val, value;\n searchdata = {};\n ref = _.omit(urlfilters, \"page\", \"orderBy\");\n for (name in ref) {\n value = ref[name];\n if (searchdata[name] == null) {\n searchdata[name] = {};\n }\n ref1 = (\"\" + value).split(\",\");\n for (j = 0, len = ref1.length; j < len; j++) {\n val = ref1[j];\n searchdata[name][val] = true;\n }\n }\n isSelected = function(type, id) {\n if ((searchdata[type] != null) && searchdata[type][id]) {\n return true;\n }\n return false;\n };\n results = [];\n for (key in filters) {\n value = filters[key];\n results.push((function() {\n var k, len1, results1;\n results1 = [];\n for (k = 0, len1 = value.length; k < len1; k++) {\n obj = value[k];\n results1.push(obj.selected = isSelected(obj.type, obj.id) ? true : void 0);\n }\n return results1;\n })());\n }\n return results;\n };\n\n IssuesController.prototype.loadFilters = function() {\n var loadFilters, promise, urlfilters;\n urlfilters = this.getUrlFilters();\n if (urlfilters.q) {\n this.scope.filtersQ = urlfilters.q;\n }\n promise = this.loadMyFilters().then((function(_this) {\n return function(myFilters) {\n _this.scope.filters.myFilters = myFilters;\n return myFilters;\n };\n })(this));\n loadFilters = {};\n loadFilters.project = this.scope.projectId;\n loadFilters.tags = urlfilters.tags;\n loadFilters.status = urlfilters.status;\n loadFilters.q = urlfilters.q;\n loadFilters.types = urlfilters.types;\n loadFilters.severities = urlfilters.severities;\n loadFilters.priorities = urlfilters.priorities;\n loadFilters.assigned_to = urlfilters.assignedTo;\n loadFilters.owner = urlfilters.createdBy;\n promise = promise.then((function(_this) {\n return function() {\n return _this.rs.issues.filtersData(loadFilters);\n };\n })(this));\n return promise.then((function(_this) {\n return function(data) {\n var choicesFiltersFormat, tagsFilterFormat, usersFiltersFormat;\n usersFiltersFormat = function(users, type, unknownOption) {\n var reformatedUsers, unknownItem;\n reformatedUsers = _.map(users, function(t) {\n t.type = type;\n t.name = t.full_name ? t.full_name : unknownOption;\n return t;\n });\n unknownItem = _.remove(reformatedUsers, function(u) {\n return !u.id;\n });\n reformatedUsers = _.sortBy(reformatedUsers, function(u) {\n return u.name.toUpperCase();\n });\n if (unknownItem.length > 0) {\n reformatedUsers.unshift(unknownItem[0]);\n }\n return reformatedUsers;\n };\n choicesFiltersFormat = function(choices, type, byIdObject) {\n return _.map(choices, function(t) {\n t.type = type;\n return t;\n });\n };\n tagsFilterFormat = function(tags) {\n return _.map(tags, function(t) {\n t.id = t.name;\n t.type = 'tags';\n return t;\n });\n };\n _this.scope.filters.status = choicesFiltersFormat(data.statuses, \"status\", _this.scope.issueStatusById);\n _this.scope.filters.severities = choicesFiltersFormat(data.severities, \"severities\", _this.scope.severityById);\n _this.scope.filters.priorities = choicesFiltersFormat(data.priorities, \"priorities\", _this.scope.priorityById);\n _this.scope.filters.assignedTo = usersFiltersFormat(data.assigned_to, \"assignedTo\", \"Unassigned\");\n _this.scope.filters.createdBy = usersFiltersFormat(data.owners, \"createdBy\", \"Unknown\");\n _this.scope.filters.types = choicesFiltersFormat(data.types, \"types\", _this.scope.issueTypeById);\n _this.scope.filters.tags = tagsFilterFormat(data.tags);\n _this.removeNotExistingFiltersFromUrl();\n _this.markSelectedFilters(_this.scope.filters, urlfilters);\n return _this.rootscope.$broadcast(\"filters:loaded\", _this.scope.filters);\n };\n })(this));\n };\n\n IssuesController.prototype.loadIssuesRequests = 0;\n\n IssuesController.prototype.loadIssues = function() {\n var name, promise, ref, values;\n this.scope.urlFilters = this.getUrlFilters();\n this.scope.httpParams = {};\n ref = this.scope.urlFilters;\n for (name in ref) {\n values = ref[name];\n if (name === \"severities\") {\n name = \"severity\";\n } else if (name === \"orderBy\") {\n name = \"order_by\";\n } else if (name === \"priorities\") {\n name = \"priority\";\n } else if (name === \"assignedTo\") {\n name = \"assigned_to\";\n } else if (name === \"createdBy\") {\n name = \"owner\";\n } else if (name === \"status\") {\n name = \"status\";\n } else if (name === \"types\") {\n name = \"type\";\n }\n this.scope.httpParams[name] = values;\n }\n promise = this.rs.issues.list(this.scope.projectId, this.scope.httpParams);\n this.loadIssuesRequests += 1;\n promise.index = this.loadIssuesRequests;\n promise.then((function(_this) {\n return function(data) {\n if (promise.index === _this.loadIssuesRequests) {\n _this.scope.issues = data.models;\n _this.scope.page = data.current;\n _this.scope.count = data.count;\n _this.scope.paginatedBy = data.paginatedBy;\n }\n return data;\n };\n })(this));\n return promise;\n };\n\n IssuesController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise.then((function(_this) {\n return function(project) {\n _this.fillUsersAndRoles(project.members, project.roles);\n _this.initializeSubscription();\n _this.loadFilters();\n return _this.loadIssues();\n };\n })(this));\n };\n\n IssuesController.prototype.saveCurrentFiltersTo = function(newFilter) {\n var deferred;\n deferred = this.q.defer();\n this.rs.issues.getMyFilters(this.scope.projectId).then((function(_this) {\n return function(filters) {\n filters[newFilter] = _this.location.search();\n return _this.rs.issues.storeMyFilters(_this.scope.projectId, filters).then(function() {\n return deferred.resolve();\n });\n };\n })(this));\n return deferred.promise;\n };\n\n IssuesController.prototype.deleteMyFilter = function(filter) {\n var deferred;\n deferred = this.q.defer();\n this.rs.issues.getMyFilters(this.scope.projectId).then((function(_this) {\n return function(filters) {\n delete filters[filter];\n return _this.rs.issues.storeMyFilters(_this.scope.projectId, filters).then(function() {\n return deferred.resolve();\n });\n };\n })(this));\n return deferred.promise;\n };\n\n IssuesController.prototype.addNewIssue = function() {\n return this.rootscope.$broadcast(\"issueform:new\", this.scope.project);\n };\n\n IssuesController.prototype.addIssuesInBulk = function() {\n return this.rootscope.$broadcast(\"issueform:bulk\", this.scope.projectId);\n };\n\n return IssuesController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"IssuesController\", IssuesController);\n\n IssuesDirective = function($log, $location, $template, $compile) {\n var link, linkOrdering, linkPagination, template;\n template = $template.get(\"issue/issue-paginator.html\", true);\n linkPagination = function($scope, $el, $attrs, $ctrl) {\n var $pagEl, afterCurrent, atBegin, atEnd, beforeCurrent, getNumPages, renderPagination;\n afterCurrent = 2;\n beforeCurrent = 4;\n atBegin = 2;\n atEnd = 2;\n $pagEl = $el.find(\".issues-paginator\");\n getNumPages = function() {\n var numPages;\n numPages = $scope.count / $scope.paginatedBy;\n if (parseInt(numPages, 10) < numPages) {\n numPages = parseInt(numPages, 10) + 1;\n } else {\n numPages = parseInt(numPages, 10);\n }\n return numPages;\n };\n renderPagination = function() {\n var cpage, html, i, j, numPages, options, pages, ref;\n numPages = getNumPages();\n if (numPages <= 1) {\n $pagEl.hide();\n return;\n }\n $pagEl.show();\n pages = [];\n options = {};\n options.pages = pages;\n options.showPrevious = $scope.page > 1;\n options.showNext = !($scope.page === numPages);\n cpage = $scope.page;\n for (i = j = 1, ref = numPages; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\n if (i === (cpage + afterCurrent) && numPages > (cpage + afterCurrent + atEnd)) {\n pages.push({\n classes: \"dots\",\n type: \"dots\"\n });\n } else if (i === (cpage - beforeCurrent) && cpage > (atBegin + beforeCurrent)) {\n pages.push({\n classes: \"dots\",\n type: \"dots\"\n });\n } else if (i > (cpage + afterCurrent) && i <= (numPages - atEnd)) {\n\n } else if (i < (cpage - beforeCurrent) && i > atBegin) {\n\n } else if (i === cpage) {\n pages.push({\n classes: \"active\",\n num: i,\n type: \"page-active\"\n });\n } else {\n pages.push({\n classes: \"page\",\n num: i,\n type: \"page\"\n });\n }\n }\n html = template(options);\n html = $compile(html)($scope);\n return $pagEl.html(html);\n };\n $scope.$watch(\"issues\", function(value) {\n if (!value) {\n return;\n }\n return renderPagination();\n });\n $el.on(\"click\", \".issues-paginator a.next\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", $scope.page + 1);\n return $ctrl.loadIssues();\n });\n });\n $el.on(\"click\", \".issues-paginator a.previous\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", $scope.page - 1);\n return $ctrl.loadIssues();\n });\n });\n return $el.on(\"click\", \".issues-paginator li.page > a\", function(event) {\n var pagenum, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n pagenum = target.data(\"pagenum\");\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", pagenum);\n return $ctrl.loadIssues();\n });\n });\n };\n linkOrdering = function($scope, $el, $attrs, $ctrl) {\n var colHeadElement, currentOrder, icon;\n currentOrder = $ctrl.getUrlFilter(\"orderBy\") || \"created_date\";\n if (currentOrder) {\n icon = startswith(currentOrder, \"-\") ? \"icon-arrow-up\" : \"icon-arrow-bottom\";\n colHeadElement = $el.find(\".row.title > div[data-fieldname='\" + (trim(currentOrder, \"-\")) + \"']\");\n colHeadElement.html((colHeadElement.html()) + \"\");\n }\n return $el.on(\"click\", \".row.title > div\", function(event) {\n var finalOrder, newOrder, target;\n target = angular.element(event.currentTarget);\n currentOrder = $ctrl.getUrlFilter(\"orderBy\");\n newOrder = target.data(\"fieldname\");\n finalOrder = currentOrder === newOrder ? \"-\" + newOrder : newOrder;\n return $scope.$apply(function() {\n $ctrl.replaceFilter(\"orderBy\", finalOrder);\n $ctrl.storeFilters();\n return $ctrl.loadIssues().then(function() {\n $el.find(\".row.title > div > span.icon\").remove();\n icon = startswith(finalOrder, \"-\") ? \"icon-arrow-up\" : \"icon-arrow-bottom\";\n return target.html((target.html()) + \"\");\n });\n });\n });\n };\n link = function($scope, $el, $attrs) {\n var $ctrl;\n $ctrl = $el.controller();\n linkOrdering($scope, $el, $attrs, $ctrl);\n linkPagination($scope, $el, $attrs, $ctrl);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgIssues\", [\"$log\", \"$tgLocation\", \"$tgTemplate\", \"$compile\", IssuesDirective]);\n\n IssuesFiltersDirective = function($q, $log, $location, $rs, $confirm, $loading, $template, $translate, $compile, $auth) {\n var link, template, templateSelected;\n template = $template.get(\"issue/issues-filters.html\", true);\n templateSelected = $template.get(\"issue/issues-filters-selected.html\", true);\n link = function($scope, $el, $attrs) {\n var $ctrl, getFiltersType, initializeSelectedFilters, reloadIssues, renderFilters, renderSelectedFilters, selectQFilter, selectedFilters, showCategories, showFilters, toggleFilterSelection, unwatchIssues;\n $ctrl = $el.closest(\".wrapper\").controller();\n selectedFilters = [];\n showFilters = function(title, type) {\n $el.find(\".filters-cats\").hide();\n $el.find(\".filter-list\").removeClass(\"hidden\");\n $el.find(\"h2.breadcrumb\").removeClass(\"hidden\");\n $el.find(\"h2 a.subfilter span.title\").html(title);\n return $el.find(\"h2 a.subfilter span.title\").prop(\"data-type\", type);\n };\n showCategories = function() {\n $el.find(\".filters-cats\").show();\n $el.find(\".filter-list\").addClass(\"hidden\");\n return $el.find(\"h2.breadcrumb\").addClass(\"hidden\");\n };\n initializeSelectedFilters = function(filters) {\n var j, len, name, val, values;\n selectedFilters = [];\n for (name in filters) {\n values = filters[name];\n for (j = 0, len = values.length; j < len; j++) {\n val = values[j];\n if (val.selected) {\n selectedFilters.push(val);\n }\n }\n }\n return renderSelectedFilters(selectedFilters);\n };\n renderSelectedFilters = function(selectedFilters) {\n var html;\n _.filter(selectedFilters, (function(_this) {\n return function(f) {\n if (f.color) {\n return f.style = \"border-left: 3px solid \" + f.color;\n }\n };\n })(this));\n html = templateSelected({\n filters: selectedFilters\n });\n html = $compile(html)($scope);\n $el.find(\".filters-applied\").html(html);\n if ($auth.isAuthenticated() && selectedFilters.length > 0) {\n return $el.find(\".save-filters\").show();\n } else {\n return $el.find(\".save-filters\").hide();\n }\n };\n renderFilters = function(filters) {\n var html;\n _.filter(filters, (function(_this) {\n return function(f) {\n if (f.color) {\n return f.style = \"border-left: 3px solid \" + f.color;\n }\n };\n })(this));\n html = template({\n filters: filters\n });\n html = $compile(html)($scope);\n return $el.find(\".filter-list\").html(html);\n };\n getFiltersType = function() {\n return $el.find(\"h2 a.subfilter span.title\").prop('data-type');\n };\n reloadIssues = function() {\n var currentFiltersType;\n currentFiltersType = getFiltersType();\n return $q.all([$ctrl.loadIssues(), $ctrl.loadFilters()]).then(function() {\n var filters;\n filters = $scope.filters[currentFiltersType];\n return renderFilters(_.reject(filters, \"selected\"));\n });\n };\n toggleFilterSelection = function(type, id) {\n var currentFiltersType, filter, filterId, filters;\n if (type === \"myFilters\") {\n $rs.issues.getMyFilters($scope.projectId).then(function(data) {\n var filters, myFilters;\n myFilters = data;\n filters = myFilters[id];\n filters.page = 1;\n $ctrl.replaceAllFilters(filters);\n $ctrl.storeFilters();\n $ctrl.loadIssues();\n $ctrl.markSelectedFilters($scope.filters, filters);\n return initializeSelectedFilters($scope.filters);\n });\n return null;\n }\n filters = $scope.filters[type];\n filterId = type === 'tags' ? taiga.toString(id) : id;\n filter = _.find(filters, {\n id: filterId\n });\n filter.selected = !filter.selected;\n if (id === null) {\n id = \"null\";\n }\n if (filter.selected) {\n selectedFilters.push(filter);\n $ctrl.selectFilter(type, id);\n $ctrl.selectFilter(\"page\", 1);\n $ctrl.storeFilters();\n } else {\n selectedFilters = _.reject(selectedFilters, function(f) {\n return f.id === filter.id && f.type === filter.type;\n });\n $ctrl.unselectFilter(type, id);\n $ctrl.selectFilter(\"page\", 1);\n $ctrl.storeFilters();\n }\n reloadIssues();\n renderSelectedFilters(selectedFilters);\n currentFiltersType = getFiltersType();\n if (type === currentFiltersType) {\n return renderFilters(_.reject(filters, \"selected\"));\n }\n };\n $scope.$on(\"filters:loaded\", function(ctx, filters) {\n return initializeSelectedFilters(filters);\n });\n $scope.$on(\"filters:issueupdate\", function(ctx, filters) {\n var html;\n html = template({\n filters: filters.status\n });\n html = $compile(html)($scope);\n return $el.find(\".filter-list\").html(html);\n });\n selectQFilter = debounceLeading(100, function(value, oldValue) {\n if (value === void 0 || value === oldValue) {\n return;\n }\n $ctrl.replaceFilter(\"page\", null, true);\n if (value.length === 0) {\n $ctrl.replaceFilter(\"q\", null);\n $ctrl.storeFilters();\n } else {\n $ctrl.replaceFilter(\"q\", value);\n $ctrl.storeFilters();\n }\n return reloadIssues();\n });\n unwatchIssues = $scope.$watch(\"issues\", function(newValue) {\n if (!_.isUndefined(newValue)) {\n $scope.$watch(\"filtersQ\", selectQFilter);\n return unwatchIssues();\n }\n });\n $el.on(\"click\", \".filters-cats > ul > li > a\", function(event) {\n var tags, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n tags = $scope.filters[target.data(\"type\")];\n renderFilters(_.reject(tags, \"selected\"));\n return showFilters(target.attr(\"title\"), target.data(\"type\"));\n });\n $el.on(\"click\", \".filters-inner > .filters-step-cat > .breadcrumb > .back\", function(event) {\n event.preventDefault();\n return showCategories($el);\n });\n $el.on(\"click\", \".filters-applied a\", function(event) {\n var id, target, type;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n id = target.data(\"id\") || null;\n type = target.data(\"type\");\n return toggleFilterSelection(type, id);\n });\n $el.on(\"click\", \".filter-list .single-filter\", function(event) {\n var id, target, type;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n target.toggleClass(\"active\");\n id = target.data(\"id\") || null;\n type = target.data(\"type\");\n if (type === \"myFilters\") {\n target.removeClass(\"active\");\n }\n return toggleFilterSelection(type, id);\n });\n $el.on(\"click\", \".filter-list .single-filter .icon-delete\", function(event) {\n var customFilterName, message, target, title;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n customFilterName = target.parent().data('id');\n title = $translate.instant(\"ISSUES.FILTERS.CONFIRM_DELETE.TITLE\");\n message = $translate.instant(\"ISSUES.FILTERS.CONFIRM_DELETE.MESSAGE\", {\n customFilterName: customFilterName\n });\n return $confirm.askOnDelete(title, message).then(function(askResponse) {\n var promise;\n promise = $ctrl.deleteMyFilter(customFilterName);\n promise.then(function() {\n promise = $ctrl.loadMyFilters();\n promise.then(function(filters) {\n askResponse.finish();\n $scope.filters.myFilters = filters;\n return renderFilters($scope.filters.myFilters);\n });\n return promise.then(null, function() {\n return askResponse.finish();\n });\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n });\n });\n });\n $el.on(\"click\", \".save-filters\", function(event) {\n event.preventDefault();\n renderFilters($scope.filters[\"myFilters\"]);\n showFilters(\"My filters\", \"myFilters\");\n $el.find('.save-filters').hide();\n $el.find('.my-filter-name').removeClass(\"hidden\");\n $el.find('.my-filter-name').focus();\n return $scope.$apply();\n });\n return $el.on(\"keyup\", \".my-filter-name\", function(event) {\n var currentLoading, newFilter, promise, target;\n event.preventDefault();\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n newFilter = target.val();\n currentLoading = $loading().target($el.find(\".new\")).start();\n promise = $ctrl.saveCurrentFiltersTo(newFilter);\n promise.then(function() {\n var loadPromise;\n loadPromise = $ctrl.loadMyFilters();\n loadPromise.then(function(filters) {\n var currentfilterstype;\n currentLoading.finish();\n $scope.filters.myFilters = filters;\n currentfilterstype = $el.find(\"h2 a.subfilter span.title\").prop('data-type');\n if (currentfilterstype === \"myFilters\") {\n renderFilters($scope.filters.myFilters);\n }\n $el.find('.my-filter-name').addClass(\"hidden\");\n return $el.find('.save-filters').show();\n });\n return loadPromise.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\", \"Error loading custom filters\");\n });\n });\n return promise.then(null, function() {\n currentLoading.finish();\n $el.find(\".my-filter-name\").val(newFilter).focus().select();\n return $confirm.notify(\"error\", \"Filter not saved\");\n });\n } else if (event.keyCode === 27) {\n $el.find('.my-filter-name').val('');\n $el.find('.my-filter-name').addClass(\"hidden\");\n return $el.find('.save-filters').show();\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgIssuesFilters\", [\"$q\", \"$log\", \"$tgLocation\", \"$tgResources\", \"$tgConfirm\", \"$tgLoading\", \"$tgTemplate\", \"$translate\", \"$compile\", \"$tgAuth\", IssuesFiltersDirective]);\n\n IssueStatusInlineEditionDirective = function($repo, $template, $rootscope) {\n\n /*\n Print the status of an Issue and a popover to change it.\n - tg-issue-status-inline-edition: The issue\n \n Example:\n \n div.status(tg-issue-status-inline-edition=\"issue\")\n a.issue-status(href=\"\")\n \n NOTE: This directive need 'issueStatusById' and 'project'.\n */\n var link, selectionTemplate, updateIssueStatus;\n selectionTemplate = $template.get(\"issue/issue-status-inline-edition-selection.html\", true);\n updateIssueStatus = function($el, issue, issueStatusById) {\n var issueStatusDom, issueStatusDomParent, status;\n issueStatusDomParent = $el.find(\".issue-status\");\n issueStatusDom = $el.find(\".issue-status .issue-status-bind\");\n status = issueStatusById[issue.status];\n if (status) {\n issueStatusDom.text(status.name);\n issueStatusDom.prop(\"title\", status.name);\n return issueStatusDomParent.css('color', status.color);\n }\n };\n link = function($scope, $el, $attrs) {\n var $ctrl, issue;\n $ctrl = $el.controller();\n issue = $scope.$eval($attrs.tgIssueStatusInlineEdition);\n $el.on(\"click\", \".issue-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", function(event) {\n var filter, j, len, ref, target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n ref = $scope.filters.status;\n for (j = 0, len = ref.length; j < len; j++) {\n filter = ref[j];\n if (filter.id === issue.status) {\n filter.count--;\n }\n }\n issue.status = target.data(\"status-id\");\n $el.find(\".pop-status\").popover().close();\n updateIssueStatus($el, issue, $scope.issueStatusById);\n return $scope.$apply(function() {\n var k, len1, ref1;\n $repo.save(issue).then(function() {\n return $ctrl.loadIssues();\n });\n ref1 = $scope.filters.status;\n for (k = 0, len1 = ref1.length; k < len1; k++) {\n filter = ref1[k];\n if (filter.id === issue.status) {\n filter.count++;\n }\n }\n return $rootscope.$broadcast(\"filters:issueupdate\", $scope.filters);\n });\n });\n taiga.bindOnce($scope, \"project\", function(project) {\n $el.append(selectionTemplate({\n 'statuses': project.issue_statuses\n }));\n updateIssueStatus($el, issue, $scope.issueStatusById);\n if (project.my_permissions.indexOf(\"modify_issue\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n $scope.$watch($attrs.tgIssueStatusInlineEdition, (function(_this) {\n return function(val) {\n return updateIssueStatus($el, val, $scope.issueStatusById);\n };\n })(this));\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgIssueStatusInlineEdition\", [\"$tgRepo\", \"$tgTemplate\", \"$rootScope\", IssueStatusInlineEditionDirective]);\n\n IssueAssignedToInlineEditionDirective = function($repo, $rootscope, $translate) {\n var link, template;\n template = _.template(\"\\\" alt=\\\"<%- name %>\\\"/>\\n
<%- name %>
\");\n link = function($scope, $el, $attrs) {\n var $ctrl, issue, updateIssue;\n updateIssue = function(issue) {\n var ctx, member;\n ctx = {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\"),\n imgurl: \"/\" + window._version + \"/images/unnamed.png\"\n };\n member = $scope.usersById[issue.assigned_to];\n if (member) {\n ctx.name = member.full_name_display;\n ctx.imgurl = member.photo;\n }\n $el.find(\".avatar\").html(template(ctx));\n return $el.find(\".issue-assignedto\").attr('title', ctx.name);\n };\n $ctrl = $el.controller();\n issue = $scope.$eval($attrs.tgIssueAssignedToInlineEdition);\n updateIssue(issue);\n $el.on(\"click\", \".issue-assignedto\", function(event) {\n return $rootscope.$broadcast(\"assigned-to:add\", issue);\n });\n taiga.bindOnce($scope, \"project\", function(project) {\n if (project.my_permissions.indexOf(\"modify_issue\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n $scope.$on(\"assigned-to:added\", (function(_this) {\n return function(ctx, userId, updatedIssue) {\n if (updatedIssue.id === issue.id) {\n updatedIssue.assigned_to = userId;\n $repo.save(updatedIssue);\n return updateIssue(updatedIssue);\n }\n };\n })(this));\n $scope.$watch($attrs.tgIssueAssignedToInlineEdition, (function(_this) {\n return function(val) {\n return updateIssue(val);\n };\n })(this));\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgIssueAssignedToInlineEdition\", [\"$tgRepo\", \"$rootScope\", \"$translate\", IssueAssignedToInlineEditionDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/userstories/detail.coffee\n */\n\n(function() {\n var UsClientRequirementButtonDirective, UsStatusButtonDirective, UsStatusDisplayDirective, UsTeamRequirementButtonDirective, UserStoryDetailController, bindMethods, bindOnce, groupBy, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaUserStories\");\n\n UserStoryDetailController = (function(superClass) {\n extend(UserStoryDetailController, superClass);\n\n UserStoryDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$log\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\"];\n\n function UserStoryDetailController(scope, rootscope, repo, confirm, rs, params, q, location, log, appMetaService, navUrls, analytics, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.log = log;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.translate = translate;\n bindMethods(this);\n this.scope.usRef = this.params.usref;\n this.scope.sectionName = this.translate.instant(\"US.SECTION_NAME\");\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n _this._setMeta();\n return _this.initializeOnDeleteGoToUrl();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n UserStoryDetailController.prototype._setMeta = function() {\n var closedTasks, description, progressPercentage, ref, title, totalTasks;\n totalTasks = this.scope.tasks.length;\n closedTasks = _.filter(this.scope.tasks, (function(_this) {\n return function(t) {\n return _this.scope.taskStatusById[t.status].is_closed;\n };\n })(this)).length;\n progressPercentage = totalTasks > 0 ? Math.round(100 * closedTasks / totalTasks) : 0;\n title = this.translate.instant(\"US.PAGE_TITLE\", {\n userStoryRef: \"#\" + this.scope.us.ref,\n userStorySubject: this.scope.us.subject,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"US.PAGE_DESCRIPTION\", {\n userStoryStatus: ((ref = this.scope.statusById[this.scope.us.status]) != null ? ref.name : void 0) || \"--\",\n userStoryPoints: this.scope.us.total_points,\n userStoryDescription: angular.element(this.scope.us.description_html || \"\").text(),\n userStoryClosedTasks: closedTasks,\n userStoryTotalTasks: totalTasks,\n userStoryProgressPercentage: progressPercentage\n });\n return this.appMetaService.setAll(title, description);\n };\n\n UserStoryDetailController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"related-tasks:update\", (function(_this) {\n return function() {\n return _this.scope.tasks = _.clone(_this.scope.tasks, false);\n };\n })(this));\n this.scope.$on(\"attachment:create\", (function(_this) {\n return function() {\n return _this.analytics.trackEvent(\"attachment\", \"create\", \"create attachment on userstory\", 1);\n };\n })(this));\n return this.scope.$on(\"comment:new\", (function(_this) {\n return function() {\n return _this.loadUs();\n };\n })(this));\n };\n\n UserStoryDetailController.prototype.initializeOnDeleteGoToUrl = function() {\n var ctx;\n ctx = {\n project: this.scope.project.slug\n };\n this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project\", ctx);\n if (this.scope.project.is_backlog_activated) {\n if (this.scope.us.milestone) {\n ctx.sprint = this.scope.sprint.slug;\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-taskboard\", ctx);\n } else {\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-backlog\", ctx);\n }\n } else if (this.scope.project.is_kanban_activated) {\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-kanban\", ctx);\n }\n };\n\n UserStoryDetailController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n _this.scope.statusList = project.us_statuses;\n _this.scope.statusById = groupBy(project.us_statuses, function(x) {\n return x.id;\n });\n _this.scope.taskStatusById = groupBy(project.task_statuses, function(x) {\n return x.id;\n });\n _this.scope.pointsList = _.sortBy(project.points, \"order\");\n _this.scope.pointsById = groupBy(_this.scope.pointsList, function(e) {\n return e.id;\n });\n return project;\n };\n })(this));\n };\n\n UserStoryDetailController.prototype.loadUs = function() {\n var httpParams, kanbanStaus, milestone, noMilestone;\n httpParams = _.pick(this.location.search(), \"milestone\", \"no-milestone\", \"kanban-status\");\n milestone = httpParams.milestone;\n if (milestone) {\n this.rs.userstories.storeQueryParams(this.scope.projectId, {\n milestone: milestone,\n order_by: \"sprint_order\"\n });\n }\n noMilestone = httpParams[\"no-milestone\"];\n if (noMilestone) {\n this.rs.userstories.storeQueryParams(this.scope.projectId, {\n milestone: \"null\",\n order_by: \"backlog_order\"\n });\n }\n kanbanStaus = httpParams[\"kanban-status\"];\n if (kanbanStaus) {\n this.rs.userstories.storeQueryParams(this.scope.projectId, {\n status: kanbanStaus,\n order_by: \"kanban_order\"\n });\n }\n return this.rs.userstories.getByRef(this.scope.projectId, this.params.usref).then((function(_this) {\n return function(us) {\n var ctx, ref, ref1;\n _this.scope.us = us;\n _this.scope.usId = us.id;\n _this.scope.commentModel = us;\n if (((ref = _this.scope.us.neighbors.previous) != null ? ref.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.us.neighbors.previous.ref\n };\n _this.scope.previousUrl = _this.navUrls.resolve(\"project-userstories-detail\", ctx);\n }\n if (((ref1 = _this.scope.us.neighbors.next) != null ? ref1.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.us.neighbors.next.ref\n };\n _this.scope.nextUrl = _this.navUrls.resolve(\"project-userstories-detail\", ctx);\n }\n return us;\n };\n })(this));\n };\n\n UserStoryDetailController.prototype.loadSprint = function() {\n if (this.scope.us.milestone) {\n return this.rs.sprints.get(this.scope.us.project, this.scope.us.milestone).then((function(_this) {\n return function(sprint) {\n _this.scope.sprint = sprint;\n return sprint;\n };\n })(this));\n }\n };\n\n UserStoryDetailController.prototype.loadTasks = function() {\n return this.rs.tasks.list(this.scope.projectId, null, this.scope.usId).then((function(_this) {\n return function(tasks) {\n _this.scope.tasks = tasks;\n return tasks;\n };\n })(this));\n };\n\n UserStoryDetailController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise.then((function(_this) {\n return function(project) {\n _this.fillUsersAndRoles(project.members, project.roles);\n return _this.loadUs().then(function() {\n return _this.q.all([_this.loadSprint(), _this.loadTasks()]);\n });\n };\n })(this));\n };\n\n\n /*\n * Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n * See app/modules/components/vote-button for more info\n */\n\n UserStoryDetailController.prototype.onUpvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadUs();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.userstories.upvote(this.scope.usId).then(onSuccess, onError);\n };\n\n UserStoryDetailController.prototype.onDownvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadUs();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.userstories.downvote(this.scope.usId).then(onSuccess, onError);\n };\n\n\n /*\n * Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n * See app/modules/components/watch-button for more info\n */\n\n UserStoryDetailController.prototype.onWatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadUs();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.userstories.watch(this.scope.usId).then(onSuccess, onError);\n };\n\n UserStoryDetailController.prototype.onUnwatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadUs();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.userstories.unwatch(this.scope.usId).then(onSuccess, onError);\n };\n\n return UserStoryDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"UserStoryDetailController\", UserStoryDetailController);\n\n UsStatusDisplayDirective = function($template, $compile) {\n var link, template;\n template = $template.get(\"common/components/status-display.html\", true);\n link = function($scope, $el, $attrs) {\n var render;\n render = function(us) {\n var html, status;\n status = $scope.statusById[us.status];\n html = template({\n is_closed: us.is_closed,\n status: status\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $scope.$watch($attrs.ngModel, function(us) {\n if (us != null) {\n return render(us);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsStatusDisplay\", [\"$tgTemplate\", \"$compile\", UsStatusDisplayDirective]);\n\n UsStatusButtonDirective = function($rootScope, $repo, $confirm, $loading, $qqueue, $template) {\n var link, template;\n template = $template.get(\"us/us-status-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_us\") !== -1;\n };\n render = (function(_this) {\n return function(us) {\n var html, status;\n status = $scope.statusById[us.status];\n html = template({\n status: status,\n statuses: $scope.statusList,\n editable: isEditable()\n });\n return $el.html(html);\n };\n })(this);\n save = $qqueue.bindAdd((function(_this) {\n return function(status) {\n var currentLoading, onError, onSuccess, us;\n us = $model.$modelValue.clone();\n us.status = status;\n $.fn.popover().closeAll();\n currentLoading = $loading().target($el).start();\n onSuccess = function() {\n $model.$setViewValue(us);\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return $repo.save(us).then(onSuccess, onError);\n };\n })(this));\n $el.on(\"click\", \".js-edit-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", function(event) {\n var status, target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n status = target.data(\"status-id\");\n return save(status);\n });\n $scope.$watch($attrs.ngModel, function(us) {\n if (us) {\n return render(us);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", UsStatusButtonDirective]);\n\n UsTeamRequirementButtonDirective = function($rootscope, $tgrepo, $confirm, $loading, $qqueue, $template, $compile) {\n var link, template;\n template = $template.get(\"us/us-team-requirement-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var canEdit, render, save;\n canEdit = function() {\n return $scope.project.my_permissions.indexOf(\"modify_us\") !== -1;\n };\n render = function(us) {\n var ctx, html;\n ctx = {\n canEdit: canEdit(),\n isRequired: us.team_requirement\n };\n html = template(ctx);\n html = $compile(html)($scope);\n return $el.html(html);\n };\n save = $qqueue.bindAdd((function(_this) {\n return function(team_requirement) {\n var currentLoading, promise, us;\n us = $model.$modelValue.clone();\n us.team_requirement = team_requirement;\n currentLoading = $loading().target($el.find(\"label\")).start();\n promise = $tgrepo.save(us);\n promise.then(function() {\n $model.$setViewValue(us);\n currentLoading.finish();\n return $rootscope.$broadcast(\"object:updated\");\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n $el.on(\"click\", \".team-requirement\", function(event) {\n var team_requirement;\n if (!canEdit()) {\n return;\n }\n team_requirement = !$model.$modelValue.team_requirement;\n return save(team_requirement);\n });\n $scope.$watch($attrs.ngModel, function(us) {\n if (us) {\n return render(us);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsTeamRequirementButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", UsTeamRequirementButtonDirective]);\n\n UsClientRequirementButtonDirective = function($rootscope, $tgrepo, $confirm, $loading, $qqueue, $template, $compile) {\n var link, template;\n template = $template.get(\"us/us-client-requirement-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var canEdit, render, save;\n canEdit = function() {\n return $scope.project.my_permissions.indexOf(\"modify_us\") !== -1;\n };\n render = function(us) {\n var ctx, html;\n ctx = {\n canEdit: canEdit(),\n isRequired: us.client_requirement\n };\n html = $compile(template(ctx))($scope);\n return $el.html(html);\n };\n save = $qqueue.bindAdd((function(_this) {\n return function(client_requirement) {\n var currentLoading, promise, us;\n us = $model.$modelValue.clone();\n us.client_requirement = client_requirement;\n currentLoading = $loading().target($el.find(\"label\")).start();\n promise = $tgrepo.save(us);\n promise.then(function() {\n $model.$setViewValue(us);\n currentLoading.finish();\n return $rootscope.$broadcast(\"object:updated\");\n });\n return promise.then(null, function() {\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n $el.on(\"click\", \".client-requirement\", function(event) {\n var client_requirement;\n if (!canEdit()) {\n return;\n }\n client_requirement = !$model.$modelValue.client_requirement;\n return save(client_requirement);\n });\n $scope.$watch($attrs.ngModel, function(us) {\n if (us) {\n return render(us);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsClientRequirementButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", UsClientRequirementButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/tasks/detail.coffee\n */\n\n(function() {\n var TaskDetailController, TaskIsIocaineButtonDirective, TaskStatusButtonDirective, TaskStatusDisplayDirective, bindMethods, groupBy, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaTasks\");\n\n TaskDetailController = (function(superClass) {\n extend(TaskDetailController, superClass);\n\n TaskDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$log\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\"];\n\n function TaskDetailController(scope, rootscope, repo, confirm, rs, params, q, location, log, appMetaService, navUrls, analytics, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.log = log;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.translate = translate;\n bindMethods(this);\n this.scope.taskRef = this.params.taskref;\n this.scope.sectionName = this.translate.instant(\"TASK.SECTION_NAME\");\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n _this._setMeta();\n return _this.initializeOnDeleteGoToUrl();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n TaskDetailController.prototype._setMeta = function() {\n var description, ref, title;\n title = this.translate.instant(\"TASK.PAGE_TITLE\", {\n taskRef: \"#\" + this.scope.task.ref,\n taskSubject: this.scope.task.subject,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"TASK.PAGE_DESCRIPTION\", {\n taskStatus: ((ref = this.scope.statusById[this.scope.task.status]) != null ? ref.name : void 0) || \"--\",\n taskDescription: angular.element(this.scope.task.description_html || \"\").text()\n });\n return this.appMetaService.setAll(title, description);\n };\n\n TaskDetailController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"attachment:create\", (function(_this) {\n return function() {\n return _this.analytics.trackEvent(\"attachment\", \"create\", \"create attachment on task\", 1);\n };\n })(this));\n this.scope.$on(\"custom-attributes-values:edit\", (function(_this) {\n return function() {\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this));\n return this.scope.$on(\"comment:new\", (function(_this) {\n return function() {\n return _this.loadTask();\n };\n })(this));\n };\n\n TaskDetailController.prototype.initializeOnDeleteGoToUrl = function() {\n var ctx;\n ctx = {\n project: this.scope.project.slug\n };\n this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project\", ctx);\n if (this.scope.project.is_backlog_activated) {\n if (this.scope.task.milestone) {\n ctx.sprint = this.scope.sprint.slug;\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-taskboard\", ctx);\n } else if (this.scope.task.us) {\n ctx.ref = this.scope.us.ref;\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-userstories-detail\", ctx);\n }\n } else if (this.scope.project.is_kanban_activated) {\n if (this.scope.us) {\n ctx.ref = this.scope.us.ref;\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-userstories-detail\", ctx);\n }\n }\n };\n\n TaskDetailController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n _this.scope.statusList = project.task_statuses;\n _this.scope.statusById = groupBy(project.task_statuses, function(x) {\n return x.id;\n });\n return project;\n };\n })(this));\n };\n\n TaskDetailController.prototype.loadTask = function() {\n return this.rs.tasks.getByRef(this.scope.projectId, this.params.taskref).then((function(_this) {\n return function(task) {\n var ctx, ref, ref1;\n _this.scope.task = task;\n _this.scope.taskId = task.id;\n _this.scope.commentModel = task;\n if (((ref = _this.scope.task.neighbors.previous) != null ? ref.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.task.neighbors.previous.ref\n };\n _this.scope.previousUrl = _this.navUrls.resolve(\"project-tasks-detail\", ctx);\n }\n if (((ref1 = _this.scope.task.neighbors.next) != null ? ref1.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.task.neighbors.next.ref\n };\n _this.scope.nextUrl = _this.navUrls.resolve(\"project-tasks-detail\", ctx);\n }\n return task;\n };\n })(this));\n };\n\n TaskDetailController.prototype.loadSprint = function() {\n if (this.scope.task.milestone) {\n return this.rs.sprints.get(this.scope.task.project, this.scope.task.milestone).then((function(_this) {\n return function(sprint) {\n _this.scope.sprint = sprint;\n return sprint;\n };\n })(this));\n }\n };\n\n TaskDetailController.prototype.loadUserStory = function() {\n if (this.scope.task.user_story) {\n return this.rs.userstories.get(this.scope.task.project, this.scope.task.user_story).then((function(_this) {\n return function(us) {\n _this.scope.us = us;\n return us;\n };\n })(this));\n }\n };\n\n TaskDetailController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise.then((function(_this) {\n return function(project) {\n _this.fillUsersAndRoles(project.members, project.roles);\n return _this.loadTask().then(function() {\n return _this.q.all([_this.loadSprint(), _this.loadUserStory()]);\n });\n };\n })(this));\n };\n\n\n /*\n * Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n * See app/modules/components/vote-button for more info\n */\n\n TaskDetailController.prototype.onUpvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadTask();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.tasks.upvote(this.scope.taskId).then(onSuccess, onError);\n };\n\n TaskDetailController.prototype.onDownvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadTask();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.tasks.downvote(this.scope.taskId).then(onSuccess, onError);\n };\n\n\n /*\n * Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n * See app/modules/components/watch-button for more info\n */\n\n TaskDetailController.prototype.onWatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadTask();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.tasks.watch(this.scope.taskId).then(onSuccess, onError);\n };\n\n TaskDetailController.prototype.onUnwatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadTask();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.tasks.unwatch(this.scope.taskId).then(onSuccess, onError);\n };\n\n return TaskDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"TaskDetailController\", TaskDetailController);\n\n TaskStatusDisplayDirective = function($template, $compile) {\n var link, template;\n template = $template.get(\"common/components/status-display.html\", true);\n link = function($scope, $el, $attrs) {\n var render;\n render = function(task) {\n var html, status;\n status = $scope.statusById[task.status];\n html = template({\n is_closed: status.is_closed,\n status: status\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $scope.$watch($attrs.ngModel, function(task) {\n if (task != null) {\n return render(task);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgTaskStatusDisplay\", [\"$tgTemplate\", \"$compile\", TaskStatusDisplayDirective]);\n\n TaskStatusButtonDirective = function($rootScope, $repo, $confirm, $loading, $qqueue, $compile, $translate, $template) {\n var link, template;\n template = $template.get(\"us/us-status-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_task\") !== -1;\n };\n render = (function(_this) {\n return function(task) {\n var html, status;\n status = $scope.statusById[task.status];\n html = $compile(template({\n status: status,\n statuses: $scope.statusList,\n editable: isEditable()\n }))($scope);\n return $el.html(html);\n };\n })(this);\n save = $qqueue.bindAdd((function(_this) {\n return function(status) {\n var currentLoading, onError, onSuccess, task;\n task = $model.$modelValue.clone();\n task.status = status;\n currentLoading = $loading().target($el).start();\n onSuccess = function() {\n $model.$setViewValue(task);\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return $repo.save(task).then(onSuccess, onError);\n };\n })(this));\n $el.on(\"click\", \".js-edit-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", function(event) {\n var target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n $.fn.popover().closeAll();\n return save(target.data(\"status-id\"));\n });\n $scope.$watch($attrs.ngModel, function(task) {\n if (task) {\n return render(task);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgTaskStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$compile\", \"$translate\", \"$tgTemplate\", TaskStatusButtonDirective]);\n\n TaskIsIocaineButtonDirective = function($rootscope, $tgrepo, $confirm, $loading, $qqueue, $compile, $template) {\n var link, template;\n template = $template.get(\"issue/iocaine-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_task\") !== -1;\n };\n render = function(task) {\n var ctx, html;\n if (!isEditable() && !task.is_iocaine) {\n $el.html(\"\");\n return;\n }\n ctx = {\n isIocaine: task.is_iocaine,\n isEditable: isEditable()\n };\n html = $compile(template(ctx))($scope);\n return $el.html(html);\n };\n save = $qqueue.bindAdd((function(_this) {\n return function(is_iocaine) {\n var currentLoading, promise, task;\n task = $model.$modelValue.clone();\n task.is_iocaine = is_iocaine;\n currentLoading = $loading().target($el.find('label')).start();\n promise = $tgrepo.save(task);\n promise.then(function() {\n $model.$setViewValue(task);\n return $rootscope.$broadcast(\"object:updated\");\n });\n promise.then(null, function() {\n return $confirm.notify(\"error\");\n });\n return promise[\"finally\"](function() {\n return currentLoading.finish();\n });\n };\n })(this));\n $el.on(\"click\", \".is-iocaine\", function(event) {\n var is_iocaine;\n if (!isEditable()) {\n return;\n }\n is_iocaine = !$model.$modelValue.is_iocaine;\n return save(is_iocaine);\n });\n $scope.$watch($attrs.ngModel, function(task) {\n if (task) {\n return render(task);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgTaskIsIocaineButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$compile\", \"$tgTemplate\", TaskIsIocaineButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/team/main.coffee\n */\n\n(function() {\n var LeaveProjectDirective, TeamController, TeamFiltersDirective, TeamMemberCurrentUserDirective, TeamMemberStatsDirective, TeamMembersDirective, membersFilter, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n module = angular.module(\"taigaTeam\");\n\n TeamController = (function(superClass) {\n extend(TeamController, superClass);\n\n TeamController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"$q\", \"$location\", \"$tgNavUrls\", \"tgAppMetaService\", \"$tgAuth\", \"$translate\", \"tgProjectService\"];\n\n function TeamController(scope, rootscope, repo, rs, params, q, location, navUrls, appMetaService, auth, translate, projectService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.auth = auth;\n this.translate = translate;\n this.projectService = projectService;\n this.scope.sectionName = \"TEAM.SECTION_NAME\";\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"TEAM.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.translate.instant(\"TEAM.PAGE_DESCRIPTION\", {\n projectName: _this.scope.project.name,\n projectDescription: _this.scope.project.description\n });\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n TeamController.prototype.setRole = function(role) {\n if (role) {\n return this.scope.filtersRole = role;\n } else {\n return this.scope.filtersRole = null;\n }\n };\n\n TeamController.prototype.loadMembers = function() {\n var i, len, member, ref, user;\n user = this.auth.getUser();\n this.scope.totals = {};\n ref = this.scope.activeUsers;\n for (i = 0, len = ref.length; i < len; i++) {\n member = ref[i];\n this.scope.totals[member.id] = 0;\n }\n this.scope.currentUser = _.find(this.scope.activeUsers, {\n id: user != null ? user.id : void 0\n });\n return this.scope.memberships = _.reject(this.scope.activeUsers, {\n id: user != null ? user.id : void 0\n });\n };\n\n TeamController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n _this.scope.issuesEnabled = project.is_issues_activated;\n _this.scope.tasksEnabled = project.is_kanban_activated || project.is_backlog_activated;\n _this.scope.wikiEnabled = project.is_wiki_activated;\n return project;\n };\n })(this));\n };\n\n TeamController.prototype.loadMemberStats = function() {\n return this.rs.projects.memberStats(this.scope.projectId).then((function(_this) {\n return function(stats) {\n var totals;\n totals = {};\n _.forEach(_this.scope.totals, function(total, userId) {\n var vals;\n vals = _.map(stats, function(memberStats, statsKey) {\n return memberStats[userId];\n });\n total = _.reduce(vals, function(sum, el) {\n return sum + el;\n });\n return _this.scope.totals[userId] = total;\n });\n _this.scope.stats = _this._processStats(stats);\n return _this.scope.stats.totals = _this.scope.totals;\n };\n })(this));\n };\n\n TeamController.prototype._processStat = function(stat) {\n var max, min, singleStat;\n max = _.max(stat);\n min = _.min(stat);\n singleStat = _.map(stat, function(value, key) {\n if (value === min) {\n return [key, 0.1];\n }\n if (value === max) {\n return [key, 1];\n }\n return [key, (value * 0.5) / max];\n });\n singleStat = _.object(singleStat);\n return singleStat;\n };\n\n TeamController.prototype._processStats = function(stats) {\n var key, value;\n for (key in stats) {\n value = stats[key];\n stats[key] = this._processStat(value);\n }\n return stats;\n };\n\n TeamController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise.then((function(_this) {\n return function(project) {\n _this.fillUsersAndRoles(project.members, project.roles);\n _this.loadMembers();\n return _this.loadMemberStats();\n };\n })(this));\n };\n\n return TeamController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"TeamController\", TeamController);\n\n TeamFiltersDirective = function() {\n return {\n templateUrl: \"team/team-filter.html\"\n };\n };\n\n module.directive(\"tgTeamFilters\", [TeamFiltersDirective]);\n\n TeamMemberStatsDirective = function() {\n return {\n templateUrl: \"team/team-member-stats.html\",\n scope: {\n stats: \"=\",\n userId: \"=user\",\n issuesEnabled: \"=issuesenabled\",\n tasksEnabled: \"=tasksenabled\",\n wikiEnabled: \"=wikienabled\"\n }\n };\n };\n\n module.directive(\"tgTeamMemberStats\", TeamMemberStatsDirective);\n\n TeamMemberCurrentUserDirective = function() {\n return {\n templateUrl: \"team/team-member-current-user.html\",\n scope: {\n projectId: \"=projectid\",\n currentUser: \"=currentuser\",\n stats: \"=\",\n issuesEnabled: \"=issuesenabled\",\n tasksEnabled: \"=tasksenabled\",\n wikiEnabled: \"=wikienabled\"\n }\n };\n };\n\n module.directive(\"tgTeamCurrentUser\", TeamMemberCurrentUserDirective);\n\n TeamMembersDirective = function() {\n var template;\n template = \"team/team-members.html\";\n return {\n templateUrl: template,\n scope: {\n memberships: \"=\",\n filtersQ: \"=filtersq\",\n filtersRole: \"=filtersrole\",\n stats: \"=\",\n issuesEnabled: \"=issuesenabled\",\n tasksEnabled: \"=tasksenabled\",\n wikiEnabled: \"=wikienabled\"\n }\n };\n };\n\n module.directive(\"tgTeamMembers\", TeamMembersDirective);\n\n LeaveProjectDirective = function($repo, $confirm, $location, $rs, $navurls, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n return $scope.leave = function() {\n var confirm_leave_project_text, leave_project_text;\n leave_project_text = $translate.instant(\"TEAM.ACTION_LEAVE_PROJECT\");\n confirm_leave_project_text = $translate.instant(\"TEAM.CONFIRM_LEAVE_PROJECT\");\n return $confirm.ask(leave_project_text, confirm_leave_project_text).then((function(_this) {\n return function(response) {\n var promise;\n promise = $rs.projects.leave($attrs.projectid);\n promise.then(function() {\n response.finish();\n $confirm.notify(\"success\");\n return $location.path($navurls.resolve(\"home\"));\n });\n return promise.then(null, function(response) {\n response.finish();\n return $confirm.notify('error', response.data._error_message);\n });\n };\n })(this));\n };\n };\n return {\n scope: {},\n templateUrl: \"team/leave-project.html\",\n link: link\n };\n };\n\n module.directive(\"tgLeaveProject\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"$tgResources\", \"$tgNavUrls\", \"$translate\", LeaveProjectDirective]);\n\n membersFilter = function() {\n return function(members, filtersQ, filtersRole) {\n return _.filter(members, function(m) {\n return (!filtersRole || m.role === filtersRole.id) && (!filtersQ || m.full_name.search(new RegExp(filtersQ, \"i\")) >= 0);\n });\n };\n };\n\n module.filter('membersFilter', membersFilter);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/wiki/detail.coffee\n */\n\n(function() {\n var EditableWikiContentDirective, WikiDetailController, WikiSummaryDirective, bindOnce, debounce, groupBy, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaWiki\");\n\n WikiDetailController = (function(superClass) {\n extend(WikiDetailController, superClass);\n\n WikiDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgModel\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$filter\", \"$log\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\"];\n\n function WikiDetailController(scope, rootscope, repo, model, confirm, rs, params, q, location, filter, log, appMetaService, navUrls, analytics, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.model = model;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.filter = filter;\n this.log = log;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.translate = translate;\n this.scope.projectSlug = this.params.pslug;\n this.scope.wikiSlug = this.params.slug;\n this.scope.wikiTitle = this.scope.wikiSlug;\n this.scope.sectionName = \"Wiki\";\n this.scope.linksVisible = false;\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n return _this._setMeta();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n WikiDetailController.prototype._setMeta = function() {\n var description, ref, ref1, ref2, title;\n title = this.translate.instant(\"WIKI.PAGE_TITLE\", {\n wikiPageName: this.scope.wikiTitle,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"WIKI.PAGE_DESCRIPTION\", {\n wikiPageContent: angular.element(((ref = this.scope.wiki) != null ? ref.html : void 0) || \"\").text(),\n totalEditions: ((ref1 = this.scope.wiki) != null ? ref1.editions : void 0) || 0,\n lastModifiedDate: moment((ref2 = this.scope.wiki) != null ? ref2.modified_date : void 0).format(this.translate.instant(\"WIKI.DATETIME\"))\n });\n return this.appMetaService.setAll(title, description);\n };\n\n WikiDetailController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n if (!project.is_wiki_activated) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n return project;\n };\n })(this));\n };\n\n WikiDetailController.prototype.loadWiki = function() {\n var promise;\n promise = this.rs.wiki.getBySlug(this.scope.projectId, this.params.slug);\n promise.then((function(_this) {\n return function(wiki) {\n _this.scope.wiki = wiki;\n _this.scope.wikiId = wiki.id;\n return _this.scope.wiki;\n };\n })(this));\n return promise.then(null, (function(_this) {\n return function(xhr) {\n var data;\n _this.scope.wikiId = null;\n if (_this.scope.project.my_permissions.indexOf(\"add_wiki_page\") === -1) {\n return null;\n }\n data = {\n project: _this.scope.projectId,\n slug: _this.scope.wikiSlug,\n content: \"\"\n };\n _this.scope.wiki = _this.model.make_model(\"wiki\", data);\n return _this.scope.wiki;\n };\n })(this));\n };\n\n WikiDetailController.prototype.loadWikiLinks = function() {\n return this.rs.wiki.listLinks(this.scope.projectId).then((function(_this) {\n return function(wikiLinks) {\n var selectedWikiLink;\n _this.scope.wikiLinks = wikiLinks;\n selectedWikiLink = _.find(wikiLinks, {\n href: _this.scope.wikiSlug\n });\n if (selectedWikiLink != null) {\n return _this.scope.wikiTitle = selectedWikiLink.title;\n }\n };\n })(this));\n };\n\n WikiDetailController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise.then((function(_this) {\n return function(project) {\n _this.fillUsersAndRoles(project.members, project.roles);\n return _this.q.all([_this.loadWikiLinks(), _this.loadWiki()]).then(_this.checkLinksPerms.bind(_this));\n };\n })(this));\n };\n\n WikiDetailController.prototype.checkLinksPerms = function() {\n if (this.scope.project.my_permissions.indexOf(\"modify_wiki_link\") !== -1 || (this.scope.project.my_permissions.indexOf(\"view_wiki_links\") !== -1 && this.scope.wikiLinks.length)) {\n return this.scope.linksVisible = true;\n }\n };\n\n WikiDetailController.prototype[\"delete\"] = function() {\n var message, title;\n title = this.translate.instant(\"WIKI.DELETE_LIGHTBOX_TITLE\");\n message = this.scope.wikiTitle;\n return this.confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var onError, onSuccess;\n onSuccess = function() {\n var ctx;\n askResponse.finish();\n ctx = {\n project: _this.scope.projectSlug\n };\n _this.location.path(_this.navUrls.resolve(\"project-wiki\", ctx));\n return _this.confirm.notify(\"success\");\n };\n onError = function() {\n askResponse.finish(false);\n return _this.confirm.notify(\"error\");\n };\n return _this.repo.remove(_this.scope.wiki).then(onSuccess, onError);\n };\n })(this));\n };\n\n return WikiDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"WikiDetailController\", WikiDetailController);\n\n WikiSummaryDirective = function($log, $template, $compile, $translate) {\n var link, template;\n template = $template.get(\"wiki/wiki-summary.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var render;\n render = function(wiki) {\n var ctx, html, user;\n if ($scope.usersById == null) {\n $log.error(\"WikiSummaryDirective requires userById set in scope.\");\n } else {\n user = $scope.usersById[wiki.last_modifier];\n }\n if (user === void 0) {\n user = {\n name: \"unknown\",\n imgUrl: \"/\" + window._version + \"/images/user-noimage.png\"\n };\n } else {\n user = {\n name: user.full_name_display,\n imgUrl: user.photo\n };\n }\n ctx = {\n totalEditions: wiki.editions,\n lastModifiedDate: moment(wiki.modified_date).format($translate.instant(\"WIKI.DATETIME\")),\n user: user\n };\n html = template(ctx);\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $scope.$watch($attrs.ngModel, function(wikiPage) {\n if (!wikiPage) {\n return;\n }\n return render(wikiPage);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgWikiSummary\", [\"$log\", \"$tgTemplate\", \"$compile\", \"$translate\", WikiSummaryDirective]);\n\n EditableWikiContentDirective = function($window, $document, $repo, $confirm, $loading, $analytics, $qqueue) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var cancelEdition, disableEdition, getSelectedText, isEditable, save, switchToEditMode, switchToReadMode;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_wiki_page\") !== -1;\n };\n switchToEditMode = function() {\n $el.find('.edit-wiki-content').show();\n $el.find('.view-wiki-content').hide();\n return $el.find('textarea').focus();\n };\n switchToReadMode = function() {\n $el.find('.edit-wiki-content').hide();\n return $el.find('.view-wiki-content').show();\n };\n disableEdition = function() {\n $el.find(\".view-wiki-content .edit\").remove();\n return $el.find(\".edit-wiki-content\").remove();\n };\n cancelEdition = function() {\n if (!$model.$modelValue.id) {\n return;\n }\n $scope.$apply((function(_this) {\n return function() {\n return $model.$modelValue.revert();\n };\n })(this));\n return switchToReadMode();\n };\n getSelectedText = function() {\n if ($window.getSelection) {\n return $window.getSelection().toString();\n } else if ($document.selection) {\n return $document.selection.createRange().text;\n }\n return null;\n };\n save = $qqueue.bindAdd(function(wiki) {\n var currentLoading, onError, onSuccess, promise;\n onSuccess = function(wikiPage) {\n if (wiki.id == null) {\n $analytics.trackEvent(\"wikipage\", \"create\", \"create wiki page\", 1);\n }\n $model.$setViewValue(wikiPage.clone());\n $confirm.notify(\"success\");\n return switchToReadMode();\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n currentLoading = $loading().removeClasses(\"icon-floppy\").target($el.find('.icon-floppy')).start();\n if (wiki.id != null) {\n promise = $repo.save(wiki).then(onSuccess, onError);\n } else {\n promise = $repo.create(\"wiki\", wiki).then(onSuccess, onError);\n }\n return promise[\"finally\"](function() {\n return currentLoading.finish();\n });\n });\n $el.on(\"click\", \"a\", function(event) {\n var href, target;\n target = angular.element(event.target);\n href = target.attr('href');\n if (href.indexOf(\"#\") === 0) {\n event.preventDefault();\n return $('body').scrollTop($(href).offset().top);\n }\n });\n $el.on(\"mousedown\", \".view-wiki-content\", function(event) {\n var target;\n target = angular.element(event.target);\n if (!isEditable()) {\n return;\n }\n if (event.button === 2) {\n\n }\n });\n $el.on(\"mouseup\", \".view-wiki-content\", function(event) {\n var target;\n target = angular.element(event.target);\n if (getSelectedText()) {\n return;\n }\n if (!isEditable()) {\n return;\n }\n if (target.is('a')) {\n return;\n }\n if (target.is('pre')) {\n return;\n }\n return switchToEditMode();\n });\n $el.on(\"click\", \".save\", debounce(2000, function() {\n return save($scope.wiki);\n }));\n $el.on(\"click\", \".cancel\", function() {\n return cancelEdition();\n });\n $el.on(\"keydown\", \"textarea\", function(event) {\n if (event.keyCode === 27) {\n return cancelEdition();\n }\n });\n $scope.$watch($attrs.ngModel, function(wikiPage) {\n if (!wikiPage) {\n return;\n }\n if (isEditable()) {\n $el.addClass('editable');\n if ((wikiPage.id == null) || $.trim(wikiPage.content).length === 0) {\n return switchToEditMode();\n }\n } else {\n return disableEdition();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\",\n templateUrl: \"wiki/editable-wiki-content.html\"\n };\n };\n\n module.directive(\"tgEditableWikiContent\", [\"$window\", \"$document\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgAnalytics\", \"$tgQqueue\", EditableWikiContentDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/wiki/detail.coffee\n */\n\n(function() {\n var WikiNavDirective, bindOnce, groupBy, mixOf, module, taiga;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaWiki\");\n\n WikiNavDirective = function($tgrepo, $log, $location, $confirm, $navUrls, $analytics, $loading, $template, $compile, $translate) {\n var link, template;\n template = $template.get(\"wiki/wiki-nav.html\", true);\n link = function($scope, $el, $attrs) {\n var $ctrl, render;\n $ctrl = $el.controller();\n if ($attrs.ngModel == null) {\n return $log.error(\"WikiNavDirective: no ng-model attr is defined\");\n }\n render = function(wikiLinks) {\n var addWikiLinkPermission, deleteWikiLinkPermission, html;\n addWikiLinkPermission = $scope.project.my_permissions.indexOf(\"add_wiki_link\") > -1;\n deleteWikiLinkPermission = $scope.project.my_permissions.indexOf(\"delete_wiki_link\") > -1;\n html = template({\n wikiLinks: wikiLinks,\n projectSlug: $scope.projectSlug,\n addWikiLinkPermission: addWikiLinkPermission,\n deleteWikiLinkPermission: deleteWikiLinkPermission\n });\n html = $compile(html)($scope);\n $el.off();\n $el.html(html);\n $el.on(\"click\", \".wiki-link .link-title\", function(event) {\n var linkId, linkSlug, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n linkId = target.parents('.wiki-link').data('id');\n linkSlug = $scope.wikiLinks[linkId].href;\n return $scope.$apply(function() {\n var ctx;\n ctx = {\n project: $scope.projectSlug,\n slug: linkSlug\n };\n return $location.path($navUrls.resolve(\"project-wiki-page\", ctx));\n });\n });\n $el.on(\"click\", \".add-button\", function(event) {\n event.preventDefault();\n $el.find(\".new\").removeClass(\"hidden\");\n $el.find(\".new input\").focus();\n return $el.find(\".add-button\").hide();\n });\n $el.on(\"click\", \".wiki-link .icon-delete\", function(event) {\n var linkId, message, target, title;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n linkId = target.parents('.wiki-link').data('id');\n title = $translate.instant(\"WIKI.DELETE_LIGHTBOX_TITLE\");\n message = $scope.wikiLinks[linkId].title;\n return $confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var promise;\n promise = $tgrepo.remove($scope.wikiLinks[linkId]);\n promise.then(function() {\n promise = $ctrl.loadWikiLinks();\n promise.then(function() {\n askResponse.finish();\n return render($scope.wikiLinks);\n });\n return promise.then(null, function() {\n return askResponse.finish();\n });\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n });\n return $el.on(\"keyup\", \".new input\", function(event) {\n var currentLoading, newLink, promise, target;\n event.preventDefault();\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n newLink = target.val();\n currentLoading = $loading().target($el.find(\".new\")).start();\n promise = $tgrepo.create(\"wiki-links\", {\n project: $scope.projectId,\n title: newLink\n });\n promise.then(function() {\n var loadPromise;\n $analytics.trackEvent(\"wikilink\", \"create\", \"create wiki link\", 1);\n loadPromise = $ctrl.loadWikiLinks();\n loadPromise.then(function() {\n currentLoading.finish();\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new input\").val('');\n $el.find(\".add-button\").show();\n return render($scope.wikiLinks);\n });\n return loadPromise.then(null, function() {\n currentLoading.finish();\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new input\").val('');\n $el.find(\".add-button\").show();\n return $confirm.notify(\"error\", \"Error loading wiki links\");\n });\n });\n return promise.then(null, function(error) {\n var ref;\n currentLoading.finish();\n $el.find(\".new input\").val(newLink);\n $el.find(\".new input\").focus().select();\n if ((error != null ? (ref = error.__all__) != null ? ref[0] : void 0 : void 0) != null) {\n return $confirm.notify(\"error\", \"The link already exists\");\n } else {\n return $confirm.notify(\"error\");\n }\n });\n } else if (event.keyCode === 27) {\n target = angular.element(event.currentTarget);\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new input\").val('');\n return $el.find(\".add-button\").show();\n }\n });\n };\n return bindOnce($scope, $attrs.ngModel, render);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgWikiNav\", [\"$tgRepo\", \"$log\", \"$tgLocation\", \"$tgConfirm\", \"$tgNavUrls\", \"$tgAnalytics\", \"$tgLoading\", \"$tgTemplate\", \"$compile\", \"$translate\", WikiNavDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/lightboxes.coffee\n */\n\n(function() {\n var CreateMembersDirective, MAX_MEMBERSHIP_FIELDSETS, debounce, module, taiga;\n\n taiga = this.taiga;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaKanban\");\n\n MAX_MEMBERSHIP_FIELDSETS = 4;\n\n CreateMembersDirective = function($rs, $rootScope, $confirm, $loading, lightboxService, $compile) {\n var extraTextTemplate, link, template;\n extraTextTemplate = \"
\\n \\n
\";\n template = _.template(\"
\\n
\\n data-required=\\\"true\\\" <% } %> data-type=\\\"email\\\" />\\n
\\n
\\n \\n \\n
\\n
\");\n link = function($scope, $el, $attrs) {\n var createFieldSet, resetForm, submit, submitButton;\n createFieldSet = function(required) {\n var ctx;\n if (required == null) {\n required = true;\n }\n ctx = {\n roleList: $scope.project.roles,\n required: required\n };\n return $compile(template(ctx))($scope);\n };\n resetForm = function() {\n var fieldSet, invitations;\n $el.find(\"form textarea\").remove();\n $el.find(\"form .add-member-wrapper\").remove();\n invitations = $el.find(\".add-member-forms\");\n invitations.html($compile(extraTextTemplate)($scope));\n fieldSet = createFieldSet();\n return invitations.prepend(fieldSet);\n };\n $scope.$on(\"membersform:new\", function() {\n resetForm();\n return lightboxService.open($el);\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n $el.on(\"click\", \".delete-fieldset\", function(event) {\n var fieldSet, lastActionButton, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n fieldSet = target.closest('.add-member-wrapper');\n fieldSet.remove();\n lastActionButton = $el.find(\".add-member-wrapper fieldset:last > a\");\n if (lastActionButton.hasClass(\"icon-delete delete-fieldset\")) {\n return lastActionButton.removeClass(\"icon-delete delete-fieldset\").addClass(\"icon-plus add-fieldset\");\n }\n });\n $el.on(\"click\", \".add-fieldset\", function(event) {\n var fieldSet, newFieldSet, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n fieldSet = target.closest('.add-member-wrapper');\n target.removeClass(\"icon-plus add-fieldset\").addClass(\"icon-delete delete-fieldset\");\n newFieldSet = createFieldSet(false);\n fieldSet.after(newFieldSet);\n $scope.$digest();\n if ($el.find(\".add-member-wrapper\").length === MAX_MEMBERSHIP_FIELDSETS) {\n return $el.find(\".add-member-wrapper fieldset:last > a\").removeClass(\"icon-plus add-fieldset\").addClass(\"icon-delete delete-fieldset\");\n }\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, form, invitation_extra_text, invitations, memberWrappers, onError, onSuccess, promise;\n event.preventDefault();\n currentLoading = $loading().target(submitButton).start();\n onSuccess = function(data) {\n currentLoading.finish();\n lightboxService.close($el);\n $confirm.notify(\"success\");\n return $rootScope.$broadcast(\"membersform:new:success\");\n };\n onError = function(data) {\n currentLoading.finish();\n lightboxService.close($el);\n $confirm.notify(\"error\");\n return $rootScope.$broadcast(\"membersform:new:error\");\n };\n form = $el.find(\"form\").checksley();\n form.destroy();\n form.initialize();\n if (!form.validate()) {\n return;\n }\n memberWrappers = $el.find(\"form .add-member-wrapper\");\n memberWrappers = _.filter(memberWrappers, function(mw) {\n return angular.element(mw).find(\"input\").hasClass('checksley-ok');\n });\n invitations = _.map(memberWrappers, function(mw) {\n var email, memberWrapper, role;\n memberWrapper = angular.element(mw);\n email = memberWrapper.find(\"input\");\n role = memberWrapper.find(\"select\");\n return {\n email: email.val(),\n role_id: role.val()\n };\n });\n if (invitations.length) {\n invitation_extra_text = $el.find(\"form textarea\").val();\n promise = $rs.memberships.bulkCreateMemberships($scope.project.id, invitations, invitation_extra_text);\n return promise.then(onSuccess, onError);\n }\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateMembers\", [\"$tgResources\", \"$rootScope\", \"$tgConfirm\", \"$tgLoading\", \"lightboxService\", \"$compile\", CreateMembersDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/memberships.coffee\n */\n\n(function() {\n var MembershipsController, MembershipsDirective, MembershipsRowActionsDirective, MembershipsRowAdminCheckboxDirective, MembershipsRowAvatarDirective, MembershipsRowRoleSelectorDirective, bindMethods, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaAdmin\");\n\n MembershipsController = (function(superClass) {\n extend(MembershipsController, superClass);\n\n MembershipsController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgAnalytics\", \"tgAppMetaService\", \"$translate\"];\n\n function MembershipsController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, analytics, appMetaService, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.appMetaService = appMetaService;\n this.translate = translate;\n bindMethods(this);\n this.scope.project = {};\n this.scope.filters = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.MEMBERSHIPS.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"membersform:new:success\", (function(_this) {\n return function() {\n _this.loadMembers();\n return _this.analytics.trackEvent(\"membership\", \"create\", \"create memberships on admin\", 1);\n };\n })(this));\n }\n\n MembershipsController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n if (!project.i_am_owner) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n return project;\n };\n })(this));\n };\n\n MembershipsController.prototype.loadMembers = function() {\n var httpFilters;\n httpFilters = this.getUrlFilters();\n return this.rs.memberships.list(this.scope.projectId, httpFilters).then((function(_this) {\n return function(data) {\n _this.scope.memberships = _.filter(data.models, function(membership) {\n return membership.user === null || membership.is_user_active;\n });\n _this.scope.page = data.current;\n _this.scope.count = data.count;\n _this.scope.paginatedBy = data.paginatedBy;\n return data;\n };\n })(this));\n };\n\n MembershipsController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n promise.then((function(_this) {\n return function() {\n return _this.loadMembers();\n };\n })(this));\n return promise;\n };\n\n MembershipsController.prototype.getUrlFilters = function() {\n var filters;\n filters = _.pick(this.location.search(), \"page\");\n if (!filters.page) {\n filters.page = 1;\n }\n return filters;\n };\n\n MembershipsController.prototype.addNewMembers = function() {\n return this.rootscope.$broadcast(\"membersform:new\");\n };\n\n return MembershipsController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"MembershipsController\", MembershipsController);\n\n MembershipsDirective = function($template, $compile) {\n var link, linkPagination, template;\n template = $template.get(\"admin/admin-membership-paginator.html\", true);\n linkPagination = function($scope, $el, $attrs, $ctrl) {\n var $pagEl, afterCurrent, atBegin, atEnd, beforeCurrent, getNumPages, renderPagination;\n afterCurrent = 2;\n beforeCurrent = 4;\n atBegin = 2;\n atEnd = 2;\n $pagEl = $el.find(\".memberships-paginator\");\n getNumPages = function() {\n var numPages;\n numPages = $scope.count / $scope.paginatedBy;\n if (parseInt(numPages, 10) < numPages) {\n numPages = parseInt(numPages, 10) + 1;\n } else {\n numPages = parseInt(numPages, 10);\n }\n return numPages;\n };\n renderPagination = function() {\n var cpage, html, i, j, numPages, options, pages, ref;\n numPages = getNumPages();\n if (numPages <= 1) {\n $pagEl.hide();\n return;\n }\n pages = [];\n options = {};\n options.pages = pages;\n options.showPrevious = $scope.page > 1;\n options.showNext = !($scope.page === numPages);\n cpage = $scope.page;\n for (i = j = 1, ref = numPages; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\n if (i === (cpage + afterCurrent) && numPages > (cpage + afterCurrent + atEnd)) {\n pages.push({\n classes: \"dots\",\n type: \"dots\"\n });\n } else if (i === (cpage - beforeCurrent) && cpage > (atBegin + beforeCurrent)) {\n pages.push({\n classes: \"dots\",\n type: \"dots\"\n });\n } else if (i > (cpage + afterCurrent) && i <= (numPages - atEnd)) {\n\n } else if (i < (cpage - beforeCurrent) && i > atBegin) {\n\n } else if (i === cpage) {\n pages.push({\n classes: \"active\",\n num: i,\n type: \"page-active\"\n });\n } else {\n pages.push({\n classes: \"page\",\n num: i,\n type: \"page\"\n });\n }\n }\n html = template(options);\n html = $compile(html)($scope);\n $pagEl.html(html);\n return $pagEl.show();\n };\n $scope.$watch(\"memberships\", function(value) {\n if (!value) {\n return;\n }\n return renderPagination();\n });\n $el.on(\"click\", \".memberships-paginator a.next\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", $scope.page + 1);\n return $ctrl.loadMembers();\n });\n });\n $el.on(\"click\", \".memberships-paginator a.previous\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", $scope.page - 1);\n return $ctrl.loadMembers();\n });\n });\n return $el.on(\"click\", \".memberships-paginator li.page > a\", function(event) {\n var pagenum, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n pagenum = target.data(\"pagenum\");\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", pagenum);\n return $ctrl.loadMembers();\n });\n });\n };\n link = function($scope, $el, $attrs) {\n var $ctrl;\n $ctrl = $el.controller();\n linkPagination($scope, $el, $attrs, $ctrl);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMemberships\", [\"$tgTemplate\", \"$compile\", MembershipsDirective]);\n\n MembershipsRowAvatarDirective = function($log, $template, $translate) {\n var link, template;\n template = $template.get(\"admin/memberships-row-avatar.html\", true);\n link = function($scope, $el, $attrs) {\n var member, pending, render;\n pending = $translate.instant(\"ADMIN.MEMBERSHIP.STATUS_PENDING\");\n render = function(member) {\n var ctx, html;\n ctx = {\n full_name: member.full_name ? member.full_name : \"\",\n email: member.user_email ? member.user_email : member.email,\n imgurl: member.photo ? member.photo : \"/\" + window._version + \"/images/unnamed.png\",\n pending: !member.is_user_active ? pending : \"\"\n };\n html = template(ctx);\n return $el.html(html);\n };\n if ($attrs.tgMembershipsRowAvatar == null) {\n return $log.error(\"MembershipsRowAvatarDirective: the directive need a member\");\n }\n member = $scope.$eval($attrs.tgMembershipsRowAvatar);\n render(member);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMembershipsRowAvatar\", [\"$log\", \"$tgTemplate\", '$translate', MembershipsRowAvatarDirective]);\n\n MembershipsRowAdminCheckboxDirective = function($log, $repo, $confirm, $template, $compile) {\n var link, template;\n template = $template.get(\"admin/admin-memberships-row-checkbox.html\", true);\n link = function($scope, $el, $attrs) {\n var html, member, render;\n render = function(member) {\n var ctx, html;\n ctx = {\n inputId: \"is-admin-\" + member.id\n };\n html = template(ctx);\n html = $compile(html)($scope);\n return $el.html(html);\n };\n if ($attrs.tgMembershipsRowAdminCheckbox == null) {\n return $log.error(\"MembershipsRowAdminCheckboxDirective: the directive need a member\");\n }\n member = $scope.$eval($attrs.tgMembershipsRowAdminCheckbox);\n html = render(member);\n if (member.is_owner) {\n $el.find(\":checkbox\").prop(\"checked\", true);\n }\n $el.on(\"click\", \":checkbox\", (function(_this) {\n return function(event) {\n var onError, onSuccess, target;\n onSuccess = function() {\n return $confirm.notify(\"success\");\n };\n onError = function(data) {\n member.revert();\n $el.find(\":checkbox\").prop(\"checked\", member.is_owner);\n return $confirm.notify(\"error\", data.is_owner[0]);\n };\n target = angular.element(event.currentTarget);\n member.is_owner = target.prop(\"checked\");\n return $repo.save(member).then(onSuccess, onError);\n };\n })(this));\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMembershipsRowAdminCheckbox\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgTemplate\", \"$compile\", MembershipsRowAdminCheckboxDirective]);\n\n MembershipsRowRoleSelectorDirective = function($log, $repo, $confirm) {\n var link, template;\n template = _.template(\"\");\n link = function($scope, $el, $attrs) {\n var $ctrl, html, member, render;\n render = function(member) {\n var ctx, html;\n ctx = {\n roleList: $scope.project.roles,\n selectedRole: member.role\n };\n html = template(ctx);\n return $el.html(html);\n };\n if ($attrs.tgMembershipsRowRoleSelector == null) {\n return $log.error(\"MembershipsRowRoleSelectorDirective: the directive need a member\");\n }\n $ctrl = $el.controller();\n member = $scope.$eval($attrs.tgMembershipsRowRoleSelector);\n html = render(member);\n $el.on(\"change\", \"select\", (function(_this) {\n return function(event) {\n var newRole, onError, onSuccess, target;\n onSuccess = function() {\n return $confirm.notify(\"success\");\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n target = angular.element(event.currentTarget);\n newRole = parseInt(target.val(), 10);\n if (member.role !== newRole) {\n member.role = newRole;\n return $repo.save(member).then(onSuccess, onError);\n }\n };\n })(this));\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMembershipsRowRoleSelector\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", MembershipsRowRoleSelectorDirective]);\n\n MembershipsRowActionsDirective = function($log, $repo, $rs, $confirm, $compile, $translate) {\n var activedTemplate, link, pendingTemplate;\n activedTemplate = \"
\\n
\\n\\n \\n\";\n pendingTemplate = \"\\n\\n\\n \\n\";\n link = function($scope, $el, $attrs) {\n var $ctrl, member, render;\n render = function(member) {\n var html;\n if (member.user) {\n html = $compile(activedTemplate)($scope);\n } else {\n html = $compile(pendingTemplate)($scope);\n }\n return $el.html(html);\n };\n if ($attrs.tgMembershipsRowActions == null) {\n return $log.error(\"MembershipsRowActionsDirective: the directive need a member\");\n }\n $ctrl = $el.controller();\n member = $scope.$eval($attrs.tgMembershipsRowActions);\n render(member);\n $el.on(\"click\", \".js-resend\", function(event) {\n var onError, onSuccess;\n event.preventDefault();\n onSuccess = function() {\n var text;\n text = $translate.instant(\"ADMIN.MEMBERSHIP.SUCCESS_SEND_INVITATION\", {\n email: $scope.member.email\n });\n return $confirm.notify(\"success\", text);\n };\n onError = function() {\n var text;\n text = $translate.instant(\"ADMIM.MEMBERSHIP.ERROR_SEND_INVITATION\");\n return $confirm.notify(\"error\", text);\n };\n return $rs.memberships.resendInvitation($scope.member.id).then(onSuccess, onError);\n });\n $el.on(\"click\", \".delete\", function(event) {\n var defaultMsg, message, title;\n event.preventDefault();\n title = $translate.instant(\"ADMIN.MEMBERSHIP.DELETE_MEMBER\");\n defaultMsg = $translate.instant(\"ADMIN.MEMBERSHIP.DEFAULT_DELETE_MESSAGE\", {\n email: member.email\n });\n message = member.user ? member.full_name : defaultMsg;\n return $confirm.askOnDelete(title, message).then(function(askResponse) {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n var text;\n askResponse.finish();\n if ($scope.page > 1 && ($scope.count - 1) <= $scope.paginatedBy) {\n $ctrl.selectFilter(\"page\", $scope.page - 1);\n }\n $ctrl.loadMembers();\n text = $translate.instant(\"ADMIN.MEMBERSHIP.SUCCESS_DELETE\");\n return $confirm.notify(\"success\", null, text);\n };\n })(this);\n onError = (function(_this) {\n return function() {\n var text;\n askResponse.finish(false);\n text = $translate.instant(\"ADMIN.MEMBERSHIP.ERROR_DELETE\", {\n message: message\n });\n return $confirm.notify(\"error\", null, text);\n };\n })(this);\n return $repo.remove(member).then(onSuccess, onError);\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMembershipsRowActions\", [\"$log\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$compile\", \"$translate\", MembershipsRowActionsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/nav.coffee\n */\n\n(function() {\n var AdminNavigationDirective, module;\n\n AdminNavigationDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var section;\n section = $attrs.tgAdminNavigation;\n $el.find(\".active\").removeClass(\"active\");\n $el.find(\"#adminmenu-\" + section + \" a\").addClass(\"active\");\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module = angular.module(\"taigaAdmin\");\n\n module.directive(\"tgAdminNavigation\", AdminNavigationDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/project-profile.coffee\n */\n\n(function() {\n var CsvExporterController, CsvExporterIssuesController, CsvExporterTasksController, CsvExporterUserstoriesController, CsvIssueDirective, CsvTaskDirective, CsvUsDirective, ProjectDefaultValuesDirective, ProjectExportDirective, ProjectLogoDirective, ProjectLogoModelDirective, ProjectModulesDirective, ProjectProfileController, ProjectProfileDirective, bindOnce, debounce, groupBy, joinStr, mixOf, module, taiga, toString, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n trim = this.taiga.trim;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaAdmin\");\n\n ProjectProfileController = (function(superClass) {\n extend(ProjectProfileController, superClass);\n\n ProjectProfileController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"$translate\"];\n\n function ProjectProfileController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, appMetaService, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, sectionName, title;\n sectionName = _this.translate.instant(_this.scope.sectionName);\n title = _this.translate.instant(\"ADMIN.PROJECT_PROFILE.PAGE_TITLE\", {\n sectionName: sectionName,\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"project:loaded\", (function(_this) {\n return function() {\n var description, sectionName, title;\n sectionName = _this.translate.instant(_this.scope.sectionName);\n title = _this.translate.instant(\"ADMIN.PROJECT_PROFILE.PAGE_TITLE\", {\n sectionName: sectionName,\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n }\n\n ProjectProfileController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n if (!project.i_am_owner) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.pointsList = _.sortBy(project.points, \"order\");\n _this.scope.usStatusList = _.sortBy(project.us_statuses, \"order\");\n _this.scope.taskStatusList = _.sortBy(project.task_statuses, \"order\");\n _this.scope.prioritiesList = _.sortBy(project.priorities, \"order\");\n _this.scope.severitiesList = _.sortBy(project.severities, \"order\");\n _this.scope.issueTypesList = _.sortBy(project.issue_types, \"order\");\n _this.scope.issueStatusList = _.sortBy(project.issue_statuses, \"order\");\n _this.scope.$emit('project:loaded', project);\n return project;\n };\n })(this));\n };\n\n ProjectProfileController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise;\n };\n\n ProjectProfileController.prototype.openDeleteLightbox = function() {\n return this.rootscope.$broadcast(\"deletelightbox:new\", this.scope.project);\n };\n\n return ProjectProfileController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"ProjectProfileController\", ProjectProfileController);\n\n ProjectProfileDirective = function($repo, $confirm, $loading, $navurls, $location, projectService, currentUserService) {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl, form, submit, submitButton;\n $ctrl = $el.controller();\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.save($scope.project);\n promise.then(function() {\n var newUrl;\n currentLoading.finish();\n $confirm.notify(\"success\");\n newUrl = $navurls.resolve(\"project-admin-project-profile-details\", {\n project: $scope.project.slug\n });\n $location.path(newUrl);\n $ctrl.loadInitialData();\n projectService.fetchProject();\n return currentUserService.loadProjects();\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectProfile\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgNavUrls\", \"$tgLocation\", \"tgProjectService\", \"tgCurrentUserService\", ProjectProfileDirective]);\n\n ProjectDefaultValuesDirective = function($repo, $confirm, $loading) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, submit, submitButton;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.save($scope.project);\n promise.then(function() {\n currentLoading.finish();\n return $confirm.notify(\"success\");\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectDefaultValues\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", ProjectDefaultValuesDirective]);\n\n ProjectModulesDirective = function($repo, $confirm, $loading, projectService) {\n var link;\n link = function($scope, $el, $attrs) {\n var submit;\n submit = (function(_this) {\n return function() {\n var currentLoading, form, promise, target;\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n target = angular.element(\".admin-functionalities .submit-button\");\n currentLoading = $loading().target(target).start();\n promise = $repo.save($scope.project);\n promise.then(function() {\n currentLoading.finish();\n $confirm.notify(\"success\");\n $scope.$emit(\"project:loaded\", $scope.project);\n return projectService.fetchProject();\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n return $confirm.notify(\"error\", data._error_message);\n });\n };\n })(this);\n $el.on(\"submit\", \"form\", function(event) {\n event.preventDefault();\n return submit();\n });\n $el.on(\"click\", \".admin-functionalities a.button-green\", function(event) {\n event.preventDefault();\n return submit();\n });\n $scope.$watch(\"isVideoconferenceActivated\", function(isVideoconferenceActivated) {\n if (isVideoconferenceActivated) {\n return $el.find(\".videoconference-attributes\").removeClass(\"hidden\");\n } else {\n $el.find(\".videoconference-attributes\").addClass(\"hidden\");\n $scope.project.videoconferences = null;\n return $scope.project.videoconferences_extra_data = \"\";\n }\n });\n return $scope.$watch(\"project\", function(project) {\n if (project.videoconferences != null) {\n return $scope.isVideoconferenceActivated = true;\n } else {\n return $scope.isVideoconferenceActivated = false;\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectModules\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"tgProjectService\", ProjectModulesDirective]);\n\n ProjectExportDirective = function($window, $rs, $confirm, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var asyn_message, buttonsEl, dump_ready_text, hideButtons, hideResult, hideSpinner, loading_msg, loading_title, resultEl, resultMessageEl, resultTitleEl, setAsyncMessage, setAsyncTitle, setLoadingMessage, setLoadingTitle, setSyncMessage, setSyncTitle, showButtons, showErrorMode, showExportResultAsyncMode, showExportResultSyncMode, showLoadingMode, showResult, showSpinner, spinnerEl, syn_message;\n buttonsEl = $el.find(\".admin-project-export-buttons\");\n showButtons = function() {\n return buttonsEl.removeClass(\"hidden\");\n };\n hideButtons = function() {\n return buttonsEl.addClass(\"hidden\");\n };\n resultEl = $el.find(\".admin-project-export-result\");\n showResult = function() {\n return resultEl.removeClass(\"hidden\");\n };\n hideResult = function() {\n return resultEl.addClass(\"hidden\");\n };\n spinnerEl = $el.find(\".spin\");\n showSpinner = function() {\n return spinnerEl.removeClass(\"hidden\");\n };\n hideSpinner = function() {\n return spinnerEl.addClass(\"hidden\");\n };\n resultTitleEl = $el.find(\".result-title\");\n loading_title = $translate.instant(\"ADMIN.PROJECT_EXPORT.LOADING_TITLE\");\n loading_msg = $translate.instant(\"ADMIN.PROJECT_EXPORT.LOADING_MESSAGE\");\n dump_ready_text = function() {\n return resultTitleEl.html($translate.instant(\"ADMIN.PROJECT_EXPORT.DUMP_READY\"));\n };\n asyn_message = function() {\n return resultTitleEl.html($translate.instant(\"ADMIN.PROJECT_EXPORT.ASYNC_MESSAGE\"));\n };\n syn_message = function(url) {\n return resultTitleEl.html($translate.instant(\"ADMIN.PROJECT_EXPORT.SYNC_MESSAGE\", {\n url: url\n }));\n };\n setLoadingTitle = function() {\n return resultTitleEl.html(loading_title);\n };\n setAsyncTitle = function() {\n return resultTitleEl.html(loading_msg);\n };\n setSyncTitle = function() {\n return resultTitleEl.html(dump_ready_text);\n };\n resultMessageEl = $el.find(\".result-message \");\n setLoadingMessage = function() {\n return resultMessageEl.html(loading_msg);\n };\n setAsyncMessage = function() {\n return resultMessageEl.html(asyn_message);\n };\n setSyncMessage = function(url) {\n return resultMessageEl.html(syn_message(url));\n };\n showLoadingMode = function() {\n showSpinner();\n setLoadingTitle();\n setLoadingMessage();\n hideButtons();\n return showResult();\n };\n showExportResultAsyncMode = function() {\n hideSpinner();\n setAsyncTitle();\n return setAsyncMessage();\n };\n showExportResultSyncMode = function(url) {\n hideSpinner();\n setSyncTitle();\n return setSyncMessage(url);\n };\n showErrorMode = function() {\n hideSpinner();\n hideResult();\n return showButtons();\n };\n return $el.on(\"click\", \"a.button-export\", debounce(2000, (function(_this) {\n return function(event) {\n var onError, onSuccess;\n event.preventDefault();\n onSuccess = function(result) {\n var dumpUrl;\n if (result.status === 202) {\n return showExportResultAsyncMode();\n } else {\n dumpUrl = result.data.url;\n showExportResultSyncMode(dumpUrl);\n return $window.open(dumpUrl, \"_blank\");\n }\n };\n onError = function(result) {\n var errorMsg, ref;\n showErrorMode();\n errorMsg = $translate.instant(\"ADMIN.PROJECT_EXPORT.ERROR\");\n if (result.status === 429) {\n errorMsg = $translate.instant(\"ADMIN.PROJECT_EXPORT.ERROR_BUSY\");\n } else if ((ref = result.data) != null ? ref._error_message : void 0) {\n errorMsg = $translate.instant(\"ADMIN.PROJECT_EXPORT.ERROR_BUSY\", {\n message: result.data._error_message\n });\n }\n return $confirm.notify(\"error\", errorMsg);\n };\n showLoadingMode();\n return $rs.projects[\"export\"]($scope.projectId).then(onSuccess, onError);\n };\n })(this)));\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectExport\", [\"$window\", \"$tgResources\", \"$tgConfirm\", \"$translate\", ProjectExportDirective]);\n\n CsvExporterController = (function(superClass) {\n extend(CsvExporterController, superClass);\n\n CsvExporterController.$inject = [\"$scope\", \"$rootScope\", \"$tgUrls\", \"$tgConfirm\", \"$tgResources\", \"$translate\"];\n\n function CsvExporterController(scope, rootscope, urls, confirm, rs, translate) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.urls = urls;\n this.confirm = confirm;\n this.rs = rs;\n this.translate = translate;\n this._generateUuid = bind(this._generateUuid, this);\n this.setCsvUuid = bind(this.setCsvUuid, this);\n this.rootscope.$on(\"project:loaded\", this.setCsvUuid);\n this.scope.$watch(\"csvUuid\", (function(_this) {\n return function(value) {\n if (value) {\n return _this.scope.csvUrl = _this.urls.resolveAbsolute(_this.type + \"-csv\", value);\n } else {\n return _this.scope.csvUrl = \"\";\n }\n };\n })(this));\n }\n\n CsvExporterController.prototype.setCsvUuid = function() {\n return this.scope.csvUuid = this.scope.project[this.type + \"_csv_uuid\"];\n };\n\n CsvExporterController.prototype._generateUuid = function(response) {\n var promise;\n if (response == null) {\n response = null;\n }\n promise = this.rs.projects[\"regenerate_\" + this.type + \"_csv_uuid\"](this.scope.projectId);\n promise.then((function(_this) {\n return function(data) {\n var ref;\n return _this.scope.csvUuid = (ref = data.data) != null ? ref.uuid : void 0;\n };\n })(this));\n promise.then(null, (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this));\n promise[\"finally\"](function() {\n if (response) {\n return response.finish();\n }\n });\n return promise;\n };\n\n CsvExporterController.prototype.regenerateUuid = function() {\n var subtitle, title;\n if (this.scope.csvUuid) {\n title = this.translate.instant(\"ADMIN.REPORTS.REGENERATE_TITLE\");\n subtitle = this.translate.instant(\"ADMIN.REPORTS.REGENERATE_SUBTITLE\");\n return this.confirm.ask(title, subtitle).then(this._generateUuid);\n } else {\n return this._generateUuid();\n }\n };\n\n return CsvExporterController;\n\n })(taiga.Controller);\n\n CsvExporterUserstoriesController = (function(superClass) {\n extend(CsvExporterUserstoriesController, superClass);\n\n function CsvExporterUserstoriesController() {\n return CsvExporterUserstoriesController.__super__.constructor.apply(this, arguments);\n }\n\n CsvExporterUserstoriesController.prototype.type = \"userstories\";\n\n return CsvExporterUserstoriesController;\n\n })(CsvExporterController);\n\n CsvExporterTasksController = (function(superClass) {\n extend(CsvExporterTasksController, superClass);\n\n function CsvExporterTasksController() {\n return CsvExporterTasksController.__super__.constructor.apply(this, arguments);\n }\n\n CsvExporterTasksController.prototype.type = \"tasks\";\n\n return CsvExporterTasksController;\n\n })(CsvExporterController);\n\n CsvExporterIssuesController = (function(superClass) {\n extend(CsvExporterIssuesController, superClass);\n\n function CsvExporterIssuesController() {\n return CsvExporterIssuesController.__super__.constructor.apply(this, arguments);\n }\n\n CsvExporterIssuesController.prototype.type = \"issues\";\n\n return CsvExporterIssuesController;\n\n })(CsvExporterController);\n\n module.controller(\"CsvExporterUserstoriesController\", CsvExporterUserstoriesController);\n\n module.controller(\"CsvExporterTasksController\", CsvExporterTasksController);\n\n module.controller(\"CsvExporterIssuesController\", CsvExporterIssuesController);\n\n CsvUsDirective = function($translate) {\n var link;\n link = function($scope) {\n return $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_US\";\n };\n return {\n controller: \"CsvExporterUserstoriesController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgCsvUs\", [\"$translate\", CsvUsDirective]);\n\n CsvTaskDirective = function($translate) {\n var link;\n link = function($scope) {\n return $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_TASK\";\n };\n return {\n controller: \"CsvExporterTasksController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgCsvTask\", [\"$translate\", CsvTaskDirective]);\n\n CsvIssueDirective = function($translate) {\n var link;\n link = function($scope) {\n return $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_ISSUE\";\n };\n return {\n controller: \"CsvExporterIssuesController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgCsvIssue\", [\"$translate\", CsvIssueDirective]);\n\n ProjectLogoDirective = function($auth, $model, $rs, $confirm) {\n var link;\n link = function($scope, $el, $attrs) {\n var onError, onSuccess, showSizeInfo;\n showSizeInfo = function() {\n return $el.find(\".size-info\").addClass(\"active\");\n };\n onSuccess = function(response) {\n var project;\n project = $model.make_model(\"projects\", response.data);\n $scope.project = project;\n $el.find('.loading-overlay').removeClass('active');\n return $confirm.notify('success');\n };\n onError = function(response) {\n if (response.status === 413) {\n showSizeInfo();\n }\n $el.find('.loading-overlay').removeClass('active');\n return $confirm.notify('error', response.data._error_message);\n };\n $el.on(\"click\", \".js-change-logo\", function() {\n return $el.find(\"#logo-field\").click();\n });\n $el.on(\"change\", \"#logo-field\", function(event) {\n if ($scope.logoAttachment) {\n $el.find('.loading-overlay').addClass(\"active\");\n return $rs.projects.changeLogo($scope.project.id, $scope.logoAttachment).then(onSuccess, onError);\n }\n });\n $el.on(\"click\", \"a.js-use-default-logo\", function(event) {\n $el.find('.loading-overlay').addClass(\"active\");\n return $rs.projects.removeLogo($scope.project.id).then(onSuccess, onError);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectLogo\", [\"$tgAuth\", \"$tgModel\", \"$tgResources\", \"$tgConfirm\", ProjectLogoDirective]);\n\n ProjectLogoModelDirective = function($parse) {\n var link;\n link = function($scope, $el, $attrs) {\n var model, modelSetter;\n model = $parse($attrs.tgProjectLogoModel);\n modelSetter = model.assign;\n return $el.bind('change', function() {\n return $scope.$apply(function() {\n return modelSetter($scope, $el[0].files[0]);\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive('tgProjectLogoModel', ['$parse', ProjectLogoModelDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/project-profile.coffee\n */\n\n(function() {\n var ColorSelectionDirective, DATE_TYPE, MULTILINE_TYPE, ProjectCustomAttributesController, ProjectCustomAttributesDirective, ProjectValuesController, ProjectValuesDirective, ProjectValuesSectionController, TEXT_TYPE, TYPE_CHOICES, bindOnce, debounce, groupBy, joinStr, mixOf, module, taiga, toString, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n trim = this.taiga.trim;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaAdmin\");\n\n ProjectValuesSectionController = (function(superClass) {\n extend(ProjectValuesSectionController, superClass);\n\n ProjectValuesSectionController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"$translate\"];\n\n function ProjectValuesSectionController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, appMetaService, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, sectionName, title;\n sectionName = _this.translate.instant(_this.scope.sectionName);\n title = _this.translate.instant(\"ADMIN.PROJECT_VALUES.PAGE_TITLE\", {\n \"sectionName\": sectionName,\n \"projectName\": _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n ProjectValuesSectionController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n if (!project.i_am_owner) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n return project;\n };\n })(this));\n };\n\n ProjectValuesSectionController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise;\n };\n\n return ProjectValuesSectionController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"ProjectValuesSectionController\", ProjectValuesSectionController);\n\n ProjectValuesController = (function(superClass) {\n extend(ProjectValuesController, superClass);\n\n ProjectValuesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\"];\n\n function ProjectValuesController(scope, rootscope, repo, confirm, rs) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.moveValue = bind(this.moveValue, this);\n this.loadValues = bind(this.loadValues, this);\n this.scope.$on(\"admin:project-values:move\", this.moveValue);\n this.rootscope.$on(\"project:loaded\", this.loadValues);\n }\n\n ProjectValuesController.prototype.loadValues = function() {\n return this.rs[this.scope.resource].listValues(this.scope.projectId, this.scope.type).then((function(_this) {\n return function(values) {\n _this.scope.values = values;\n _this.scope.maxValueOrder = _.max(values, \"order\").order;\n return values;\n };\n })(this));\n };\n\n ProjectValuesController.prototype.moveValue = function(ctx, itemValue, itemIndex) {\n var r, values;\n values = this.scope.values;\n r = values.indexOf(itemValue);\n values.splice(r, 1);\n values.splice(itemIndex, 0, itemValue);\n _.each(values, function(value, index) {\n return value.order = index;\n });\n return this.repo.saveAll(values);\n };\n\n return ProjectValuesController;\n\n })(taiga.Controller);\n\n module.controller(\"ProjectValuesController\", ProjectValuesController);\n\n ProjectValuesDirective = function($log, $repo, $confirm, $location, animationFrame, $translate, $rootscope) {\n var link, linkDragAndDrop, linkValue;\n linkDragAndDrop = function($scope, $el, $attrs) {\n var itemEl, newParentScope, oldParentScope, tdom;\n oldParentScope = null;\n newParentScope = null;\n itemEl = null;\n tdom = $el.find(\".sortable\");\n tdom.sortable({\n handle: \".row.table-main.visualization\",\n dropOnEmpty: true,\n connectWith: \".project-values-body\",\n revert: 400,\n axis: \"y\"\n });\n tdom.on(\"sortstop\", function(event, ui) {\n var itemIndex, itemValue;\n itemEl = ui.item;\n itemValue = itemEl.scope().value;\n itemIndex = itemEl.index();\n return $scope.$broadcast(\"admin:project-values:move\", itemValue, itemIndex);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n linkValue = function($scope, $el, $attrs) {\n var $ctrl, cancel, goToBottomList, initializeNewValue, initializeTextTranslations, objName, saveNewValue, saveValue, valueType;\n $ctrl = $el.controller();\n valueType = $attrs.type;\n objName = $attrs.objname;\n initializeNewValue = function() {\n return $scope.newValue = {\n \"name\": \"\",\n \"is_closed\": false,\n \"is_archived\": false\n };\n };\n initializeTextTranslations = function() {\n return $scope.addNewElementText = $translate.instant(\"ADMIN.PROJECT_VALUES_\" + (objName.toUpperCase()) + \".ACTION_ADD\");\n };\n initializeNewValue();\n initializeTextTranslations();\n $rootscope.$on(\"$translateChangeEnd\", function() {\n return $scope.$evalAsync(initializeTextTranslations);\n });\n goToBottomList = (function(_this) {\n return function(focus) {\n var table;\n if (focus == null) {\n focus = false;\n }\n table = $el.find(\".table-main\");\n $(document.body).scrollTop(table.offset().top + table.height());\n if (focus) {\n return $el.find(\".new-value input:visible\").first().focus();\n }\n };\n })(this);\n saveValue = function(target) {\n var form, formEl, promise, value;\n formEl = target.parents(\"form\");\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n value = formEl.scope().value;\n promise = $repo.save(value);\n promise.then((function(_this) {\n return function() {\n var row;\n row = target.parents(\".row.table-main\");\n row.addClass(\"hidden\");\n return row.siblings(\".visualization\").removeClass('hidden');\n };\n })(this));\n return promise.then(null, function(data) {\n return form.setErrors(data);\n });\n };\n saveNewValue = function(target) {\n var form, formEl, promise;\n formEl = target.parents(\"form\");\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n $scope.newValue.project = $scope.project.id;\n $scope.newValue.order = $scope.maxValueOrder ? $scope.maxValueOrder + 1 : 1;\n promise = $repo.create(valueType, $scope.newValue);\n promise.then((function(_this) {\n return function(data) {\n target.addClass(\"hidden\");\n $scope.values.push(data);\n $scope.maxValueOrder = data.order;\n return initializeNewValue();\n };\n })(this));\n return promise.then(null, function(data) {\n return form.setErrors(data);\n });\n };\n cancel = function(target) {\n var formEl, row, value;\n row = target.parents(\".row.table-main\");\n formEl = target.parents(\"form\");\n value = formEl.scope().value;\n return $scope.$apply(function() {\n row.addClass(\"hidden\");\n value.revert();\n return row.siblings(\".visualization\").removeClass('hidden');\n });\n };\n $el.on(\"click\", \".show-add-new\", function(event) {\n event.preventDefault();\n $el.find(\".new-value\").removeClass('hidden');\n return goToBottomList(true);\n });\n $el.on(\"click\", \".add-new\", debounce(2000, function(event) {\n var target;\n event.preventDefault();\n target = $el.find(\".new-value\");\n return saveNewValue(target);\n }));\n $el.on(\"click\", \".delete-new\", function(event) {\n event.preventDefault();\n $el.find(\".new-value\").addClass(\"hidden\");\n return initializeNewValue();\n });\n $el.on(\"click\", \".edit-value\", function(event) {\n var editionRow, row, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n row = target.parents(\".row.table-main\");\n row.addClass(\"hidden\");\n editionRow = row.siblings(\".edition\");\n editionRow.removeClass('hidden');\n return editionRow.find('input:visible').first().focus().select();\n });\n $el.on(\"keyup\", \".edition input\", function(event) {\n var target;\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n return saveValue(target);\n } else if (event.keyCode === 27) {\n target = angular.element(event.currentTarget);\n return cancel(target);\n }\n });\n $el.on(\"keyup\", \".new-value input\", function(event) {\n var target;\n if (event.keyCode === 13) {\n target = $el.find(\".new-value\");\n return saveNewValue(target);\n } else if (event.keyCode === 27) {\n $el.find(\".new-value\").addClass(\"hidden\");\n return initializeNewValue();\n }\n });\n $el.on(\"click\", \".save\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return saveValue(target);\n });\n $el.on(\"click\", \".cancel\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return cancel(target);\n });\n return $el.on(\"click\", \".delete-value\", function(event) {\n var choices, formEl, subtitle, target, text, title, value;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.parents(\"form\");\n value = formEl.scope().value;\n choices = {};\n _.each($scope.values, function(option) {\n if (value.id !== option.id) {\n return choices[option.id] = option.name;\n }\n });\n subtitle = value.name;\n if (_.keys(choices).length === 0) {\n return $confirm.error($translate.instant(\"ADMIN.PROJECT_VALUES.ERROR_DELETE_ALL\"));\n }\n title = $translate.instant(\"ADMIN.COMMON.TITLE_ACTION_DELETE_VALUE\");\n text = $translate.instant(\"ADMIN.PROJECT_VALUES.REPLACEMENT\");\n return $confirm.askChoice(title, subtitle, choices, text).then(function(response) {\n var onError, onSucces;\n onSucces = function() {\n return $ctrl.loadValues()[\"finally\"](function() {\n return response.finish();\n });\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n return $repo.remove(value, {\n \"moveTo\": response.selected\n }).then(onSucces, onError);\n });\n });\n };\n link = function($scope, $el, $attrs) {\n linkDragAndDrop($scope, $el, $attrs);\n linkValue($scope, $el, $attrs);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectValues\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"animationFrame\", \"$translate\", \"$rootScope\", ProjectValuesDirective]);\n\n ColorSelectionDirective = function() {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var $ctrl;\n $ctrl = $el.controller();\n $scope.$watch($attrs.ngModel, function(element) {\n return $scope.color = element.color;\n });\n $el.on(\"click\", \".current-color\", function(event) {\n var body, target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n $el.find(\".select-color\").hide();\n target.siblings(\".select-color\").show();\n body = angular.element(\"body\");\n return body.on(\"click\", (function(_this) {\n return function(event) {\n if (angular.element(event.target).parent(\".select-color\").length === 0) {\n $el.find(\".select-color\").hide();\n return body.unbind(\"click\");\n }\n };\n })(this));\n });\n $el.on(\"click\", \".select-color .color\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n $scope.$apply(function() {\n return $model.$modelValue.color = target.data(\"color\");\n });\n return $el.find(\".select-color\").hide();\n });\n $el.on(\"click\", \".select-color .selected-color\", function(event) {\n event.preventDefault();\n $scope.$apply(function() {\n return $model.$modelValue.color = $scope.color;\n });\n return $el.find(\".select-color\").hide();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgColorSelection\", ColorSelectionDirective);\n\n TEXT_TYPE = \"text\";\n\n MULTILINE_TYPE = \"multiline\";\n\n DATE_TYPE = \"date\";\n\n TYPE_CHOICES = [\n {\n key: TEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT\"\n }, {\n key: MULTILINE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI\"\n }, {\n key: DATE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE\"\n }\n ];\n\n ProjectCustomAttributesController = (function(superClass) {\n extend(ProjectCustomAttributesController, superClass);\n\n ProjectCustomAttributesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"$translate\"];\n\n function ProjectCustomAttributesController(scope, rootscope, repo, rs, params, q, location, navUrls, appMetaService, translate) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.moveCustomAttributes = bind(this.moveCustomAttributes, this);\n this.deleteCustomAttribute = bind(this.deleteCustomAttribute, this);\n this.saveCustomAttribute = bind(this.saveCustomAttribute, this);\n this.createCustomAttribute = bind(this.createCustomAttribute, this);\n this.loadCustomAttributes = bind(this.loadCustomAttributes, this);\n this.scope.TYPE_CHOICES = TYPE_CHOICES;\n this.scope.project = {};\n this.rootscope.$on(\"project:loaded\", (function(_this) {\n return function() {\n var description, sectionName, title;\n _this.loadCustomAttributes();\n sectionName = _this.translate.instant(_this.scope.sectionName);\n title = _this.translate.instant(\"ADMIN.CUSTOM_ATTRIBUTES.PAGE_TITLE\", {\n \"sectionName\": sectionName,\n \"projectName\": _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n }\n\n ProjectCustomAttributesController.prototype.loadCustomAttributes = function() {\n return this.rs.customAttributes[this.scope.type].list(this.scope.projectId).then((function(_this) {\n return function(customAttributes) {\n _this.scope.customAttributes = customAttributes;\n _this.scope.maxOrder = _.max(customAttributes, \"order\").order;\n return customAttributes;\n };\n })(this));\n };\n\n ProjectCustomAttributesController.prototype.createCustomAttribute = function(attrValues) {\n return this.repo.create(\"custom-attributes/\" + this.scope.type, attrValues);\n };\n\n ProjectCustomAttributesController.prototype.saveCustomAttribute = function(attrModel) {\n return this.repo.save(attrModel);\n };\n\n ProjectCustomAttributesController.prototype.deleteCustomAttribute = function(attrModel) {\n return this.repo.remove(attrModel);\n };\n\n ProjectCustomAttributesController.prototype.moveCustomAttributes = function(attrModel, newIndex) {\n var customAttributes, r;\n customAttributes = this.scope.customAttributes;\n r = customAttributes.indexOf(attrModel);\n customAttributes.splice(r, 1);\n customAttributes.splice(newIndex, 0, attrModel);\n _.each(customAttributes, function(val, idx) {\n return val.order = idx;\n });\n return this.repo.saveAll(customAttributes);\n };\n\n return ProjectCustomAttributesController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"ProjectCustomAttributesController\", ProjectCustomAttributesController);\n\n ProjectCustomAttributesDirective = function($log, $confirm, animationFrame, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl, cancelCreate, cancelUpdate, create, deleteCustomAttribute, hideAddButton, hideCancelButton, hideCreateForm, hideEditForm, resetNewAttr, revertChangesInCustomAttribute, showAddButton, showCancelButton, showCreateForm, showEditForm, sortableEl, update;\n $ctrl = $el.controller();\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n sortableEl = $el.find(\".js-sortable\");\n sortableEl.sortable({\n handle: \".js-view-custom-field\",\n dropOnEmpty: true,\n revert: 400,\n axis: \"y\"\n });\n sortableEl.on(\"sortstop\", function(event, ui) {\n var itemAttr, itemEl, itemIndex;\n itemEl = ui.item;\n itemAttr = itemEl.scope().attr;\n itemIndex = itemEl.index();\n return $ctrl.moveCustomAttributes(itemAttr, itemIndex);\n });\n showCreateForm = function() {\n $el.find(\".js-new-custom-field\").removeClass(\"hidden\");\n return $el.find(\".js-new-custom-field input:visible\").first().focus();\n };\n hideCreateForm = function() {\n return $el.find(\".js-new-custom-field\").addClass(\"hidden\");\n };\n showAddButton = function() {\n return $el.find(\".js-add-custom-field-button\").removeClass(\"hidden\");\n };\n hideAddButton = function() {\n return $el.find(\".js-add-custom-field-button\").addClass(\"hidden\");\n };\n showCancelButton = function() {\n return $el.find(\".js-cancel-new-custom-field-button\").removeClass(\"hidden\");\n };\n hideCancelButton = function() {\n return $el.find(\".js-cancel-new-custom-field-button\").addClass(\"hidden\");\n };\n resetNewAttr = function() {\n return $scope.newAttr = {};\n };\n create = function(formEl) {\n var attr, form, onError, onSucces;\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n onSucces = (function(_this) {\n return function() {\n $ctrl.loadCustomAttributes();\n hideCreateForm();\n resetNewAttr();\n return $confirm.notify(\"success\");\n };\n })(this);\n onError = (function(_this) {\n return function(data) {\n return form.setErrors(data);\n };\n })(this);\n attr = $scope.newAttr;\n attr.project = $scope.projectId;\n attr.order = $scope.maxOrder ? $scope.maxOrder + 1 : 1;\n return $ctrl.createCustomAttribute(attr).then(onSucces, onError);\n };\n cancelCreate = function() {\n hideCreateForm();\n return resetNewAttr();\n };\n $scope.$watch(\"customAttributes\", function(customAttributes) {\n if (!customAttributes) {\n return;\n }\n if (customAttributes.length === 0) {\n hideCancelButton();\n hideAddButton();\n return showCreateForm();\n } else {\n hideCreateForm();\n showAddButton();\n return showCancelButton();\n }\n });\n $el.on(\"click\", \".js-add-custom-field-button\", function(event) {\n event.preventDefault();\n return showCreateForm();\n });\n $el.on(\"click\", \".js-create-custom-field-button\", debounce(2000, function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return create(formEl);\n }));\n $el.on(\"click\", \".js-cancel-new-custom-field-button\", function(event) {\n event.preventDefault();\n return cancelCreate();\n });\n $el.on(\"keyup\", \".js-new-custom-field input\", function(event) {\n var formEl, target;\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return create(formEl);\n } else if (event.keyCode === 27) {\n return cancelCreate();\n }\n });\n showEditForm = function(formEl) {\n formEl.find(\".js-view-custom-field\").addClass(\"hidden\");\n formEl.find(\".js-edit-custom-field\").removeClass(\"hidden\");\n return formEl.find(\".js-edit-custom-field input:visible\").first().focus().select();\n };\n hideEditForm = function(formEl) {\n formEl.find(\".js-edit-custom-field\").addClass(\"hidden\");\n return formEl.find(\".js-view-custom-field\").removeClass(\"hidden\");\n };\n revertChangesInCustomAttribute = function(formEl) {\n return $scope.$apply(function() {\n return formEl.scope().attr.revert();\n });\n };\n update = function(formEl) {\n var attr, form, onError, onSucces;\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n onSucces = (function(_this) {\n return function() {\n $ctrl.loadCustomAttributes();\n hideEditForm(formEl);\n return $confirm.notify(\"success\");\n };\n })(this);\n onError = (function(_this) {\n return function(data) {\n return form.setErrors(data);\n };\n })(this);\n attr = formEl.scope().attr;\n return $ctrl.saveCustomAttribute(attr).then(onSucces, onError);\n };\n cancelUpdate = function(formEl) {\n hideEditForm(formEl);\n return revertChangesInCustomAttribute(formEl);\n };\n $el.on(\"click\", \".js-edit-custom-field-button\", function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return showEditForm(formEl);\n });\n $el.on(\"click\", \".js-update-custom-field-button\", debounce(2000, function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return update(formEl);\n }));\n $el.on(\"click\", \".js-cancel-edit-custom-field-button\", function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return cancelUpdate(formEl);\n });\n $el.on(\"keyup\", \".js-edit-custom-field input\", function(event) {\n var formEl, target;\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return update(formEl);\n } else if (event.keyCode === 27) {\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return cancelUpdate(formEl);\n }\n });\n deleteCustomAttribute = function(formEl) {\n var attr, message, text, title;\n attr = formEl.scope().attr;\n message = attr.name;\n title = $translate.instant(\"COMMON.CUSTOM_ATTRIBUTES.DELETE\");\n text = $translate.instant(\"COMMON.CUSTOM_ATTRIBUTES.CONFIRM_DELETE\");\n return $confirm.ask(title, text, message).then(function(response) {\n var onError, onSucces;\n onSucces = function() {\n return $ctrl.loadCustomAttributes()[\"finally\"](function() {\n return response.finish();\n });\n };\n onError = function() {\n return $confirm.notify(\"error\", null, \"We have not been able to delete '\" + message + \"'.\");\n };\n return $ctrl.deleteCustomAttribute(attr).then(onSucces, onError);\n });\n };\n return $el.on(\"click\", \".js-delete-custom-field-button\", debounce(2000, function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return deleteCustomAttribute(formEl);\n }));\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectCustomAttributes\", [\"$log\", \"$tgConfirm\", \"animationFrame\", \"$translate\", ProjectCustomAttributesDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/memberships.coffee\n */\n\n(function() {\n var EditRoleDirective, NewRoleDirective, RolePermissionsDirective, RolesController, RolesDirective, bindMethods, bindOnce, debounce, mixOf, module, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaAdmin\");\n\n RolesController = (function(superClass) {\n extend(RolesController, superClass);\n\n RolesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"$translate\"];\n\n function RolesController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, appMetaService, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this._disableComputable = bind(this._disableComputable, this);\n this._enableComputable = bind(this._enableComputable, this);\n bindMethods(this);\n this.scope.sectionName = \"ADMIN.MENU.PERMISSIONS\";\n this.scope.project = {};\n this.scope.anyComputableRole = true;\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.ROLES.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n RolesController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n if (!project.i_am_owner) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n _this.scope.anyComputableRole = _.some(_.map(project.roles, function(point) {\n return point.computable;\n }));\n return project;\n };\n })(this));\n };\n\n RolesController.prototype.loadRoles = function() {\n return this.rs.roles.list(this.scope.projectId).then((function(_this) {\n return function(roles) {\n var public_permission;\n roles = roles.map(function(role) {\n role.external_user = false;\n return role;\n });\n public_permission = {\n \"name\": _this.translate.instant(\"ADMIN.ROLES.EXTERNAL_USER\"),\n \"permissions\": _this.scope.project.public_permissions,\n \"external_user\": true\n };\n roles.push(public_permission);\n _this.scope.roles = roles;\n _this.scope.role = _this.scope.roles[0];\n return roles;\n };\n })(this));\n };\n\n RolesController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n promise.then((function(_this) {\n return function() {\n return _this.loadRoles();\n };\n })(this));\n return promise;\n };\n\n RolesController.prototype.setRole = function(role) {\n this.scope.role = role;\n return this.scope.$broadcast(\"role:changed\", this.scope.role);\n };\n\n RolesController.prototype[\"delete\"] = function() {\n var choices, i, len, ref, replacement, role, subtitle, title, warning;\n choices = {};\n ref = this.scope.roles;\n for (i = 0, len = ref.length; i < len; i++) {\n role = ref[i];\n if (role.id !== this.scope.role.id) {\n choices[role.id] = role.name;\n }\n }\n if (_.keys(choices).length === 0) {\n return this.confirm.error(this.translate.instant(\"ADMIN.ROLES.ERROR_DELETE_ALL\"));\n }\n title = this.translate.instant(\"ADMIN.ROLES.TITLE_DELETE_ROLE\");\n subtitle = this.scope.role.name;\n replacement = this.translate.instant(\"ADMIN.ROLES.REPLACEMENT_ROLE\");\n warning = this.translate.instant(\"ADMIN.ROLES.WARNING_DELETE_ROLE\");\n return this.confirm.askChoice(title, subtitle, choices, replacement, warning).then((function(_this) {\n return function(response) {\n var onError, onSuccess;\n onSuccess = function() {\n _this.loadProject();\n return _this.loadRoles()[\"finally\"](function() {\n return response.finish();\n });\n };\n onError = function() {\n return _this.confirm.notify('error');\n };\n return _this.repo.remove(_this.scope.role, {\n moveTo: response.selected\n }).then(onSuccess, onError);\n };\n })(this));\n };\n\n RolesController.prototype._enableComputable = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.confirm.notify(\"success\");\n return _this.loadProject();\n };\n })(this);\n onError = (function(_this) {\n return function() {\n _this.confirm.notify(\"error\");\n return _this.scope.role.revert();\n };\n })(this);\n return this.repo.save(this.scope.role).then(onSuccess, onError);\n };\n\n RolesController.prototype._disableComputable = function() {\n var askOnError, askOnSuccess, message, subtitle, title;\n askOnSuccess = (function(_this) {\n return function(response) {\n var onError, onSuccess;\n onSuccess = function() {\n response.finish();\n _this.confirm.notify(\"success\");\n return _this.loadProject();\n };\n onError = function() {\n response.finish();\n _this.confirm.notify(\"error\");\n return _this.scope.role.revert();\n };\n return _this.repo.save(_this.scope.role).then(onSuccess, onError);\n };\n })(this);\n askOnError = (function(_this) {\n return function(response) {\n return _this.scope.role.revert();\n };\n })(this);\n title = this.translate.instant(\"ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_TITLE\");\n subtitle = this.translate.instant(\"ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_SUBTITLE\", {\n roleName: this.scope.role.name\n });\n message = this.translate.instant(\"ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_MESSAGE\");\n return this.confirm.ask(title, subtitle, message).then(askOnSuccess, askOnError);\n };\n\n RolesController.prototype.toggleComputable = debounce(2000, function() {\n if (!this.scope.role.computable) {\n return this._disableComputable();\n } else {\n return this._enableComputable();\n }\n });\n\n return RolesController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"RolesController\", RolesController);\n\n EditRoleDirective = function($repo, $confirm) {\n var link;\n link = function($scope, $el, $attrs) {\n var submit, toggleView;\n toggleView = function() {\n $el.find('.total').toggle();\n return $el.find('.edit-role').toggle();\n };\n submit = function() {\n var promise;\n $scope.role.name = $el.find(\"input\").val();\n promise = $repo.save($scope.role);\n promise.then(function() {\n return $confirm.notify(\"success\");\n });\n promise.then(null, function(data) {\n return $confirm.notify(\"error\");\n });\n return toggleView();\n };\n $el.on(\"click\", \"a.icon-edit\", function() {\n toggleView();\n $el.find(\"input\").focus();\n return $el.find(\"input\").val($scope.role.name);\n });\n $el.on(\"click\", \"a.save\", submit);\n $el.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === 13) {\n return submit();\n } else if (event.keyCode === 27) {\n return toggleView();\n }\n });\n $scope.$on(\"role:changed\", function() {\n if ($el.find('.edit-role').is(\":visible\")) {\n return toggleView();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgEditRole\", [\"$tgRepo\", \"$tgConfirm\", EditRoleDirective]);\n\n RolesDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl;\n $ctrl = $el.controller();\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRoles\", RolesDirective);\n\n NewRoleDirective = function($tgrepo, $confirm) {\n var DEFAULT_PERMISSIONS, link;\n DEFAULT_PERMISSIONS = [\"view_project\", \"view_milestones\", \"view_us\", \"view_tasks\", \"view_issues\"];\n link = function($scope, $el, $attrs) {\n var $ctrl;\n $ctrl = $el.controller();\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n $el.on(\"click\", \"a.add-button\", function(event) {\n event.preventDefault();\n $el.find(\".new\").removeClass(\"hidden\");\n $el.find(\".new\").focus();\n return $el.find(\".add-button\").hide();\n });\n return $el.on(\"keyup\", \".new\", function(event) {\n var newRole, onError, onSuccess, target;\n event.preventDefault();\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n newRole = {\n project: $scope.projectId,\n name: target.val(),\n permissions: DEFAULT_PERMISSIONS,\n order: _.max($scope.roles, function(r) {\n return r.order;\n }).order + 1,\n computable: false\n };\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new\").val('');\n onSuccess = function(role) {\n var insertPosition;\n insertPosition = $scope.roles.length - 1;\n $scope.roles.splice(insertPosition, 0, role);\n $ctrl.setRole(role);\n $el.find(\".add-button\").show();\n return $ctrl.loadProject();\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n return $tgrepo.create(\"roles\", newRole).then(onSuccess, onError);\n } else if (event.keyCode === 27) {\n target = angular.element(event.currentTarget);\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new\").val('');\n return $el.find(\".add-button\").show();\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgNewRole\", [\"$tgRepo\", \"$tgConfirm\", NewRoleDirective]);\n\n RolePermissionsDirective = function($rootscope, $repo, $confirm, $compile) {\n var baseTemplate, categoryTemplate, link, resumeTemplate;\n resumeTemplate = _.template(\"
\\\">
\\n
\\n
<%- category.activePermissions %>/<%- category.permissions.length %>
\\n <% _.each(category.permissions, function(permission) { %>\\n
active<% } %>\\\"\\n title=\\\"{{ '<%- permission.name %>' | translate }}\\\">
\\n <% }) %>\\n
\\n
\");\n categoryTemplate = _.template(\"
\\\">\\n
\\n
\\n
\\n
\\n <% _.each(category.permissions, function(permission) { %>\\n
\\\">\\n \\\">\\n
\\n disabled=\\\"disabled\\\" <% } %>\\n <% if(permission.active) { %> checked=\\\"checked\\\" <% } %>/>\\n
\\n \\n \\n
\\n
\\n <% }) %>\\n
\\n
\\n
\");\n baseTemplate = _.template(\"
\");\n link = function($scope, $el, $attrs) {\n var $ctrl, generateCategoriesFromRole, renderCategory, renderPermissions, renderResume;\n $ctrl = $el.controller();\n generateCategoriesFromRole = function(role) {\n var categories, isPermissionEditable, issuePermissions, milestonePermissions, setActivePermissions, setActivePermissionsPerCategory, taskPermissions, userStoryPermissions, wikiPermissions;\n setActivePermissions = function(permissions) {\n return _.map(permissions, function(x) {\n var ref;\n return _.extend({}, x, {\n active: (ref = x[\"key\"], indexOf.call(role.permissions, ref) >= 0)\n });\n });\n };\n isPermissionEditable = function(permission, role, project) {\n if (role.external_user && !project.is_private && permission.key.indexOf(\"view_\") === 0) {\n return false;\n } else {\n return true;\n }\n };\n setActivePermissionsPerCategory = function(category) {\n return _.map(category, function(cat) {\n cat.permissions = cat.permissions.map(function(permission) {\n permission.editable = isPermissionEditable(permission, role, $scope.project);\n return permission;\n });\n return _.extend({}, cat, {\n activePermissions: _.filter(cat[\"permissions\"], \"active\").length\n });\n });\n };\n categories = [];\n milestonePermissions = [\n {\n key: \"view_milestones\",\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.VIEW_SPRINTS\"\n }, {\n key: \"add_milestone\",\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.ADD_SPRINTS\"\n }, {\n key: \"modify_milestone\",\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.MODIFY_SPRINTS\"\n }, {\n key: \"delete_milestone\",\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.DELETE_SPRINTS\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.NAME\",\n permissions: setActivePermissions(milestonePermissions)\n });\n userStoryPermissions = [\n {\n key: \"view_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.VIEW_USER_STORIES\"\n }, {\n key: \"add_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.ADD_USER_STORIES\"\n }, {\n key: \"modify_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.MODIFY_USER_STORIES\"\n }, {\n key: \"delete_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.DELETE_USER_STORIES\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.NAME\",\n permissions: setActivePermissions(userStoryPermissions)\n });\n taskPermissions = [\n {\n key: \"view_tasks\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.VIEW_TASKS\"\n }, {\n key: \"add_task\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.ADD_TASKS\"\n }, {\n key: \"modify_task\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.MODIFY_TASKS\"\n }, {\n key: \"delete_task\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.DELETE_TASKS\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.NAME\",\n permissions: setActivePermissions(taskPermissions)\n });\n issuePermissions = [\n {\n key: \"view_issues\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.VIEW_ISSUES\"\n }, {\n key: \"add_issue\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.ADD_ISSUES\"\n }, {\n key: \"modify_issue\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.MODIFY_ISSUES\"\n }, {\n key: \"delete_issue\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.DELETE_ISSUES\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.NAME\",\n permissions: setActivePermissions(issuePermissions)\n });\n wikiPermissions = [\n {\n key: \"view_wiki_pages\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_PAGES\"\n }, {\n key: \"add_wiki_page\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_PAGES\"\n }, {\n key: \"modify_wiki_page\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.MODIFY_WIKI_PAGES\"\n }, {\n key: \"delete_wiki_page\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_PAGES\"\n }, {\n key: \"view_wiki_links\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_LINKS\"\n }, {\n key: \"add_wiki_link\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_LINKS\"\n }, {\n key: \"delete_wiki_link\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_LINKS\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.NAME\",\n permissions: setActivePermissions(wikiPermissions)\n });\n return setActivePermissionsPerCategory(categories);\n };\n renderResume = function(element, category) {\n return element.find(\".resume\").html($compile(resumeTemplate({\n category: category\n }))($scope));\n };\n renderCategory = function(category, index) {\n var html;\n html = categoryTemplate({\n category: category,\n index: index\n });\n html = angular.element(html);\n renderResume(html, category);\n return $compile(html)($scope);\n };\n renderPermissions = function() {\n var html;\n $el.off();\n html = baseTemplate();\n _.each(generateCategoriesFromRole($scope.role), function(category, index) {\n return html = angular.element(html).append(renderCategory(category, index));\n });\n $el.html(html);\n $el.on(\"click\", \".resume\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return target.next().toggleClass(\"open\");\n });\n return $el.on(\"change\", \".category-item input\", function(event) {\n var getActivePermissions, onError, onSuccess, target;\n getActivePermissions = function() {\n var activePermissions;\n activePermissions = _.filter($el.find(\".category-item input\"), function(t) {\n return angular.element(t).is(\":checked\");\n });\n activePermissions = _.sortBy(_.map(activePermissions, function(t) {\n var permission;\n return permission = angular.element(t).parents(\".category-item\").data(\"id\");\n }));\n if (activePermissions.length) {\n activePermissions.push(\"view_project\");\n }\n return activePermissions;\n };\n target = angular.element(event.currentTarget);\n $scope.role.permissions = getActivePermissions();\n onSuccess = function() {\n var categories, categoryId;\n categories = generateCategoriesFromRole($scope.role);\n categoryId = target.parents(\".category-config\").data(\"id\");\n renderResume(target.parents(\".category-config\"), categories[categoryId]);\n $rootscope.$broadcast(\"projects:reload\");\n $confirm.notify(\"success\");\n return $ctrl.loadProject();\n };\n onError = function() {\n $confirm.notify(\"error\");\n target.prop(\"checked\", !target.prop(\"checked\"));\n return $scope.role.permissions = getActivePermissions();\n };\n if ($scope.role.external_user) {\n $scope.project.public_permissions = $scope.role.permissions;\n $scope.project.anon_permissions = $scope.role.permissions.filter(function(permission) {\n return permission.indexOf(\"view_\") === 0;\n });\n return $repo.save($scope.project).then(onSuccess, onError);\n } else {\n return $repo.save($scope.role).then(onSuccess, onError);\n }\n });\n };\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n $scope.$on(\"role:changed\", function() {\n return renderPermissions();\n });\n return bindOnce($scope, $attrs.ngModel, renderPermissions);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRolePermissions\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$compile\", RolePermissionsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/third-parties.coffee\n */\n\n(function() {\n var BitbucketController, BitbucketWebhooksDirective, GithubController, GithubWebhooksDirective, GitlabController, GitlabWebhooksDirective, NewWebhookDirective, SelectInputText, ValidOriginIpsDirective, WebhookDirective, WebhooksController, bindMethods, debounce, mixOf, module, taiga, timeout,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n bindMethods = this.taiga.bindMethods;\n\n debounce = this.taiga.debounce;\n\n timeout = this.taiga.timeout;\n\n module = angular.module(\"taigaAdmin\");\n\n WebhooksController = (function(superClass) {\n extend(WebhooksController, superClass);\n\n WebhooksController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"$translate\"];\n\n function WebhooksController(scope, repo, rs, params, location, navUrls, appMetaService, translate) {\n var promise;\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n bindMethods(this);\n this.scope.sectionName = \"ADMIN.WEBHOOKS.SECTION_NAME\";\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.WEBHOOKS.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"webhooks:reload\", this.loadWebhooks);\n }\n\n WebhooksController.prototype.loadWebhooks = function() {\n return this.rs.webhooks.list(this.scope.projectId).then((function(_this) {\n return function(webhooks) {\n return _this.scope.webhooks = webhooks;\n };\n })(this));\n };\n\n WebhooksController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n if (!project.i_am_owner) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n return project;\n };\n })(this));\n };\n\n WebhooksController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n promise.then((function(_this) {\n return function() {\n return _this.loadWebhooks();\n };\n })(this));\n return promise;\n };\n\n return WebhooksController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"WebhooksController\", WebhooksController);\n\n WebhookDirective = function($rs, $repo, $confirm, $loading, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var cancel, openHistory, save, showEditMode, showVisualizationMode, updateLogs, updateShowHideHistoryText, webhook;\n webhook = $scope.$eval($attrs.tgWebhook);\n updateLogs = function() {\n var prettyDate;\n prettyDate = $translate.instant(\"ADMIN.WEBHOOKS.DATE\");\n return $rs.webhooklogs.list(webhook.id).then((function(_this) {\n return function(webhooklogs) {\n var i, len, log, ref;\n for (i = 0, len = webhooklogs.length; i < len; i++) {\n log = webhooklogs[i];\n log.validStatus = (200 <= (ref = log.status) && ref < 300);\n log.prettySentHeaders = _.map(_.pairs(log.request_headers), function(arg) {\n var header, value;\n header = arg[0], value = arg[1];\n return header + \": \" + value;\n }).join(\"\\n\");\n log.prettySentData = JSON.stringify(log.request_data);\n log.prettyDate = moment(log.created).format(prettyDate);\n }\n webhook.logs_counter = webhooklogs.length;\n webhook.logs = webhooklogs;\n return updateShowHideHistoryText();\n };\n })(this));\n };\n updateShowHideHistoryText = function() {\n var historyElement, text, textElement, title;\n textElement = $el.find(\".toggle-history\");\n historyElement = textElement.parents(\".single-webhook-wrapper\").find(\".webhooks-history\");\n if (historyElement.hasClass(\"open\")) {\n text = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_HIDE_HISTORY\");\n title = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_HIDE_HISTORY_TITLE\");\n } else {\n text = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_SHOW_HISTORY\");\n title = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_SHOW_HISTORY_TITLE\");\n }\n textElement.text(text);\n return textElement.prop(\"title\", title);\n };\n showVisualizationMode = function() {\n $el.find(\".edition-mode\").addClass(\"hidden\");\n return $el.find(\".visualization-mode\").removeClass(\"hidden\");\n };\n showEditMode = function() {\n $el.find(\".visualization-mode\").addClass(\"hidden\");\n return $el.find(\".edition-mode\").removeClass(\"hidden\");\n };\n openHistory = function() {\n return $el.find(\".webhooks-history\").addClass(\"open\");\n };\n cancel = function() {\n showVisualizationMode();\n return $scope.$apply(function() {\n return webhook.revert();\n });\n };\n save = debounce(2000, function(target) {\n var form, promise;\n form = target.parents(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n promise = $repo.save(webhook);\n promise.then((function(_this) {\n return function() {\n return showVisualizationMode();\n };\n })(this));\n return promise.then(null, function(data) {\n $confirm.notify(\"error\");\n return form.setErrors(data);\n });\n });\n $el.on(\"click\", \".test-webhook\", function() {\n openHistory();\n return $rs.webhooks.test(webhook.id).then((function(_this) {\n return function() {\n return updateLogs();\n };\n })(this));\n });\n $el.on(\"click\", \".edit-webhook\", function() {\n return showEditMode();\n });\n $el.on(\"click\", \".cancel-existing\", function() {\n return cancel();\n });\n $el.on(\"click\", \".edit-existing\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return save(target);\n });\n $el.on(\"keyup\", \".edition-mode input\", function(event) {\n var target;\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n return save(target);\n } else if (event.keyCode === 27) {\n target = angular.element(event.currentTarget);\n return cancel(target);\n }\n });\n $el.on(\"click\", \".delete-webhook\", function() {\n var message, title;\n title = $translate.instant(\"ADMIN.WEBHOOKS.DELETE\");\n message = $translate.instant(\"ADMIN.WEBHOOKS.WEBHOOK_NAME\", {\n name: webhook.name\n });\n return $confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var onError, onSucces;\n onSucces = function() {\n askResponse.finish();\n return $scope.$emit(\"webhooks:reload\");\n };\n onError = function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n };\n return $repo.remove(webhook).then(onSucces, onError);\n };\n })(this));\n });\n $el.on(\"click\", \".toggle-history\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n if ((webhook.logs == null) || webhook.logs.length === 0) {\n return updateLogs().then(function() {\n return timeout(0, function() {\n $el.find(\".webhooks-history\").toggleClass(\"open\");\n return updateShowHideHistoryText();\n });\n });\n } else {\n $el.find(\".webhooks-history\").toggleClass(\"open\");\n return $scope.$apply(function() {\n return updateShowHideHistoryText();\n });\n }\n });\n $el.on(\"click\", \".history-single\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n target.toggleClass(\"history-single-open\");\n return target.siblings(\".history-single-response\").toggleClass(\"open\");\n });\n return $el.on(\"click\", \".resend-request\", function(event) {\n var log, target;\n target = angular.element(event.currentTarget);\n log = target.data(\"log\");\n return $rs.webhooklogs.resend(log).then((function(_this) {\n return function() {\n return updateLogs();\n };\n })(this));\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgWebhook\", [\"$tgResources\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$translate\", WebhookDirective]);\n\n NewWebhookDirective = function($rs, $repo, $confirm, $loading) {\n var link;\n link = function($scope, $el, $attrs) {\n var addWebhookDOMNode, formDOMNode, initializeNewValue, save, webhook;\n webhook = $scope.$eval($attrs.tgWebhook);\n formDOMNode = $el.find(\".new-webhook-form\");\n addWebhookDOMNode = $el.find(\".add-webhook\");\n initializeNewValue = function() {\n return $scope.newValue = {\n \"name\": \"\",\n \"url\": \"\",\n \"key\": \"\"\n };\n };\n initializeNewValue();\n $scope.$watch(\"webhooks\", function(webhooks) {\n if (webhooks != null) {\n if (webhooks.length === 0) {\n formDOMNode.removeClass(\"hidden\");\n addWebhookDOMNode.addClass(\"hidden\");\n return formDOMNode.find(\"input\")[0].focus();\n } else {\n formDOMNode.addClass(\"hidden\");\n return addWebhookDOMNode.removeClass(\"hidden\");\n }\n }\n });\n save = debounce(2000, function() {\n var form, promise;\n form = formDOMNode.checksley();\n if (!form.validate()) {\n return;\n }\n $scope.newValue.project = $scope.project.id;\n promise = $repo.create(\"webhooks\", $scope.newValue);\n promise.then((function(_this) {\n return function() {\n $scope.$emit(\"webhooks:reload\");\n return initializeNewValue();\n };\n })(this));\n return promise.then(null, function(data) {\n $confirm.notify(\"error\");\n return form.setErrors(data);\n });\n });\n formDOMNode.on(\"click\", \".add-new\", function(event) {\n event.preventDefault();\n return save();\n });\n formDOMNode.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === 13) {\n return save();\n }\n });\n formDOMNode.on(\"click\", \".cancel-new\", function(event) {\n return $scope.$apply(function() {\n return initializeNewValue();\n });\n });\n return addWebhookDOMNode.on(\"click\", function(event) {\n formDOMNode.removeClass(\"hidden\");\n return formDOMNode.find(\"input\")[0].focus();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgNewWebhook\", [\"$tgResources\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", NewWebhookDirective]);\n\n GithubController = (function(superClass) {\n extend(GithubController, superClass);\n\n GithubController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"tgAppMetaService\", \"$translate\"];\n\n function GithubController(scope, repo, rs, params, appMetaService, translate) {\n var promise;\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.appMetaService = appMetaService;\n this.translate = translate;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"ADMIN.GITHUB.SECTION_NAME\");\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.GITHUB.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n GithubController.prototype.loadModules = function() {\n return this.rs.modules.list(this.scope.projectId, \"github\").then((function(_this) {\n return function(github) {\n return _this.scope.github = github;\n };\n })(this));\n };\n\n GithubController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n return project;\n };\n })(this));\n };\n\n GithubController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n promise.then((function(_this) {\n return function() {\n return _this.loadModules();\n };\n })(this));\n return promise;\n };\n\n return GithubController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"GithubController\", GithubController);\n\n GitlabController = (function(superClass) {\n extend(GitlabController, superClass);\n\n GitlabController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"tgAppMetaService\", \"$translate\"];\n\n function GitlabController(scope, repo, rs, params, appMetaService, translate) {\n var promise;\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.appMetaService = appMetaService;\n this.translate = translate;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"ADMIN.GITLAB.SECTION_NAME\");\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.GITLAB.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"project:modules:reload\", (function(_this) {\n return function() {\n return _this.loadModules();\n };\n })(this));\n }\n\n GitlabController.prototype.loadModules = function() {\n return this.rs.modules.list(this.scope.projectId, \"gitlab\").then((function(_this) {\n return function(gitlab) {\n return _this.scope.gitlab = gitlab;\n };\n })(this));\n };\n\n GitlabController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n return project;\n };\n })(this));\n };\n\n GitlabController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n promise.then((function(_this) {\n return function() {\n return _this.loadModules();\n };\n })(this));\n return promise;\n };\n\n return GitlabController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"GitlabController\", GitlabController);\n\n BitbucketController = (function(superClass) {\n extend(BitbucketController, superClass);\n\n BitbucketController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"tgAppMetaService\", \"$translate\"];\n\n function BitbucketController(scope, repo, rs, params, appMetaService, translate) {\n var promise;\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.appMetaService = appMetaService;\n this.translate = translate;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"ADMIN.BITBUCKET.SECTION_NAME\");\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.BITBUCKET.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"project:modules:reload\", (function(_this) {\n return function() {\n return _this.loadModules();\n };\n })(this));\n }\n\n BitbucketController.prototype.loadModules = function() {\n return this.rs.modules.list(this.scope.projectId, \"bitbucket\").then((function(_this) {\n return function(bitbucket) {\n return _this.scope.bitbucket = bitbucket;\n };\n })(this));\n };\n\n BitbucketController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n return project;\n };\n })(this));\n };\n\n BitbucketController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n promise.then((function(_this) {\n return function() {\n return _this.loadModules();\n };\n })(this));\n return promise;\n };\n\n return BitbucketController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"BitbucketController\", BitbucketController);\n\n SelectInputText = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $el.on(\"click\", \".select-input-content\", function() {\n $el.find(\"input\").select();\n return $el.find(\".help-copy\").addClass(\"visible\");\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgSelectInputText\", SelectInputText);\n\n GithubWebhooksDirective = function($repo, $confirm, $loading) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, submit, submitButton;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.saveAttribute($scope.github, \"github\");\n promise.then(function() {\n currentLoading.finish();\n return $confirm.notify(\"success\");\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgGithubWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", GithubWebhooksDirective]);\n\n GitlabWebhooksDirective = function($repo, $confirm, $loading) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, submit, submitButton;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.saveAttribute($scope.gitlab, \"gitlab\");\n promise.then(function() {\n currentLoading.finish();\n $confirm.notify(\"success\");\n return $scope.$emit(\"project:modules:reload\");\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgGitlabWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", GitlabWebhooksDirective]);\n\n BitbucketWebhooksDirective = function($repo, $confirm, $loading) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, submit, submitButton;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.saveAttribute($scope.bitbucket, \"bitbucket\");\n promise.then(function() {\n currentLoading.finish();\n $confirm.notify(\"success\");\n return $scope.$emit(\"project:modules:reload\");\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBitbucketWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", BitbucketWebhooksDirective]);\n\n ValidOriginIpsDirective = function() {\n var link;\n link = function($scope, $el, $attrs, $ngModel) {\n return $ngModel.$parsers.push(function(value) {\n value = $.trim(value);\n if (value === \"\") {\n return [];\n }\n return value.split(\",\");\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgValidOriginIps\", ValidOriginIpsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/attachments.coffee\n */\n\n(function() {\n var CreateProject, DeleteProjectDirective, bindOnce, debounce, module, taiga, timeout;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n timeout = this.taiga.timeout;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaProject\");\n\n CreateProject = function($rootscope, $repo, $confirm, $location, $navurls, $rs, $projectUrl, $loading, lightboxService, $cacheFactory, $translate, currentUserService) {\n var directive, link;\n link = function($scope, $el, attrs) {\n var currentLoading, form, onErrorSubmit, onSuccessSubmit, openLightbox, submit, submitButton;\n $scope.data = {};\n $scope.templates = [];\n currentLoading = null;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n onSuccessSubmit = function(response) {\n $cacheFactory.get('$http').removeAll();\n currentLoading.finish();\n $rootscope.$broadcast(\"projects:reload\");\n $confirm.notify(\"success\", $translate.instant(\"COMMON.SAVE\"));\n $location.url($projectUrl.get(response));\n lightboxService.close($el);\n return currentUserService.loadProjects();\n };\n onErrorSubmit = function(response) {\n var error_field, error_step, i, len, ref, selectors;\n currentLoading.finish();\n form.setErrors(response);\n selectors = [];\n ref = _.keys(response);\n for (i = 0, len = ref.length; i < len; i++) {\n error_field = ref[i];\n selectors.push(\"[name=\" + error_field + \"]\");\n }\n $el.find(\".active\").removeClass(\"active\");\n error_step = $el.find(selectors.join(\",\")).first().parents(\".wizard-step\");\n error_step.addClass(\"active\");\n return $el.find('.progress-bar').removeClass().addClass('progress-bar').addClass(error_step.data(\"step\"));\n };\n submit = (function(_this) {\n return function(event) {\n var promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.create(\"projects\", $scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n })(this);\n openLightbox = function() {\n $scope.data = {};\n if (!$scope.templates.length) {\n $rs.projects.templates().then((function(_this) {\n return function(result) {\n $scope.templates = result;\n return $scope.data.creation_template = _.head(_.filter($scope.templates, function(x) {\n return x.slug === \"scrum\";\n })).id;\n };\n })(this));\n } else {\n $scope.data.creation_template = _.head(_.filter($scope.templates, function(x) {\n return x.slug === \"scrum\";\n })).id;\n }\n $el.find(\".active\").removeClass(\"active\");\n $el.find(\".create-step1\").addClass(\"active\");\n lightboxService.open($el);\n return timeout(600, function() {\n return $el.find(\".progress-bar\").addClass('step1');\n });\n };\n $el.on(\"click\", \".button-next\", function(event) {\n var current, field, i, len, next, ref, step, valid;\n event.preventDefault();\n current = $el.find(\".active\");\n valid = true;\n ref = form.fields;\n for (i = 0, len = ref.length; i < len; i++) {\n field = ref[i];\n if (current.find(\"[name=\" + (field.element.attr('name')) + \"]\").length) {\n valid = field.validate() !== false && valid;\n }\n }\n if (!valid) {\n return;\n }\n next = current.next();\n current.toggleClass('active');\n next.toggleClass('active');\n step = next.data('step');\n return $el.find('.progress-bar').removeClass().addClass('progress-bar').addClass(step);\n });\n $el.on(\"click\", \".button-prev\", function(event) {\n var current, prev, step;\n event.preventDefault();\n current = $el.find(\".active\");\n prev = current.prev();\n current.toggleClass('active');\n prev.toggleClass('active');\n step = prev.data('step');\n return $el.find('.progress-bar').removeClass().addClass('progress-bar').addClass(step);\n });\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n return lightboxService.close($el);\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return openLightbox();\n };\n directive = {\n link: link,\n templateUrl: \"project/wizard-create-project.html\",\n scope: {}\n };\n return directive;\n };\n\n module.directive(\"tgLbCreateProject\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$location\", \"$tgNavUrls\", \"$tgResources\", \"$projectUrl\", \"$tgLoading\", \"lightboxService\", \"$cacheFactory\", \"$translate\", \"tgCurrentUserService\", CreateProject]);\n\n DeleteProjectDirective = function($repo, $rootscope, $auth, $location, $navUrls, $confirm, lightboxService, tgLoader, currentUserService) {\n var link;\n link = function($scope, $el, $attrs) {\n var projectToDelete, submit;\n projectToDelete = null;\n $scope.$on(\"deletelightbox:new\", function(ctx, project) {\n lightboxService.open($el);\n return projectToDelete = project;\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n submit = function() {\n var promise;\n tgLoader.start();\n lightboxService.close($el);\n promise = $repo.remove(projectToDelete);\n promise.then(function(data) {\n tgLoader.pageLoaded();\n $rootscope.$broadcast(\"projects:reload\");\n $location.path($navUrls.resolve(\"home\"));\n $confirm.notify(\"success\");\n return currentUserService.loadProjects();\n });\n return promise.then(null, function() {\n $confirm.notify(\"error\");\n return lightboxService.close($el);\n });\n };\n $el.on(\"click\", \".button-red\", function(event) {\n event.preventDefault();\n return lightboxService.close($el);\n });\n return $el.on(\"click\", \".button-green\", function(event) {\n event.preventDefault();\n return submit();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbDeleteProject\", [\"$tgRepo\", \"$rootScope\", \"$tgAuth\", \"$tgLocation\", \"$tgNavUrls\", \"$tgConfirm\", \"lightboxService\", \"tgLoader\", \"tgCurrentUserService\", DeleteProjectDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/bind.coffee\n */\n\n(function() {\n var BindHtmlDirective, BindOnceAltDirective, BindOnceBindDirective, BindOnceHrefDirective, BindOnceHtmlDirective, BindOnceRefDirective, BindOnceSrcDirective, BindOnceTitleDirective, BindTitleDirective, bindOnce, module;\n\n bindOnce = this.taiga.bindOnce;\n\n BindOnceBindDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoBind, function(val) {\n return $el.text(val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceHtmlDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoHtml, function(val) {\n return $el.html(val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceRefDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoRef, function(val) {\n return $el.html(\"#\" + val + \" \");\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceSrcDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoSrc, function(val) {\n return $el.attr(\"src\", val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceHrefDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoHref, function(val) {\n return $el.attr(\"href\", val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceAltDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoAlt, function(val) {\n return $el.attr(\"alt\", val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceTitleDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoTitle, function(val) {\n return $el.attr(\"title\", val);\n });\n };\n return {\n link: link\n };\n };\n\n BindTitleDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $scope.$watch($attrs.tgTitleHtml, function(val) {\n if (val != null) {\n return $el.attr(\"title\", val);\n }\n });\n };\n return {\n link: link\n };\n };\n\n BindHtmlDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $scope.$watch($attrs.tgBindHtml, function(val) {\n if (val != null) {\n return $el.html(val);\n }\n });\n };\n return {\n link: link\n };\n };\n\n module = angular.module(\"taigaBase\");\n\n module.directive(\"tgBoBind\", BindOnceBindDirective);\n\n module.directive(\"tgBoHtml\", BindOnceHtmlDirective);\n\n module.directive(\"tgBoRef\", BindOnceRefDirective);\n\n module.directive(\"tgBoSrc\", BindOnceSrcDirective);\n\n module.directive(\"tgBoHref\", BindOnceHrefDirective);\n\n module.directive(\"tgBoAlt\", BindOnceAltDirective);\n\n module.directive(\"tgBoTitle\", BindOnceTitleDirective);\n\n module.directive(\"tgBindTitle\", BindTitleDirective);\n\n module.directive(\"tgBindHtml\", BindHtmlDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/conf.coffee\n */\n\n(function() {\n var ConfigurationService, module;\n\n ConfigurationService = (function() {\n function ConfigurationService() {\n this.config = window.taigaConfig;\n }\n\n ConfigurationService.prototype.get = function(key, defaultValue) {\n if (defaultValue == null) {\n defaultValue = null;\n }\n if (_.has(this.config, key)) {\n return this.config[key];\n }\n return defaultValue;\n };\n\n return ConfigurationService;\n\n })();\n\n module = angular.module(\"taigaBase\");\n\n module.service(\"$tgConfig\", ConfigurationService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/contrib.coffee\n */\n\n(function() {\n var ContribController, module,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n module = angular.module(\"taigaBase\");\n\n ContribController = (function(superClass) {\n extend(ContribController, superClass);\n\n ContribController.$inject = [\"$rootScope\", \"$scope\", \"$routeParams\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\"];\n\n function ContribController(rootScope, scope, params, repo, rs, confirm) {\n var promise;\n this.rootScope = rootScope;\n this.scope = scope;\n this.params = params;\n this.repo = repo;\n this.rs = rs;\n this.confirm = confirm;\n this.scope.currentPlugin = _.first(_.where(this.rootScope.adminPlugins, {\n \"slug\": this.params.plugin\n }));\n this.scope.projectSlug = this.params.pslug;\n promise = this.loadInitialData();\n promise.then(null, (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this));\n }\n\n ContribController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n _this.scope.$broadcast('project:loaded', project);\n return project;\n };\n })(this));\n };\n\n ContribController.prototype.loadInitialData = function() {\n return this.loadProject();\n };\n\n return ContribController;\n\n })(taiga.Controller);\n\n module.controller(\"ContribController\", ContribController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/filters.coffee\n */\n\n(function() {\n var FiltersStorageService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n FiltersStorageService = (function(superClass) {\n extend(FiltersStorageService, superClass);\n\n FiltersStorageService.$inject = [\"$tgStorage\", \"$routeParams\"];\n\n function FiltersStorageService(storage, params) {\n this.storage = storage;\n this.params = params;\n }\n\n FiltersStorageService.prototype.generateHash = function(components) {\n if (components == null) {\n components = [];\n }\n components = _.map(components, function(x) {\n return JSON.stringify(x);\n });\n return hex_sha1(components.join(\":\"));\n };\n\n return FiltersStorageService;\n\n })(taiga.Service);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/http.coffee\n */\n\n(function() {\n var HttpService, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n HttpService = (function(superClass) {\n extend(HttpService, superClass);\n\n HttpService.$inject = [\"$http\", \"$q\", \"$tgStorage\", \"$rootScope\", \"$cacheFactory\", \"$translate\"];\n\n function HttpService(http, q, storage, rootScope, cacheFactory, translate) {\n this.http = http;\n this.q = q;\n this.storage = storage;\n this.rootScope = rootScope;\n this.cacheFactory = cacheFactory;\n this.translate = translate;\n HttpService.__super__.constructor.call(this);\n this.cache = this.cacheFactory(\"httpget\");\n }\n\n HttpService.prototype.headers = function() {\n var headers, lang, token;\n headers = {};\n token = this.storage.get('token');\n if (token) {\n headers[\"Authorization\"] = \"Bearer \" + token;\n }\n lang = this.translate.preferredLanguage();\n if (lang) {\n headers[\"Accept-Language\"] = lang;\n }\n return headers;\n };\n\n HttpService.prototype.request = function(options) {\n options.headers = _.merge({}, options.headers || {}, this.headers());\n return this.http(options);\n };\n\n HttpService.prototype.get = function(url, params, options) {\n options = _.merge({\n method: \"GET\",\n url: url\n }, options);\n if (params) {\n options.params = params;\n }\n options.cache = this.cache;\n return this.request(options)[\"finally\"]((function(_this) {\n return function(data) {\n return _this.cache.removeAll();\n };\n })(this));\n };\n\n HttpService.prototype.post = function(url, data, params, options) {\n options = _.merge({\n method: \"POST\",\n url: url\n }, options);\n if (data) {\n options.data = data;\n }\n if (params) {\n options.params = params;\n }\n return this.request(options);\n };\n\n HttpService.prototype.put = function(url, data, params, options) {\n options = _.merge({\n method: \"PUT\",\n url: url\n }, options);\n if (data) {\n options.data = data;\n }\n if (params) {\n options.params = params;\n }\n return this.request(options);\n };\n\n HttpService.prototype.patch = function(url, data, params, options) {\n options = _.merge({\n method: \"PATCH\",\n url: url\n }, options);\n if (data) {\n options.data = data;\n }\n if (params) {\n options.params = params;\n }\n return this.request(options);\n };\n\n HttpService.prototype[\"delete\"] = function(url, data, params, options) {\n options = _.merge({\n method: \"DELETE\",\n url: url\n }, options);\n if (data) {\n options.data = data;\n }\n if (params) {\n options.params = params;\n }\n return this.request(options);\n };\n\n return HttpService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaBase\");\n\n module.service(\"$tgHttp\", HttpService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/location.coffee\n */\n\n(function() {\n var locationFactory, module;\n\n locationFactory = function($location, $route, $rootscope) {\n $location.noreload = function(scope) {\n var lastRoute, un;\n lastRoute = $route.current;\n un = scope.$on(\"$locationChangeSuccess\", function() {\n $route.current = lastRoute;\n return un();\n });\n return $location;\n };\n $location.isInCurrentRouteParams = function(name, value) {\n var params;\n params = $location.search() || {};\n return params[name] === value;\n };\n return $location;\n };\n\n module = angular.module(\"taigaBase\");\n\n module.factory(\"$tgLocation\", [\"$location\", \"$route\", \"$rootScope\", locationFactory]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/model.coffee\n */\n\n(function() {\n var Model, ModelService, module, provider, taiga,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n Model = (function() {\n function Model(name, data, dataTypes) {\n this._attrs = data;\n this._name = name;\n this._dataTypes = dataTypes;\n this.setAttrs(data);\n this.initialize();\n }\n\n Model.prototype.clone = function() {\n var instance;\n instance = new Model(this._name, this._attrs, this._dataTypes);\n instance._modifiedAttrs = this._modifiedAttrs;\n instance._isModified = this._isModified;\n return instance;\n };\n\n Model.prototype.applyCasts = function() {\n var attrName, castMethod, castName, ref, results;\n ref = this._dataTypes;\n results = [];\n for (attrName in ref) {\n castName = ref[attrName];\n castMethod = service.casts[castName];\n if (!castMethod) {\n continue;\n }\n results.push(this._attrs[attrName] = castMethod(this._attrs[attrName]));\n }\n return results;\n };\n\n Model.prototype.getIdAttrName = function() {\n return \"id\";\n };\n\n Model.prototype.getName = function() {\n return this._name;\n };\n\n Model.prototype.getAttrs = function(patch) {\n if (patch == null) {\n patch = false;\n }\n if (this._attrs.version != null) {\n this._modifiedAttrs.version = this._attrs.version;\n }\n if (patch) {\n return _.extend({}, this._modifiedAttrs);\n }\n return _.extend({}, this._attrs, this._modifiedAttrs);\n };\n\n Model.prototype.setAttrs = function(attrs) {\n this._attrs = attrs;\n this._modifiedAttrs = {};\n this.applyCasts();\n return this._isModified = false;\n };\n\n Model.prototype.setAttr = function(name, value) {\n this._modifiedAttrs[name] = value;\n return this._isModified = true;\n };\n\n Model.prototype.initialize = function() {\n var getter, self, setter;\n self = this;\n getter = function(name) {\n return function() {\n if (typeof name === 'string' && name.substr(0, 2) === \"__\") {\n return self[name];\n }\n if (indexOf.call(_.keys(self._modifiedAttrs), name) < 0) {\n return self._attrs[name];\n }\n return self._modifiedAttrs[name];\n };\n };\n setter = function(name) {\n return function(value) {\n if (typeof name === 'string' && name.substr(0, 2) === \"__\") {\n self[name] = value;\n return;\n }\n if (self._attrs[name] !== value) {\n self._modifiedAttrs[name] = value;\n self._isModified = true;\n } else {\n delete self._modifiedAttrs[name];\n }\n };\n };\n return _.each(this._attrs, function(value, name) {\n var options;\n options = {\n get: getter(name),\n set: setter(name),\n enumerable: true,\n configurable: true\n };\n return Object.defineProperty(self, name, options);\n });\n };\n\n Model.prototype.serialize = function() {\n var data;\n data = {\n \"data\": _.clone(this._attrs),\n \"name\": this._name\n };\n return JSON.stringify(data);\n };\n\n Model.prototype.isModified = function() {\n return this._isModified;\n };\n\n Model.prototype.isAttributeModified = function(attribute) {\n return this._modifiedAttrs[attribute] != null;\n };\n\n Model.prototype.markSaved = function() {\n this._isModified = false;\n this._attrs = this.getAttrs();\n return this._modifiedAttrs = {};\n };\n\n Model.prototype.revert = function() {\n this._modifiedAttrs = {};\n return this._isModified = false;\n };\n\n Model.desSerialize = function(sdata) {\n var ddata, model;\n ddata = JSON.parse(sdata);\n model = new Model(ddata.url, ddata.data);\n return model;\n };\n\n return Model;\n\n })();\n\n taiga = this.taiga;\n\n ModelService = (function(superClass) {\n extend(ModelService, superClass);\n\n ModelService.$inject = [\"$q\", \"$tgUrls\", \"$tgStorage\", \"$tgHttp\"];\n\n function ModelService(q, urls, storage, http) {\n this.q = q;\n this.urls = urls;\n this.storage = storage;\n this.http = http;\n ModelService.__super__.constructor.call(this);\n }\n\n return ModelService;\n\n })(taiga.Service);\n\n provider = function($q, $http, $gmUrls, $gmStorage) {\n var service;\n service = {};\n service.make_model = function(name, data, cls, dataTypes) {\n if (cls == null) {\n cls = Model;\n }\n if (dataTypes == null) {\n dataTypes = {};\n }\n return new cls(name, data, dataTypes);\n };\n service.cls = Model;\n service.casts = {\n int: function(value) {\n return parseInt(value, 10);\n },\n float: function(value) {\n return parseFloat(value, 10);\n }\n };\n return service;\n };\n\n module = angular.module(\"taigaBase\");\n\n module.factory(\"$tgModel\", [\"$q\", \"$http\", \"$tgUrls\", \"$tgStorage\", provider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/navurl.coffee\n */\n\n(function() {\n var NavigationUrlsDirective, NavigationUrlsService, bindOnce, module, taiga, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n trim = this.taiga.trim;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaBase\");\n\n NavigationUrlsService = (function(superClass) {\n extend(NavigationUrlsService, superClass);\n\n function NavigationUrlsService() {\n this.urls = {};\n }\n\n NavigationUrlsService.prototype.update = function(urls) {\n return this.urls = _.merge({}, this.urls, urls || {});\n };\n\n NavigationUrlsService.prototype.formatUrl = function(url, ctx) {\n var replacer;\n if (ctx == null) {\n ctx = {};\n }\n replacer = function(match) {\n match = trim(match, \":\");\n return ctx[match] || \"undefined\";\n };\n return url.replace(/(:\\w+)/g, replacer);\n };\n\n NavigationUrlsService.prototype.resolve = function(name, ctx) {\n var url;\n url = this.urls[name];\n if (!url) {\n return \"\";\n }\n if (ctx) {\n return this.formatUrl(url, ctx);\n }\n return url;\n };\n\n return NavigationUrlsService;\n\n })(taiga.Service);\n\n module.service(\"$tgNavUrls\", NavigationUrlsService);\n\n NavigationUrlsDirective = function($navurls, $auth, $q, $location) {\n var bindOnceP, link, parseNav;\n bindOnceP = function($scope, attr) {\n var defered;\n defered = $q.defer();\n bindOnce($scope, attr, function(v) {\n return defered.resolve(v);\n });\n return defered.promise;\n };\n parseNav = function(data, $scope) {\n var index, name, obj, params, promises, ref, result, values;\n ref = _.map(data.split(\":\"), trim), name = ref[0], params = ref[1];\n if (params) {\n result = params.split(/(\\w+)=/);\n result = _.filter(result, function(str) {\n return str.length;\n });\n result = _.map(result, function(str) {\n return trim(str.replace(/,$/g, ''));\n });\n params = [];\n index = 0;\n while (index < result.length) {\n obj = {};\n obj[result[index]] = result[index + 1];\n params.push(obj);\n index = index + 2;\n }\n } else {\n params = [];\n }\n values = _.map(params, function(param) {\n return _.values(param)[0];\n });\n promises = _.map(values, function(x) {\n return bindOnceP($scope, x);\n });\n return $q.all(promises).then(function() {\n var i, key, len, options, param, value;\n options = {};\n for (i = 0, len = params.length; i < len; i++) {\n param = params[i];\n key = Object.keys(param)[0];\n value = param[key];\n options[key] = $scope.$eval(value);\n }\n return [name, options];\n });\n };\n link = function($scope, $el, $attrs) {\n if ($el.is(\"a\")) {\n $el.attr(\"href\", \"#\");\n }\n $el.on(\"mouseenter\", function(event) {\n var target;\n target = $(event.currentTarget);\n if (!target.data(\"fullUrl\") || $attrs.tgNavGetParams !== target.data(\"params\")) {\n return parseNav($attrs.tgNav, $scope).then(function(result) {\n var fullUrl, getURLParams, getURLParamsStr, name, options, url, user;\n name = result[0], options = result[1];\n user = $auth.getUser();\n if (user) {\n options.user = user.username;\n }\n url = $navurls.resolve(name);\n fullUrl = $navurls.formatUrl(url, options);\n if ($attrs.tgNavGetParams) {\n getURLParams = JSON.parse($attrs.tgNavGetParams);\n getURLParamsStr = $.param(getURLParams);\n fullUrl = fullUrl + \"?\" + getURLParamsStr;\n target.data(\"params\", $attrs.tgNavGetParams);\n }\n target.data(\"fullUrl\", fullUrl);\n if (target.is(\"a\")) {\n target.attr(\"href\", fullUrl);\n }\n return $el.on(\"click\", function(event) {\n if (event.metaKey || event.ctrlKey) {\n return;\n }\n event.preventDefault();\n target = $(event.currentTarget);\n if (target.hasClass('noclick')) {\n return;\n }\n fullUrl = target.data(\"fullUrl\");\n switch (event.which) {\n case 1:\n $location.url(fullUrl);\n return $scope.$apply();\n case 2:\n return window.open(fullUrl);\n }\n });\n });\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgNav\", [\"$tgNavUrls\", \"$tgAuth\", \"$q\", \"$tgLocation\", NavigationUrlsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/repository.coffee\n */\n\n(function() {\n var RepositoryService, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n RepositoryService = (function(superClass) {\n extend(RepositoryService, superClass);\n\n RepositoryService.$inject = [\"$q\", \"$tgModel\", \"$tgStorage\", \"$tgHttp\", \"$tgUrls\"];\n\n function RepositoryService(q, model1, storage, http, urls) {\n this.q = q;\n this.model = model1;\n this.storage = storage;\n this.http = http;\n this.urls = urls;\n RepositoryService.__super__.constructor.call(this);\n }\n\n RepositoryService.prototype.resolveUrlForModel = function(model) {\n var idAttrName;\n idAttrName = model.getIdAttrName();\n return (this.urls.resolve(model.getName())) + \"/\" + model[idAttrName];\n };\n\n RepositoryService.prototype.resolveUrlForAttributeModel = function(model) {\n return this.urls.resolve(model.getName(), model.parent);\n };\n\n RepositoryService.prototype.create = function(name, data, dataTypes, extraParams) {\n var defered, promise, url;\n if (dataTypes == null) {\n dataTypes = {};\n }\n if (extraParams == null) {\n extraParams = {};\n }\n defered = this.q.defer();\n url = this.urls.resolve(name);\n promise = this.http.post(url, JSON.stringify(data));\n promise.success((function(_this) {\n return function(_data, _status) {\n return defered.resolve(_this.model.make_model(name, _data, null, dataTypes));\n };\n })(this));\n promise.error((function(_this) {\n return function(data, status) {\n return defered.reject(data);\n };\n })(this));\n return defered.promise;\n };\n\n RepositoryService.prototype.remove = function(model, params) {\n var defered, promise, url;\n if (params == null) {\n params = {};\n }\n defered = this.q.defer();\n url = this.resolveUrlForModel(model);\n promise = this.http[\"delete\"](url, {}, params);\n promise.success(function(data, status) {\n return defered.resolve(model);\n });\n promise.error(function(data, status) {\n return defered.reject(model);\n });\n return defered.promise;\n };\n\n RepositoryService.prototype.saveAll = function(models, patch) {\n var promises;\n if (patch == null) {\n patch = true;\n }\n promises = _.map(models, (function(_this) {\n return function(x) {\n return _this.save(x, true);\n };\n })(this));\n return this.q.all(promises);\n };\n\n RepositoryService.prototype.save = function(model, patch) {\n var data, defered, promise, url;\n if (patch == null) {\n patch = true;\n }\n defered = this.q.defer();\n if (!model.isModified() && patch) {\n defered.resolve(model);\n return defered.promise;\n }\n url = this.resolveUrlForModel(model);\n data = JSON.stringify(model.getAttrs(patch));\n if (patch) {\n promise = this.http.patch(url, data);\n } else {\n promise = this.http.put(url, data);\n }\n promise.success((function(_this) {\n return function(data, status) {\n model._isModified = false;\n model._attrs = _.extend(model.getAttrs(), data);\n model._modifiedAttrs = {};\n model.applyCasts();\n return defered.resolve(model);\n };\n })(this));\n promise.error(function(data, status) {\n return defered.reject(data);\n });\n return defered.promise;\n };\n\n RepositoryService.prototype.saveAttribute = function(model, attribute, patch) {\n var data, defered, promise, url;\n if (patch == null) {\n patch = true;\n }\n defered = this.q.defer();\n if (!model.isModified() && patch) {\n defered.resolve(model);\n return defered.promise;\n }\n url = this.resolveUrlForAttributeModel(model);\n data = {};\n data[attribute] = model.getAttrs();\n if (patch) {\n promise = this.http.patch(url, data);\n } else {\n promise = this.http.put(url, data);\n }\n promise.success((function(_this) {\n return function(data, status) {\n model._isModified = false;\n model._attrs = _.extend(model.getAttrs(), data);\n model._modifiedAttrs = {};\n model.applyCasts();\n return defered.resolve(model);\n };\n })(this));\n promise.error(function(data, status) {\n return defered.reject(data);\n });\n return defered.promise;\n };\n\n RepositoryService.prototype.refresh = function(model) {\n var defered, promise, url;\n defered = this.q.defer();\n url = this.resolveUrlForModel(model);\n promise = this.http.get(url);\n promise.success(function(data, status) {\n model._modifiedAttrs = {};\n model._attrs = data;\n model._isModified = false;\n model.applyCasts();\n return defered.resolve(model);\n });\n promise.error(function(data, status) {\n return defered.reject(data);\n });\n return defered.promise;\n };\n\n RepositoryService.prototype.queryMany = function(name, params, options, headers) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n if (headers == null) {\n headers = false;\n }\n url = this.urls.resolve(name);\n httpOptions = {\n headers: {}\n };\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n var result;\n result = _.map(data.data, function(x) {\n return _this.model.make_model(name, x);\n });\n if (headers) {\n return [result, data.headers];\n }\n return result;\n };\n })(this));\n };\n\n RepositoryService.prototype.queryOneAttribute = function(name, id, attribute, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name, id);\n httpOptions = {\n headers: {}\n };\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n var model;\n model = _this.model.make_model(name, data.data[attribute]);\n model.parent = id;\n return model;\n };\n })(this));\n };\n\n RepositoryService.prototype.queryOne = function(name, id, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name);\n if (id) {\n url = url + \"/\" + id;\n }\n httpOptions = {\n headers: {}\n };\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n return _this.model.make_model(name, data.data);\n };\n })(this));\n };\n\n RepositoryService.prototype.queryOneRaw = function(name, id, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name);\n if (id) {\n url = url + \"/\" + id;\n }\n httpOptions = _.merge({\n headers: {}\n }, options);\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n\n RepositoryService.prototype.queryPaginated = function(name, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name);\n httpOptions = _.merge({\n headers: {}\n }, options);\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n var headers, result;\n headers = data.headers();\n result = {};\n result.models = _.map(data.data, function(x) {\n return _this.model.make_model(name, x);\n });\n result.count = parseInt(headers[\"x-pagination-count\"], 10);\n result.current = parseInt(headers[\"x-pagination-current\"] || 1, 10);\n result.paginatedBy = parseInt(headers[\"x-paginated-by\"], 10);\n return result;\n };\n })(this));\n };\n\n RepositoryService.prototype.queryOnePaginatedRaw = function(name, id, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name);\n if (id) {\n url = url + \"/\" + id;\n }\n httpOptions = _.merge({\n headers: {}\n }, options);\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n var headers, result;\n headers = data.headers();\n result = {};\n result.data = data.data;\n result.count = parseInt(headers[\"x-pagination-count\"], 10);\n result.current = parseInt(headers[\"x-pagination-current\"] || 1, 10);\n result.paginatedBy = parseInt(headers[\"x-paginated-by\"], 10);\n return result;\n };\n })(this));\n };\n\n RepositoryService.prototype.resolve = function(options) {\n var cache, params;\n params = {};\n if (options.pslug != null) {\n params.project = options.pslug;\n }\n if (options.usref != null) {\n params.us = options.usref;\n }\n if (options.taskref != null) {\n params.task = options.taskref;\n }\n if (options.issueref != null) {\n params.issue = options.issueref;\n }\n if (options.sslug != null) {\n params.milestone = options.sslug;\n }\n if (options.wikipage != null) {\n params.wikipage = options.wikipage;\n }\n cache = !(options.wikipage || options.sslug);\n return this.queryOneRaw(\"resolver\", null, params, {\n cache: cache\n });\n };\n\n return RepositoryService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaBase\");\n\n module.service(\"$tgRepo\", RepositoryService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/storage.coffee\n */\n\n(function() {\n var StorageService, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n StorageService = (function(superClass) {\n extend(StorageService, superClass);\n\n StorageService.$inject = [\"$rootScope\"];\n\n function StorageService($rootScope) {\n StorageService.__super__.constructor.call(this);\n }\n\n StorageService.prototype.get = function(key, _default) {\n var serializedValue;\n serializedValue = localStorage.getItem(key);\n if (serializedValue === null) {\n return _default || null;\n }\n return JSON.parse(serializedValue);\n };\n\n StorageService.prototype.set = function(key, val) {\n if (_.isObject(key)) {\n return _.each(key, (function(_this) {\n return function(val, key) {\n return _this.set(key, val);\n };\n })(this));\n } else {\n return localStorage.setItem(key, JSON.stringify(val));\n }\n };\n\n StorageService.prototype.contains = function(key) {\n var value;\n value = this.get(key);\n return value !== null;\n };\n\n StorageService.prototype.remove = function(key) {\n return localStorage.removeItem(key);\n };\n\n StorageService.prototype.clear = function() {\n return localStorage.clear();\n };\n\n return StorageService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaBase\");\n\n module.service(\"$tgStorage\", StorageService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/http.coffee\n */\n\n(function() {\n var UrlsService, format, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n format = function(fmt, obj) {\n obj = _.clone(obj);\n return fmt.replace(/%s/g, function(match) {\n return String(obj.shift());\n });\n };\n\n taiga = this.taiga;\n\n UrlsService = (function(superClass) {\n extend(UrlsService, superClass);\n\n UrlsService.$inject = [\"$tgConfig\"];\n\n function UrlsService(config) {\n this.config = config;\n this.urls = {};\n this.mainUrl = this.config.get(\"api\");\n }\n\n UrlsService.prototype.update = function(urls) {\n return this.urls = _.merge(this.urls, urls);\n };\n\n UrlsService.prototype.resolve = function() {\n var args, name, url;\n args = _.toArray(arguments);\n if (args.length === 0) {\n throw Error(\"wrong arguments to setUrls\");\n }\n name = args.slice(0, 1)[0];\n url = format(this.urls[name], args.slice(1));\n return format(\"%s/%s\", [_.str.rtrim(this.mainUrl, \"/\"), _.str.ltrim(url, \"/\")]);\n };\n\n UrlsService.prototype.resolveAbsolute = function() {\n var url;\n url = this.resolve.apply(this, arguments);\n if (/^https?:\\/\\//i.test(url)) {\n return url;\n }\n if (/^\\//.test(url)) {\n return window.location.protocol + \"//\" + window.location.host + url;\n }\n return window.location.protocol + \"//\" + window.location.host + \"/\" + url;\n };\n\n return UrlsService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaBase\");\n\n module.service('$tgUrls', UrlsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/custom-field-values.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo) {\n var _get, service;\n _get = function(objectId, resource) {\n return $repo.queryOne(resource, objectId);\n };\n service = {\n userstory: {\n get: function(objectId) {\n return _get(objectId, \"custom-attributes-values/userstory\");\n }\n },\n task: {\n get: function(objectId) {\n return _get(objectId, \"custom-attributes-values/task\");\n }\n },\n issue: {\n get: function(objectId) {\n return _get(objectId, \"custom-attributes-values/issue\");\n }\n }\n };\n return function(instance) {\n return instance.customAttributesValues = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgCustomAttributesValuesResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/projects.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($repo) {\n var _list, service;\n _list = function(projectId, resource) {\n return $repo.queryMany(resource, {\n project: projectId\n });\n };\n service = {\n userstory: {\n list: function(projectId) {\n return _list(projectId, \"custom-attributes/userstory\");\n }\n },\n task: {\n list: function(projectId) {\n return _list(projectId, \"custom-attributes/task\");\n }\n },\n issue: {\n list: function(projectId) {\n return _list(projectId, \"custom-attributes/issue\");\n }\n }\n };\n return function(instance) {\n return instance.customAttributes = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgCustomAttributesResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/history.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(type, objectId) {\n return $repo.queryOneRaw(\"history/\" + type, objectId);\n };\n service.deleteComment = function(type, objectId, activityId) {\n var params, url;\n url = $urls.resolve(\"history/\" + type);\n url = url + \"/\" + objectId + \"/delete_comment\";\n params = {\n id: activityId\n };\n return $http.post(url, null, params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n service.undeleteComment = function(type, objectId, activityId) {\n var params, url;\n url = $urls.resolve(\"history/\" + type);\n url = url + \"/\" + objectId + \"/undelete_comment\";\n params = {\n id: activityId\n };\n return $http.post(url, null, params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n return function(instance) {\n return instance.history = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgHistoryResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/projects.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo) {\n var service;\n service = {};\n service.get = function(token) {\n return $repo.queryOne(\"invitations\", token);\n };\n return function(instance) {\n return instance.invitations = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgInvitationsResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/issues.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($repo, $http, $urls, $storage, $q) {\n var filtersHashSuffix, hashSuffix, myFiltersHashSuffix, service;\n service = {};\n hashSuffix = \"issues-queryparams\";\n filtersHashSuffix = \"issues-filters\";\n myFiltersHashSuffix = \"issues-my-filters\";\n service.get = function(projectId, issueId) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n return $repo.queryOne(\"issues\", issueId, params);\n };\n service.getByRef = function(projectId, ref) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params.ref = ref;\n return $repo.queryOne(\"issues\", \"by_ref\", params);\n };\n service.listInAllProjects = function(filters) {\n return $repo.queryMany(\"issues\", filters);\n };\n service.list = function(projectId, filters, options) {\n var params;\n params = {\n project: projectId\n };\n params = _.extend({}, params, filters || {});\n service.storeQueryParams(projectId, params);\n return $repo.queryPaginated(\"issues\", params, options);\n };\n service.bulkCreate = function(projectId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-create-issues\");\n params = {\n project_id: projectId,\n bulk_issues: data\n };\n return $http.post(url, params);\n };\n service.upvote = function(issueId) {\n var url;\n url = $urls.resolve(\"issue-upvote\", issueId);\n return $http.post(url);\n };\n service.downvote = function(issueId) {\n var url;\n url = $urls.resolve(\"issue-downvote\", issueId);\n return $http.post(url);\n };\n service.watch = function(issueId) {\n var url;\n url = $urls.resolve(\"issue-watch\", issueId);\n return $http.post(url);\n };\n service.unwatch = function(issueId) {\n var url;\n url = $urls.resolve(\"issue-unwatch\", issueId);\n return $http.post(url);\n };\n service.stats = function(projectId) {\n return $repo.queryOneRaw(\"projects\", projectId + \"/issues_stats\");\n };\n service.filtersData = function(params) {\n return $repo.queryOneRaw(\"issues-filters\", null, params);\n };\n service.listValues = function(projectId, type) {\n var params;\n params = {\n \"project\": projectId\n };\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(type, params);\n };\n service.storeQueryParams = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getQueryParams = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n service.storeFilters = function(projectSlug, params) {\n var hash, ns;\n ns = projectSlug + \":\" + filtersHashSuffix;\n hash = generateHash([projectSlug, ns]);\n return $storage.set(hash, params);\n };\n service.getFilters = function(projectSlug) {\n var hash, ns;\n ns = projectSlug + \":\" + filtersHashSuffix;\n hash = generateHash([projectSlug, ns]);\n return $storage.get(hash) || {};\n };\n service.storeMyFilters = function(projectId, myFilters) {\n var deferred, hash, ns, promise, url;\n deferred = $q.defer();\n url = $urls.resolve(\"user-storage\");\n ns = projectId + \":\" + myFiltersHashSuffix;\n hash = generateHash([projectId, ns]);\n if (_.isEmpty(myFilters)) {\n promise = $http[\"delete\"](url + \"/\" + hash, {\n key: hash,\n value: myFilters\n });\n promise.then(function() {\n return deferred.resolve();\n });\n promise.then(null, function() {\n return deferred.reject();\n });\n } else {\n promise = $http.put(url + \"/\" + hash, {\n key: hash,\n value: myFilters\n });\n promise.then(function(data) {\n return deferred.resolve();\n });\n promise.then(null, function(data) {\n var innerPromise;\n innerPromise = $http.post(\"\" + url, {\n key: hash,\n value: myFilters\n });\n innerPromise.then(function() {\n return deferred.resolve();\n });\n return innerPromise.then(null, function() {\n return deferred.reject();\n });\n });\n }\n return deferred.promise;\n };\n service.getMyFilters = function(projectId) {\n var deferred, hash, ns, promise, url;\n deferred = $q.defer();\n url = $urls.resolve(\"user-storage\");\n ns = projectId + \":\" + myFiltersHashSuffix;\n hash = generateHash([projectId, ns]);\n promise = $http.get(url + \"/\" + hash);\n promise.then(function(data) {\n return deferred.resolve(data.data.value);\n });\n promise.then(null, function(data) {\n return deferred.resolve({});\n });\n return deferred.promise;\n };\n return function(instance) {\n return instance.issues = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgIssuesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/kanban.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($storage) {\n var hashSuffixStatusColumnModes, hashSuffixStatusViewModes, service;\n service = {};\n hashSuffixStatusViewModes = \"kanban-statusviewmodels\";\n hashSuffixStatusColumnModes = \"kanban-statuscolumnmodels\";\n service.storeStatusViewModes = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusViewModes;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getStatusViewModes = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusViewModes;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n service.storeStatusColumnModes = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusColumnModes;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getStatusColumnModes = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusColumnModes;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n return function(instance) {\n return instance.kanban = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgKanbanResourcesProvider\", [\"$tgStorage\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/locales.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($repo) {\n var service;\n service = {\n list: function() {\n return $repo.queryMany(\"locales\");\n }\n };\n return function(instance) {\n return instance.locales = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgLocalesResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/mdrender.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $urls, $http) {\n var service;\n service = {};\n service.render = function(projectId, content) {\n var params, url;\n if ((content == null) || content === \"\") {\n content = ' ';\n }\n params = {\n project_id: projectId,\n content: content\n };\n url = $urls.resolve(\"wiki\");\n return $http.post(url + \"/render\", params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n return function(instance) {\n return instance.mdrender = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgMdRenderResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/memberships.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(id) {\n return $repo.queryOne(\"memberships\", id);\n };\n service.list = function(projectId, filters, enablePagination) {\n var options, params;\n if (enablePagination == null) {\n enablePagination = true;\n }\n params = {\n project: projectId\n };\n params = _.extend({}, params, filters || {});\n if (enablePagination) {\n return $repo.queryPaginated(\"memberships\", params);\n }\n return $repo.queryMany(\"memberships\", params, options = {\n enablePagination: enablePagination\n });\n };\n service.listByUser = function(userId, filters) {\n var params;\n params = {\n user: userId\n };\n params = _.extend({}, params, filters || {});\n return $repo.queryPaginated(\"memberships\", params);\n };\n service.resendInvitation = function(id) {\n var url;\n url = $urls.resolve(\"memberships\");\n return $http.post(url + \"/\" + id + \"/resend_invitation\", {});\n };\n service.bulkCreateMemberships = function(projectId, data, invitation_extra_text) {\n var params, url;\n url = $urls.resolve(\"bulk-create-memberships\");\n params = {\n project_id: projectId,\n bulk_memberships: data,\n invitation_extra_text: invitation_extra_text\n };\n return $http.post(url, params);\n };\n return function(instance) {\n return instance.memberships = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgMembershipsResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules.coffee\n */\n\n(function() {\n var module, resourceProvider;\n\n resourceProvider = function($repo) {\n var service;\n service = {};\n service.list = function(projectId, module) {\n return $repo.queryOneAttribute(\"project-modules\", projectId, module);\n };\n return function(instance) {\n return instance.modules = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgModulesResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/memberships.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(id) {\n return $repo.queryOne(\"notify-policies\", id);\n };\n service.list = function(filters) {\n var params;\n params = _.extend({}, params, filters || {});\n return $repo.queryMany(\"notify-policies\", params);\n };\n return function(instance) {\n return instance.notifyPolicies = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgNotifyPoliciesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/projects.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($config, $repo, $http, $urls, $auth, $q, $translate) {\n var service;\n service = {};\n service.get = function(projectId) {\n return $repo.queryOne(\"projects\", projectId);\n };\n service.getBySlug = function(projectSlug) {\n return $repo.queryOne(\"projects\", \"by_slug?slug=\" + projectSlug);\n };\n service.list = function() {\n return $repo.queryMany(\"projects\");\n };\n service.listByMember = function(memberId) {\n var params;\n params = {\n \"member\": memberId,\n \"order_by\": \"memberships__user_order\"\n };\n return $repo.queryMany(\"projects\", params);\n };\n service.templates = function() {\n return $repo.queryMany(\"project-templates\");\n };\n service.usersList = function(projectId) {\n var params;\n params = {\n \"project\": projectId\n };\n return $repo.queryMany(\"users\", params);\n };\n service.rolesList = function(projectId) {\n var params;\n params = {\n \"project\": projectId\n };\n return $repo.queryMany(\"roles\", params);\n };\n service.stats = function(projectId) {\n return $repo.queryOneRaw(\"projects\", projectId + \"/stats\");\n };\n service.bulkUpdateOrder = function(bulkData) {\n var url;\n url = $urls.resolve(\"bulk-update-projects-order\");\n return $http.post(url, bulkData);\n };\n service.regenerate_userstories_csv_uuid = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/regenerate_userstories_csv_uuid\";\n return $http.post(url);\n };\n service.regenerate_issues_csv_uuid = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/regenerate_issues_csv_uuid\";\n return $http.post(url);\n };\n service.regenerate_tasks_csv_uuid = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/regenerate_tasks_csv_uuid\";\n return $http.post(url);\n };\n service.leave = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/leave\";\n return $http.post(url);\n };\n service.memberStats = function(projectId) {\n return $repo.queryOneRaw(\"projects\", projectId + \"/member_stats\");\n };\n service.tagsColors = function(projectId) {\n return $repo.queryOne(\"projects\", projectId + \"/tags_colors\");\n };\n service[\"export\"] = function(projectId) {\n var url;\n url = ($urls.resolve(\"exporter\")) + \"/\" + projectId;\n return $http.get(url);\n };\n service[\"import\"] = function(file, statusUpdater) {\n var complete, data, defered, errorMsg, failed, maxFileSize, response, uploadComplete, uploadFailed, uploadProgress, xhr;\n defered = $q.defer();\n maxFileSize = $config.get(\"maxUploadFileSize\", null);\n if (maxFileSize && file.size > maxFileSize) {\n errorMsg = $translate.instant(\"PROJECT.IMPORT.ERROR_MAX_SIZE_EXCEEDED\", {\n fileName: file.name,\n fileSize: sizeFormat(file.size),\n maxFileSize: sizeFormat(maxFileSize)\n });\n response = {\n status: 413,\n data: {\n _error_message: errorMsg\n }\n };\n defered.reject(response);\n return defered.promise;\n }\n uploadProgress = (function(_this) {\n return function(evt) {\n var message, percent;\n percent = Math.round((evt.loaded / evt.total) * 100);\n message = $translate.instant(\"PROJECT.IMPORT.UPLOAD_IN_PROGRESS_MESSAGE\", {\n uploadedSize: sizeFormat(evt.loaded),\n totalSize: sizeFormat(evt.total)\n });\n return statusUpdater(\"in-progress\", null, message, percent);\n };\n })(this);\n uploadComplete = (function(_this) {\n return function(evt) {\n return statusUpdater(\"done\", $translate.instant(\"PROJECT.IMPORT.TITLE\"), $translate.instant(\"PROJECT.IMPORT.DESCRIPTION\"));\n };\n })(this);\n uploadFailed = (function(_this) {\n return function(evt) {\n return statusUpdater(\"error\");\n };\n })(this);\n complete = (function(_this) {\n return function(evt) {\n var error, ref;\n response = {};\n try {\n response.data = JSON.parse(evt.target.responseText);\n } catch (error) {\n response.data = {};\n }\n response.status = evt.target.status;\n if ((ref = response.status) === 201 || ref === 202) {\n defered.resolve(response);\n }\n return defered.reject(response);\n };\n })(this);\n failed = (function(_this) {\n return function(evt) {\n return defered.reject(\"fail\");\n };\n })(this);\n data = new FormData();\n data.append('dump', file);\n xhr = new XMLHttpRequest();\n xhr.upload.addEventListener(\"progress\", uploadProgress, false);\n xhr.upload.addEventListener(\"load\", uploadComplete, false);\n xhr.upload.addEventListener(\"error\", uploadFailed, false);\n xhr.upload.addEventListener(\"abort\", uploadFailed, false);\n xhr.addEventListener(\"load\", complete, false);\n xhr.addEventListener(\"error\", failed, false);\n xhr.open(\"POST\", $urls.resolve(\"importer\"));\n xhr.setRequestHeader(\"Authorization\", \"Bearer \" + ($auth.getToken()));\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send(data);\n return defered.promise;\n };\n service.changeLogo = function(projectId, file) {\n var data, defered, maxFileSize, options, response, url;\n maxFileSize = $config.get(\"maxUploadFileSize\", null);\n if (maxFileSize && file.size > maxFileSize) {\n response = {\n status: 413,\n data: {\n _error_message: \"'\" + file.name + \"' (\" + (sizeFormat(file.size)) + \") is too heavy for our oompa loompas, try it with a smaller than (\" + (sizeFormat(maxFileSize)) + \")\"\n }\n };\n defered = $q.defer();\n defered.reject(response);\n return defered.promise;\n }\n data = new FormData();\n data.append('logo', file);\n options = {\n transformRequest: angular.identity,\n headers: {\n 'Content-Type': void 0\n }\n };\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/change_logo\";\n return $http.post(url, data, {}, options);\n };\n service.removeLogo = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/remove_logo\";\n return $http.post(url);\n };\n return function(instance) {\n return instance.projects = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgProjectsResourcesProvider\", [\"$tgConfig\", \"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgAuth\", \"$q\", \"$translate\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/memberships.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(id) {\n return $repo.queryOne(\"roles\", id);\n };\n service.list = function(projectId) {\n return $repo.queryMany(\"roles\", {\n project: projectId\n });\n };\n return function(instance) {\n return instance.roles = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgRolesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/search.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $urls, $http, $q) {\n var service;\n service = {};\n service[\"do\"] = function(projectId, term) {\n var deferredAbort, params, request, url;\n deferredAbort = $q.defer();\n url = $urls.resolve(\"search\");\n params = {\n url: url,\n method: \"GET\",\n timeout: deferredAbort.promise,\n cancelable: true,\n params: {\n project: projectId,\n text: term,\n get_all: false\n }\n };\n request = $http.request(params).then(function(data) {\n return data.data;\n });\n request.abort = function() {\n return deferredAbort.resolve();\n };\n request[\"finally\"] = function() {\n request.abort = angular.noop;\n return deferredAbort = request = null;\n };\n return request;\n };\n return function(instance) {\n return instance.search = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgSearchResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/sprints.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($repo, $model, $storage) {\n var service;\n service = {};\n service.get = function(projectId, sprintId) {\n return $repo.queryOne(\"milestones\", sprintId).then(function(sprint) {\n var uses;\n uses = sprint.user_stories;\n uses = _.map(uses, function(u) {\n return $model.make_model(\"userstories\", u);\n });\n sprint._attrs.user_stories = uses;\n return sprint;\n });\n };\n service.stats = function(projectId, sprintId) {\n return $repo.queryOneRaw(\"milestones\", sprintId + \"/stats\");\n };\n service.list = function(projectId, filters) {\n var params;\n params = {\n \"project\": projectId\n };\n params = _.extend({}, params, filters || {});\n return $repo.queryMany(\"milestones\", params, {}, true).then((function(_this) {\n return function(result) {\n var headers, i, len, m, milestones, uses;\n milestones = result[0];\n headers = result[1];\n for (i = 0, len = milestones.length; i < len; i++) {\n m = milestones[i];\n uses = m.user_stories;\n uses = _.map(uses, function(u) {\n return $model.make_model(\"userstories\", u);\n });\n m._attrs.user_stories = uses;\n }\n return {\n milestones: milestones,\n closed: parseInt(headers(\"Taiga-Info-Total-Closed-Milestones\"), 10),\n open: parseInt(headers(\"Taiga-Info-Total-Opened-Milestones\"), 10)\n };\n };\n })(this));\n };\n return function(instance) {\n return instance.sprints = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgSprintsResourcesProvider\", [\"$tgRepo\", \"$tgModel\", \"$tgStorage\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/tasks.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($repo, $http, $urls, $storage) {\n var hashSuffix, hashSuffixStatusColumnModes, hashSuffixUsRowModes, service;\n service = {};\n hashSuffix = \"tasks-queryparams\";\n hashSuffixStatusColumnModes = \"tasks-statuscolumnmodels\";\n hashSuffixUsRowModes = \"tasks-usrowmodels\";\n service.get = function(projectId, taskId) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n return $repo.queryOne(\"tasks\", taskId, params);\n };\n service.getByRef = function(projectId, ref) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params.ref = ref;\n return $repo.queryOne(\"tasks\", \"by_ref\", params);\n };\n service.listInAllProjects = function(filters) {\n return $repo.queryMany(\"tasks\", filters);\n };\n service.list = function(projectId, sprintId, userStoryId) {\n var params;\n if (sprintId == null) {\n sprintId = null;\n }\n if (userStoryId == null) {\n userStoryId = null;\n }\n params = {\n project: projectId\n };\n if (sprintId) {\n params.milestone = sprintId;\n }\n if (userStoryId) {\n params.user_story = userStoryId;\n }\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(\"tasks\", params);\n };\n service.bulkCreate = function(projectId, sprintId, usId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-create-tasks\");\n params = {\n project_id: projectId,\n sprint_id: sprintId,\n us_id: usId,\n bulk_tasks: data\n };\n return $http.post(url, params).then(function(result) {\n return result.data;\n });\n };\n service.upvote = function(taskId) {\n var url;\n url = $urls.resolve(\"task-upvote\", taskId);\n return $http.post(url);\n };\n service.downvote = function(taskId) {\n var url;\n url = $urls.resolve(\"task-downvote\", taskId);\n return $http.post(url);\n };\n service.watch = function(taskId) {\n var url;\n url = $urls.resolve(\"task-watch\", taskId);\n return $http.post(url);\n };\n service.unwatch = function(taskId) {\n var url;\n url = $urls.resolve(\"task-unwatch\", taskId);\n return $http.post(url);\n };\n service.bulkUpdateTaskTaskboardOrder = function(projectId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-update-task-taskboard-order\");\n params = {\n project_id: projectId,\n bulk_tasks: data\n };\n return $http.post(url, params);\n };\n service.listValues = function(projectId, type) {\n var params;\n params = {\n \"project\": projectId\n };\n return $repo.queryMany(type, params);\n };\n service.storeQueryParams = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getQueryParams = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n service.storeStatusColumnModes = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusColumnModes;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getStatusColumnModes = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusColumnModes;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n service.storeUsRowModes = function(projectId, sprintId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixUsRowModes;\n hash = generateHash([projectId, sprintId, ns]);\n return $storage.set(hash, params);\n };\n service.getUsRowModes = function(projectId, sprintId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixUsRowModes;\n hash = generateHash([projectId, sprintId, ns]);\n return $storage.get(hash) || {};\n };\n return function(instance) {\n return instance.tasks = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgTasksResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/memberships.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($config, $repo, $http, $urls, $q) {\n var service;\n service = {};\n service.changeAvatar = function(file) {\n var data, defered, maxFileSize, options, response, url;\n maxFileSize = $config.get(\"maxUploadFileSize\", null);\n if (maxFileSize && file.size > maxFileSize) {\n response = {\n status: 413,\n data: {\n _error_message: \"'\" + file.name + \"' (\" + (sizeFormat(file.size)) + \") is too heavy for our oompa loompas, try it with a smaller than (\" + (sizeFormat(maxFileSize)) + \")\"\n }\n };\n defered = $q.defer();\n defered.reject(response);\n return defered.promise;\n }\n data = new FormData();\n data.append('avatar', file);\n options = {\n transformRequest: angular.identity,\n headers: {\n 'Content-Type': void 0\n }\n };\n url = ($urls.resolve(\"users\")) + \"/change_avatar\";\n return $http.post(url, data, {}, options);\n };\n service.removeAvatar = function() {\n var url;\n url = ($urls.resolve(\"users\")) + \"/remove_avatar\";\n return $http.post(url);\n };\n service.changePassword = function(currentPassword, newPassword) {\n var data, url;\n url = ($urls.resolve(\"users\")) + \"/change_password\";\n data = {\n current_password: currentPassword,\n password: newPassword\n };\n return $http.post(url, data);\n };\n return function(instance) {\n return instance.userSettings = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgUserSettingsResourcesProvider\", [\"$tgConfig\", \"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/user.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($http, $urls) {\n var service;\n service = {};\n service.contacts = function(userId, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = $urls.resolve(\"user-contacts\", userId);\n httpOptions = {\n headers: {}\n };\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return $http.get(url, {}, httpOptions).then(function(result) {\n return result.data;\n });\n };\n return function(instance) {\n return instance.users = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgUsersResourcesProvider\", [\"$tgHttp\", \"$tgUrls\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/userstories.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($repo, $http, $urls, $storage) {\n var hashSuffix, service;\n service = {};\n hashSuffix = \"userstories-queryparams\";\n service.get = function(projectId, usId) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n return $repo.queryOne(\"userstories\", usId, params);\n };\n service.getByRef = function(projectId, ref) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params.ref = ref;\n return $repo.queryOne(\"userstories\", \"by_ref\", params);\n };\n service.listInAllProjects = function(filters) {\n return $repo.queryMany(\"userstories\", filters);\n };\n service.filtersData = function(params) {\n return $repo.queryOneRaw(\"userstories-filters\", null, params);\n };\n service.listUnassigned = function(projectId, filters) {\n var params;\n params = {\n \"project\": projectId,\n \"milestone\": \"null\"\n };\n params = _.extend({}, params, filters || {});\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(\"userstories\", params);\n };\n service.listAll = function(projectId, filters) {\n var params;\n params = {\n \"project\": projectId\n };\n params = _.extend({}, params, filters || {});\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(\"userstories\", params);\n };\n service.bulkCreate = function(projectId, status, bulk) {\n var data, url;\n data = {\n project_id: projectId,\n status_id: status,\n bulk_stories: bulk\n };\n url = $urls.resolve(\"bulk-create-us\");\n return $http.post(url, data);\n };\n service.upvote = function(userStoryId) {\n var url;\n url = $urls.resolve(\"userstory-upvote\", userStoryId);\n return $http.post(url);\n };\n service.downvote = function(userStoryId) {\n var url;\n url = $urls.resolve(\"userstory-downvote\", userStoryId);\n return $http.post(url);\n };\n service.watch = function(userStoryId) {\n var url;\n url = $urls.resolve(\"userstory-watch\", userStoryId);\n return $http.post(url);\n };\n service.unwatch = function(userStoryId) {\n var url;\n url = $urls.resolve(\"userstory-unwatch\", userStoryId);\n return $http.post(url);\n };\n service.bulkUpdateBacklogOrder = function(projectId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-update-us-backlog-order\");\n params = {\n project_id: projectId,\n bulk_stories: data\n };\n return $http.post(url, params);\n };\n service.bulkUpdateSprintOrder = function(projectId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-update-us-sprint-order\");\n params = {\n project_id: projectId,\n bulk_stories: data\n };\n return $http.post(url, params);\n };\n service.bulkUpdateKanbanOrder = function(projectId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-update-us-kanban-order\");\n params = {\n project_id: projectId,\n bulk_stories: data\n };\n return $http.post(url, params);\n };\n service.listValues = function(projectId, type) {\n var params;\n params = {\n \"project\": projectId\n };\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(type, params);\n };\n service.storeQueryParams = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getQueryParams = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n service.storeShowTags = function(projectId, showTags) {\n var hash;\n hash = generateHash([projectId, 'showTags']);\n return $storage.set(hash, showTags);\n };\n service.getShowTags = function(projectId) {\n var hash;\n hash = generateHash([projectId, 'showTags']);\n return $storage.get(hash) || null;\n };\n return function(instance) {\n return instance.userstories = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgUserstoriesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: webhooklogs.coffee\n */\n\n(function() {\n var module, resourceProvider;\n\n resourceProvider = function($repo, $urls, $http) {\n var service;\n service = {};\n service.list = function(webhookId) {\n var params;\n params = {\n webhook: webhookId\n };\n return $repo.queryMany(\"webhooklogs\", params);\n };\n service.resend = function(webhooklogId) {\n var url;\n url = $urls.resolve(\"webhooklogs-resend\", webhooklogId);\n return $http.post(url);\n };\n return function(instance) {\n return instance.webhooklogs = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgWebhookLogsResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: webhooks.coffee\n */\n\n(function() {\n var module, resourceProvider;\n\n resourceProvider = function($repo, $urls, $http) {\n var service;\n service = {};\n service.list = function(projectId) {\n var params;\n params = {\n project: projectId\n };\n return $repo.queryMany(\"webhooks\", params);\n };\n service.test = function(webhookId) {\n var url;\n url = $urls.resolve(\"webhooks-test\", webhookId);\n return $http.post(url);\n };\n return function(instance) {\n return instance.webhooks = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgWebhooksResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/wikis.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(wikiId) {\n return $repo.queryOne(\"wiki\", wikiId);\n };\n service.getBySlug = function(projectId, slug) {\n return $repo.queryOne(\"wiki\", \"by_slug?project=\" + projectId + \"&slug=\" + slug);\n };\n service.listLinks = function(projectId) {\n return $repo.queryMany(\"wiki-links\", {\n project: projectId\n });\n };\n return function(instance) {\n return instance.wiki = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgWikiResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings/main.coffee\n */\n\n(function() {\n var UserChangePasswordController, UserChangePasswordDirective, debounce, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaUserSettings\");\n\n UserChangePasswordController = (function(superClass) {\n extend(UserChangePasswordController, superClass);\n\n UserChangePasswordController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgAuth\", \"$translate\"];\n\n function UserChangePasswordController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, auth, translate) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.auth = auth;\n this.translate = translate;\n this.scope.sectionName = this.translate.instant(\"CHANGE_PASSWORD.SECTION_NAME\");\n this.scope.user = this.auth.getUser();\n }\n\n return UserChangePasswordController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"UserChangePasswordController\", UserChangePasswordController);\n\n UserChangePasswordDirective = function($rs, $confirm, $loading, $translate) {\n var link;\n link = function($scope, $el, $attrs, ctrl) {\n var submit, submitButton;\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if ($scope.newPassword1 !== $scope.newPassword2) {\n $confirm.notify('error', $translate.instant(\"CHANGE_PASSWORD.ERROR_PASSWORD_MATCH\"));\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $rs.userSettings.changePassword($scope.currentPassword, $scope.newPassword1);\n promise.then(function() {\n currentLoading.finish();\n return $confirm.notify('success');\n });\n return promise.then(null, function(response) {\n currentLoading.finish();\n return $confirm.notify('error', response.data._error_message);\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserChangePassword\", [\"$tgResources\", \"$tgConfirm\", \"$tgLoading\", \"$translate\", UserChangePasswordDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues/lightboxes.coffee\n */\n\n(function() {\n var DeleteUserDirective, bindOnce, debounce, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaUserSettings\");\n\n DeleteUserDirective = function($repo, $rootscope, $auth, $location, $navUrls, lightboxService) {\n var link;\n link = function($scope, $el, $attrs) {\n var submit;\n $scope.$on(\"deletelightbox:new\", function(ctx, user) {\n return lightboxService.open($el);\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n submit = function() {\n var promise;\n promise = $repo.remove($scope.user);\n promise.then(function(data) {\n lightboxService.close($el);\n $auth.logout();\n return $location.path($navUrls.resolve(\"login\"));\n });\n return promise.then(null, function() {\n return console.log(\"FAIL\");\n });\n };\n $el.on(\"click\", \".button-red\", function(event) {\n event.preventDefault();\n return lightboxService.close($el);\n });\n return $el.on(\"click\", \".button-green\", debounce(2000, function(event) {\n event.preventDefault();\n return submit();\n }));\n };\n return {\n link: link,\n templateUrl: \"user/lightbox/lightbox-delete-account.html\"\n };\n };\n\n module.directive(\"tgLbDeleteUser\", [\"$tgRepo\", \"$rootScope\", \"$tgAuth\", \"$tgLocation\", \"$tgNavUrls\", \"lightboxService\", DeleteUserDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings/main.coffee\n */\n\n(function() {\n var TaigaAvatarModelDirective, UserAvatarDirective, UserProfileDirective, UserSettingsController, debounce, mixOf, module, sizeFormat, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n sizeFormat = this.taiga.sizeFormat;\n\n module = angular.module(\"taigaUserSettings\");\n\n debounce = this.taiga.debounce;\n\n UserSettingsController = (function(superClass) {\n extend(UserSettingsController, superClass);\n\n UserSettingsController.$inject = [\"$scope\", \"$rootScope\", \"$tgConfig\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgAuth\", \"$translate\"];\n\n function UserSettingsController(scope, rootscope, config, repo, confirm, rs, params, q, location, navUrls, auth, translate) {\n var maxFileSize, promise, text;\n this.scope = scope;\n this.rootscope = rootscope;\n this.config = config;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.auth = auth;\n this.translate = translate;\n this.scope.sectionName = \"USER_SETTINGS.MENU.SECTION_TITLE\";\n this.scope.project = {};\n this.scope.user = this.auth.getUser();\n if (!this.scope.user) {\n this.location.path(this.navUrls.resolve(\"permission-denied\"));\n this.location.replace();\n }\n this.scope.lang = this.getLan();\n this.scope.theme = this.getTheme();\n maxFileSize = this.config.get(\"maxUploadFileSize\", null);\n if (maxFileSize) {\n text = this.translate.instant(\"USER_SETTINGS.AVATAR_MAX_SIZE\", {\n \"maxFileSize\": sizeFormat(maxFileSize)\n });\n this.scope.maxFileSizeMsg = text;\n }\n promise = this.loadInitialData();\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n UserSettingsController.prototype.loadInitialData = function() {\n this.scope.availableThemes = this.config.get(\"themes\", []);\n return this.rs.locales.list().then((function(_this) {\n return function(locales) {\n _this.scope.locales = locales;\n return locales;\n };\n })(this));\n };\n\n UserSettingsController.prototype.openDeleteLightbox = function() {\n return this.rootscope.$broadcast(\"deletelightbox:new\", this.scope.user);\n };\n\n UserSettingsController.prototype.getLan = function() {\n return this.scope.user.lang || this.translate.preferredLanguage();\n };\n\n UserSettingsController.prototype.getTheme = function() {\n return this.scope.user.theme || this.config.get(\"defaultTheme\") || \"taiga\";\n };\n\n return UserSettingsController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"UserSettingsController\", UserSettingsController);\n\n UserProfileDirective = function($confirm, $auth, $repo, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var submit;\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var changeEmail, form, onError, onSuccess;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n changeEmail = $scope.user.isAttributeModified(\"email\");\n $scope.user.lang = $scope.lang;\n $scope.user.theme = $scope.theme;\n onSuccess = function(data) {\n var text;\n $auth.setUser(data);\n if (changeEmail) {\n text = $translate.instant(\"USER_PROFILE.CHANGE_EMAIL_SUCCESS\");\n return $confirm.success(text);\n } else {\n return $confirm.notify('success');\n }\n };\n onError = function(data) {\n form.setErrors(data);\n return $confirm.notify('error', data._error_message);\n };\n return $repo.save($scope.user).then(onSuccess, onError);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserProfile\", [\"$tgConfirm\", \"$tgAuth\", \"$tgRepo\", \"$translate\", UserProfileDirective]);\n\n UserAvatarDirective = function($auth, $model, $rs, $confirm) {\n var link;\n link = function($scope, $el, $attrs) {\n var onError, onSuccess, showSizeInfo;\n showSizeInfo = function() {\n return $el.find(\".size-info\").removeClass(\"hidden\");\n };\n onSuccess = function(response) {\n var user;\n user = $model.make_model(\"users\", response.data);\n $auth.setUser(user);\n $scope.user = user;\n $el.find('.loading-overlay').removeClass('active');\n return $confirm.notify('success');\n };\n onError = function(response) {\n if (response.status === 413) {\n showSizeInfo();\n }\n $el.find('.loading-overlay').removeClass('active');\n return $confirm.notify('error', response.data._error_message);\n };\n $el.on(\"click\", \".js-change-avatar\", function() {\n return $el.find(\"#avatar-field\").click();\n });\n $el.on(\"change\", \"#avatar-field\", function(event) {\n if ($scope.avatarAttachment) {\n $el.find('.loading-overlay').addClass(\"active\");\n return $rs.userSettings.changeAvatar($scope.avatarAttachment).then(onSuccess, onError);\n }\n });\n $el.on(\"click\", \"a.js-use-gravatar\", function(event) {\n $el.find('.loading-overlay').addClass(\"active\");\n return $rs.userSettings.removeAvatar().then(onSuccess, onError);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserAvatar\", [\"$tgAuth\", \"$tgModel\", \"$tgResources\", \"$tgConfirm\", UserAvatarDirective]);\n\n TaigaAvatarModelDirective = function($parse) {\n var link;\n link = function($scope, $el, $attrs) {\n var model, modelSetter;\n model = $parse($attrs.tgAvatarModel);\n modelSetter = model.assign;\n return $el.bind('change', function() {\n return $scope.$apply(function() {\n return modelSetter($scope, $el[0].files[0]);\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive('tgAvatarModel', ['$parse', TaigaAvatarModelDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings/nav.coffee\n */\n\n(function() {\n var UserSettingsNavigationDirective, module;\n\n UserSettingsNavigationDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var section;\n section = $attrs.tgUserSettingsNavigation;\n $el.find(\".active\").removeClass(\"active\");\n $el.find(\"#usersettingsmenu-\" + section + \" a\").addClass(\"active\");\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module = angular.module(\"taigaUserSettings\");\n\n module.directive(\"tgUserSettingsNavigation\", UserSettingsNavigationDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings/notifications.coffee\n */\n\n(function() {\n var UserNotificationsController, UserNotificationsDirective, UserNotificationsListDirective, bindOnce, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaUserSettings\");\n\n UserNotificationsController = (function(superClass) {\n extend(UserNotificationsController, superClass);\n\n UserNotificationsController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgAuth\"];\n\n function UserNotificationsController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, auth) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.auth = auth;\n this.scope.sectionName = \"USER_SETTINGS.NOTIFICATIONS.SECTION_NAME\";\n this.scope.user = this.auth.getUser();\n promise = this.loadInitialData();\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n UserNotificationsController.prototype.loadInitialData = function() {\n return this.rs.notifyPolicies.list().then((function(_this) {\n return function(notifyPolicies) {\n _this.scope.notifyPolicies = notifyPolicies;\n return notifyPolicies;\n };\n })(this));\n };\n\n return UserNotificationsController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"UserNotificationsController\", UserNotificationsController);\n\n UserNotificationsDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserNotifications\", UserNotificationsDirective);\n\n UserNotificationsListDirective = function($repo, $confirm, $compile) {\n var link, template;\n template = _.template(\"<% _.each(notifyPolicies, function (notifyPolicy, index) { %>\\n
\\\">\\n
<%- notifyPolicy.project_name %>
\\n
\\n
\\n \\\" id=\\\"policy-all-<%- notifyPolicy.id %>\\\"\\n value=\\\"2\\\" <% if (notifyPolicy.notify_level == 2) { %>checked=\\\"checked\\\"<% } %>/>\\n \\n
\\n
\\n
\\n
\\n \\\" id=\\\"policy-involved-<%- notifyPolicy.id %>\\\"\\n value=\\\"1\\\" <% if (notifyPolicy.notify_level == 1) { %>checked=\\\"checked\\\"<% } %> />\\n \\n
\\n
\\n
\\n
\\n \\\" id=\\\"policy-none-<%- notifyPolicy.id %>\\\"\\n value=\\\"3\\\" <% if (notifyPolicy.notify_level == 3) { %>checked=\\\"checked\\\"<% } %> />\\n \\n
\\n
\\n
\\n<% }) %>\");\n link = function($scope, $el, $attrs) {\n var render;\n render = function() {\n var ctx, html;\n $el.off();\n ctx = {\n notifyPolicies: $scope.notifyPolicies\n };\n html = template(ctx);\n $el.html($compile(html)($scope));\n return $el.on(\"change\", \"input[type=radio]\", function(event) {\n var onError, onSuccess, policy, policyIndex, prev_level, target;\n target = angular.element(event.currentTarget);\n policyIndex = target.parents(\".policy-table-row\").data('index');\n policy = $scope.notifyPolicies[policyIndex];\n prev_level = policy.notify_level;\n policy.notify_level = parseInt(target.val(), 10);\n onSuccess = function() {\n return $confirm.notify(\"success\");\n };\n onError = function() {\n $confirm.notify(\"error\");\n return target.parents(\".policy-table-row\").find(\"input[value=\" + prev_level + \"]\").prop(\"checked\", true);\n };\n return $repo.save(policy).then(onSuccess, onError);\n });\n };\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return bindOnce($scope, $attrs.ngModel, render);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserNotificationsList\", [\"$tgRepo\", \"$tgConfirm\", \"$compile\", UserNotificationsListDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: components.module.coffee\n */\n\n(function() {\n angular.module(\"taigaComponents\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaDiscover\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: external-apps.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaExternalApps\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: home.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaHome\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: navigation-bar.module.coffee\n */\n\n(function() {\n angular.module(\"taigaNavigationBar\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaProfile\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: projects.module.coffee\n */\n\n(function() {\n angular.module(\"taigaProjects\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: resources.module.coffee\n */\n\n(function() {\n angular.module(\"taigaResources2\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline.module.coffee\n */\n\n(function() {\n angular.module(\"taigaUserTimeline\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachment-link.directive.coffee\n */\n\n(function() {\n var AttachmentLinkDirective;\n\n AttachmentLinkDirective = function($parse, lightboxFactory) {\n var link;\n link = function(scope, el, attrs) {\n var attachment;\n attachment = $parse(attrs.tgAttachmentLink)(scope);\n el.on(\"click\", function(event) {\n if (taiga.isImage(attachment.getIn(['file', 'name']))) {\n event.preventDefault();\n return scope.$apply(function() {\n return lightboxFactory.create('tg-lb-attachment-preview', {\n \"class\": 'lightbox lightbox-block'\n }, {\n file: attachment.get('file')\n });\n });\n }\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n };\n return {\n link: link\n };\n };\n\n AttachmentLinkDirective.$inject = [\"$parse\", \"tgLightboxFactory\"];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentLink\", AttachmentLinkDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachment-gallery.directive.coffee\n */\n\n(function() {\n var AttachmentGalleryDirective;\n\n AttachmentGalleryDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {};\n return {\n scope: {},\n bindToController: {\n attachment: \"=\",\n onDelete: \"&\",\n onUpdate: \"&\",\n type: \"=\"\n },\n controller: \"Attachment\",\n controllerAs: \"vm\",\n templateUrl: \"components/attachment/attachment-gallery.html\",\n link: link\n };\n };\n\n AttachmentGalleryDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentGallery\", AttachmentGalleryDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchment.controller.coffee\n */\n\n(function() {\n var AttachmentController;\n\n AttachmentController = (function() {\n AttachmentController.$inject = ['tgAttachmentsService', '$translate'];\n\n function AttachmentController(attachmentsService, translate) {\n this.attachmentsService = attachmentsService;\n this.translate = translate;\n this.form = {};\n this.form.description = this.attachment.getIn(['file', 'description']);\n this.form.is_deprecated = this.attachment.get(['file', 'is_deprecated']);\n this.title = this.translate.instant(\"ATTACHMENT.TITLE\", {\n fileName: this.attachment.get('name'),\n date: moment(this.attachment.get('created_date')).format(this.translate.instant(\"ATTACHMENT.DATE\"))\n });\n }\n\n AttachmentController.prototype.editMode = function(mode) {\n var attachment;\n attachment = this.attachment.set('editable', mode);\n return this.onUpdate({\n attachment: attachment\n });\n };\n\n AttachmentController.prototype[\"delete\"] = function() {\n return this.onDelete({\n attachment: this.attachment\n });\n };\n\n AttachmentController.prototype.save = function() {\n var attachment;\n attachment = this.attachment.set('loading', true);\n this.onUpdate({\n attachment: attachment\n });\n attachment = this.attachment.merge({\n editable: false,\n loading: false\n });\n attachment = attachment.mergeIn(['file'], {\n description: this.form.description,\n is_deprecated: !!this.form.is_deprecated\n });\n return this.onUpdate({\n attachment: attachment\n });\n };\n\n return AttachmentController;\n\n })();\n\n angular.module('taigaComponents').controller('Attachment', AttachmentController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachment.directive.coffee\n */\n\n(function() {\n var AttachmentDirective;\n\n AttachmentDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {};\n return {\n scope: {},\n bindToController: {\n attachment: \"=\",\n onDelete: \"&\",\n onUpdate: \"&\",\n type: \"=\"\n },\n controller: \"Attachment\",\n controllerAs: \"vm\",\n templateUrl: \"components/attachment/attachment.html\",\n link: link\n };\n };\n\n AttachmentDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachment\", AttachmentDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-drop.directive.coffee\n */\n\n(function() {\n var AttachmentsDropDirective;\n\n AttachmentsDropDirective = function($parse) {\n var link;\n link = function(scope, el, attrs) {\n var eventAttr;\n eventAttr = $parse(attrs.tgAttachmentsDrop);\n el.on('dragover', function(e) {\n e.preventDefault();\n return false;\n });\n el.on('drop', function(e) {\n var dataTransfer;\n e.stopPropagation();\n e.preventDefault();\n dataTransfer = e.dataTransfer || (e.originalEvent && e.originalEvent.dataTransfer);\n return scope.$apply(function() {\n return eventAttr(scope, {\n files: dataTransfer.files\n });\n });\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n };\n return {\n link: link\n };\n };\n\n AttachmentsDropDirective.$inject = [\"$parse\"];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentsDrop\", AttachmentsDropDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchments-full.controller.coffee\n */\n\n(function() {\n var AttachmentsFullController, sizeFormat;\n\n sizeFormat = this.taiga.sizeFormat;\n\n AttachmentsFullController = (function() {\n AttachmentsFullController.$inject = [\"$translate\", \"$tgConfirm\", \"$tgConfig\", \"$tgStorage\", \"tgAttachmentsFullService\"];\n\n function AttachmentsFullController(translate, confirm, config, storage, attachmentsFullService) {\n this.translate = translate;\n this.confirm = confirm;\n this.config = config;\n this.storage = storage;\n this.attachmentsFullService = attachmentsFullService;\n this.mode = this.storage.get('attachment-mode', 'list');\n this.maxFileSize = this.config.get(\"maxUploadFileSize\", null);\n if (this.maxFileSize) {\n this.maxFileSize = sizeFormat(this.maxFileSize);\n }\n this.maxFileSizeMsg = this.maxFileSize ? this.translate.instant(\"ATTACHMENT.MAX_UPLOAD_SIZE\", {\n maxFileSize: this.maxFileSize\n }) : \"\";\n taiga.defineImmutableProperty(this, 'attachments', (function(_this) {\n return function() {\n return _this.attachmentsFullService.attachments;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'deprecatedsCount', (function(_this) {\n return function() {\n return _this.attachmentsFullService.deprecatedsCount;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'attachmentsVisible', (function(_this) {\n return function() {\n return _this.attachmentsFullService.attachmentsVisible;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'deprecatedsVisible', (function(_this) {\n return function() {\n return _this.attachmentsFullService.deprecatedsVisible;\n };\n })(this));\n }\n\n AttachmentsFullController.prototype.uploadingAttachments = function() {\n return this.attachmentsFullService.uploadingAttachments;\n };\n\n AttachmentsFullController.prototype.addAttachment = function(file) {\n var editable;\n editable = this.mode === 'list';\n return this.attachmentsFullService.addAttachment(this.projectId, this.objId, this.type, file, editable);\n };\n\n AttachmentsFullController.prototype.setMode = function(mode) {\n this.mode = mode;\n return this.storage.set('attachment-mode', mode);\n };\n\n AttachmentsFullController.prototype.toggleDeprecatedsVisible = function() {\n return this.attachmentsFullService.toggleDeprecatedsVisible();\n };\n\n AttachmentsFullController.prototype.addAttachments = function(files) {\n return _.forEach(files, (function(_this) {\n return function(file) {\n return _this.addAttachment(file);\n };\n })(this));\n };\n\n AttachmentsFullController.prototype.loadAttachments = function() {\n return this.attachmentsFullService.loadAttachments(this.type, this.objId, this.projectId);\n };\n\n AttachmentsFullController.prototype.deleteAttachment = function(toDeleteAttachment) {\n var message, title;\n title = this.translate.instant(\"ATTACHMENT.TITLE_LIGHTBOX_DELETE_ATTACHMENT\");\n message = this.translate.instant(\"ATTACHMENT.MSG_LIGHTBOX_DELETE_ATTACHMENT\", {\n fileName: toDeleteAttachment.getIn(['file', 'name'])\n });\n return this.confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var onError, onSuccess;\n onError = function() {\n message = _this.translate.instant(\"ATTACHMENT.ERROR_DELETE_ATTACHMENT\", {\n errorMessage: message\n });\n _this.confirm.notify(\"error\", null, message);\n return askResponse.finish(false);\n };\n onSuccess = function() {\n return askResponse.finish();\n };\n return _this.attachmentsFullService.deleteAttachment(toDeleteAttachment, _this.type).then(onSuccess, onError);\n };\n })(this));\n };\n\n AttachmentsFullController.prototype.reorderAttachment = function(attachment, newIndex) {\n return this.attachmentsFullService.reorderAttachment(this.type, attachment, newIndex);\n };\n\n AttachmentsFullController.prototype.updateAttachment = function(toUpdateAttachment) {\n return this.attachmentsFullService.updateAttachment(toUpdateAttachment, this.type);\n };\n\n return AttachmentsFullController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"AttachmentsFull\", AttachmentsFullController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchments-full.directive.coffee\n */\n\n(function() {\n var AttachmentsFullDirective, bindOnce;\n\n bindOnce = this.taiga.bindOnce;\n\n AttachmentsFullDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return bindOnce(scope, 'vm.objId', function(value) {\n return ctrl.loadAttachments();\n });\n };\n return {\n scope: {},\n bindToController: {\n type: \"@\",\n objId: \"=\",\n projectId: \"=\"\n },\n controller: \"AttachmentsFull\",\n controllerAs: \"vm\",\n templateUrl: \"components/attachments-full/attachments-full.html\",\n link: link\n };\n };\n\n AttachmentsFullDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentsFull\", AttachmentsFullDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-full.service.coffee\n */\n\n(function() {\n var AttachmentsFullService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n AttachmentsFullService = (function(superClass) {\n extend(AttachmentsFullService, superClass);\n\n AttachmentsFullService.$inject = [\"tgAttachmentsService\", \"$rootScope\"];\n\n function AttachmentsFullService(attachmentsService, rootScope) {\n this.attachmentsService = attachmentsService;\n this.rootScope = rootScope;\n this._attachments = Immutable.List();\n this._deprecatedsCount = 0;\n this._attachmentsVisible = Immutable.List();\n this._deprecatedsVisible = false;\n this.uploadingAttachments = [];\n taiga.defineImmutableProperty(this, 'attachments', (function(_this) {\n return function() {\n return _this._attachments;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'deprecatedsCount', (function(_this) {\n return function() {\n return _this._deprecatedsCount;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'attachmentsVisible', (function(_this) {\n return function() {\n return _this._attachmentsVisible;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'deprecatedsVisible', (function(_this) {\n return function() {\n return _this._deprecatedsVisible;\n };\n })(this));\n }\n\n AttachmentsFullService.prototype.toggleDeprecatedsVisible = function() {\n this._deprecatedsVisible = !this._deprecatedsVisible;\n return this.regenerate();\n };\n\n AttachmentsFullService.prototype.regenerate = function() {\n this._deprecatedsCount = this._attachments.count(function(it) {\n return it.getIn(['file', 'is_deprecated']);\n });\n if (this._deprecatedsVisible) {\n return this._attachmentsVisible = this._attachments;\n } else {\n return this._attachmentsVisible = this._attachments.filter(function(it) {\n return !it.getIn(['file', 'is_deprecated']);\n });\n }\n };\n\n AttachmentsFullService.prototype.addAttachment = function(projectId, objId, type, file, editable) {\n if (editable == null) {\n editable = true;\n }\n return new Promise((function(_this) {\n return function(resolve, reject) {\n var promise;\n if (_this.attachmentsService.validate(file)) {\n _this.uploadingAttachments.push(file);\n promise = _this.attachmentsService.upload(file, objId, projectId, type);\n return promise.then(function(file) {\n var attachment;\n _this.uploadingAttachments = _this.uploadingAttachments.filter(function(uploading) {\n return uploading.name !== file.get('name');\n });\n attachment = Immutable.Map();\n attachment = attachment.merge({\n file: file,\n editable: editable,\n loading: false\n });\n _this._attachments = _this._attachments.push(attachment);\n _this.regenerate();\n _this.rootScope.$broadcast(\"attachment:create\");\n return resolve(attachment);\n });\n } else {\n return reject(file);\n }\n };\n })(this));\n };\n\n AttachmentsFullService.prototype.loadAttachments = function(type, objId, projectId) {\n return this.attachmentsService.list(type, objId, projectId).then((function(_this) {\n return function(files) {\n _this._attachments = files.map(function(file) {\n var attachment;\n attachment = Immutable.Map();\n return attachment.merge({\n loading: false,\n editable: false,\n file: file\n });\n });\n return _this.regenerate();\n };\n })(this));\n };\n\n AttachmentsFullService.prototype.deleteAttachment = function(toDeleteAttachment, type) {\n var onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this._attachments = _this._attachments.filter(function(attachment) {\n return attachment !== toDeleteAttachment;\n });\n return _this.regenerate();\n };\n })(this);\n return this.attachmentsService[\"delete\"](type, toDeleteAttachment.getIn(['file', 'id'])).then(onSuccess);\n };\n\n AttachmentsFullService.prototype.reorderAttachment = function(type, attachment, newIndex) {\n var attachments, oldIndex, promises;\n oldIndex = this.attachments.findIndex(function(it) {\n return it === attachment;\n });\n if (oldIndex === newIndex) {\n return;\n }\n attachments = this.attachments.remove(oldIndex);\n attachments = attachments.splice(newIndex, 0, attachment);\n attachments = attachments.map(function(x, i) {\n return x.setIn(['file', 'order'], i + 1);\n });\n promises = [];\n attachments.forEach((function(_this) {\n return function(attachment) {\n var patch;\n patch = {\n order: attachment.getIn(['file', 'order'])\n };\n return promises.push(_this.attachmentsService.patch(attachment.getIn(['file', 'id']), type, patch));\n };\n })(this));\n return Promise.all(promises).then((function(_this) {\n return function() {\n _this._attachments = attachments;\n return _this.regenerate();\n };\n })(this));\n };\n\n AttachmentsFullService.prototype.updateAttachment = function(toUpdateAttachment, type) {\n var index, oldAttachment, patch;\n index = this._attachments.findIndex(function(attachment) {\n return attachment.getIn(['file', 'id']) === toUpdateAttachment.getIn(['file', 'id']);\n });\n oldAttachment = this._attachments.get(index);\n patch = taiga.patch(oldAttachment.get('file'), toUpdateAttachment.get('file'));\n if (toUpdateAttachment.get('loading')) {\n this._attachments = this._attachments.set(index, toUpdateAttachment);\n return this.regenerate();\n } else {\n return this.attachmentsService.patch(toUpdateAttachment.getIn(['file', 'id']), type, patch).then((function(_this) {\n return function() {\n _this._attachments = _this._attachments.set(index, toUpdateAttachment);\n return _this.regenerate();\n };\n })(this));\n }\n };\n\n return AttachmentsFullService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgAttachmentsFullService\", AttachmentsFullService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchments-simple.controller.coffee\n */\n\n(function() {\n var AttachmentsSimpleController;\n\n AttachmentsSimpleController = (function() {\n AttachmentsSimpleController.$inject = [\"tgAttachmentsService\"];\n\n function AttachmentsSimpleController(attachmentsService) {\n this.attachmentsService = attachmentsService;\n }\n\n AttachmentsSimpleController.prototype.addAttachment = function(file) {\n var attachment;\n attachment = Immutable.fromJS({\n file: file,\n name: file.name,\n size: file.size\n });\n if (this.attachmentsService.validate(file)) {\n this.attachments = this.attachments.push(attachment);\n if (this.onAdd) {\n return this.onAdd({\n attachment: attachment\n });\n }\n }\n };\n\n AttachmentsSimpleController.prototype.addAttachments = function(files) {\n return _.forEach(files, this.addAttachment.bind(this));\n };\n\n AttachmentsSimpleController.prototype.deleteAttachment = function(toDeleteAttachment) {\n this.attachments = this.attachments.filter(function(attachment) {\n return attachment !== toDeleteAttachment;\n });\n if (this.onDelete) {\n return this.onDelete({\n attachment: toDeleteAttachment\n });\n }\n };\n\n return AttachmentsSimpleController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"AttachmentsSimple\", AttachmentsSimpleController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchments-simple.directive.coffee\n */\n\n(function() {\n var AttachmentsSimpleDirective;\n\n AttachmentsSimpleDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {};\n return {\n scope: {},\n bindToController: {\n attachments: \"=\",\n onAdd: \"&\",\n onDelete: \"&\"\n },\n controller: \"AttachmentsSimple\",\n controllerAs: \"vm\",\n templateUrl: \"components/attachments-simple/attachments-simple.html\",\n link: link\n };\n };\n\n AttachmentsSimpleDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentsSimple\", AttachmentsSimpleDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-sortable.directive.coffee\n */\n\n(function() {\n var AttachmentSortableDirective;\n\n AttachmentSortableDirective = function($parse) {\n var link;\n link = function(scope, el, attrs) {\n var callback;\n callback = $parse(attrs.tgAttachmentsSortable);\n el.sortable({\n items: \"div[tg-bind-scope]\",\n handle: \"a.settings.icon.icon-drag-v\",\n containment: \".attachments\",\n dropOnEmpty: true,\n helper: 'clone',\n scroll: false,\n tolerance: \"pointer\",\n placeholder: \"sortable-placeholder single-attachment\"\n });\n el.on(\"sortstop\", function(event, ui) {\n var attachment, newIndex;\n attachment = ui.item.scope().attachment;\n newIndex = ui.item.index();\n return scope.$apply(function() {\n return callback(scope, {\n attachment: attachment,\n index: newIndex\n });\n });\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n };\n return {\n link: link\n };\n };\n\n AttachmentSortableDirective.$inject = [\"$parse\"];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentsSortable\", AttachmentSortableDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: auto-select.directive.coffee\n */\n\n(function() {\n var AutoSelectDirective;\n\n AutoSelectDirective = function($timeout) {\n return {\n link: function(scope, elm) {\n return $timeout(function() {\n return elm[0].select();\n });\n }\n };\n };\n\n AutoSelectDirective.$inject = ['$timeout'];\n\n angular.module(\"taigaComponents\").directive(\"tgAutoSelect\", AutoSelectDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: file-change.directive.coffee\n */\n\n(function() {\n var FileChangeDirective;\n\n FileChangeDirective = function($parse) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var eventAttr;\n eventAttr = $parse(attrs.tgFileChange);\n el.on('change', function(event) {\n return scope.$apply(function() {\n return eventAttr(scope, {\n files: event.currentTarget.files\n });\n });\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n };\n return {\n require: \"ngModel\",\n restrict: \"A\",\n link: link\n };\n };\n\n FileChangeDirective.$inject = [\"$parse\"];\n\n angular.module(\"taigaComponents\").directive(\"tgFileChange\", FileChangeDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: joy-ride.directive.coffee\n */\n\n(function() {\n var JoyRideDirective, taiga;\n\n taiga = this.taiga;\n\n JoyRideDirective = function($rootScope, currentUserService, joyRideService, $location, $translate) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var initJoyrRide, intro, unsuscribe;\n unsuscribe = null;\n intro = introJs();\n intro.oncomplete(function() {\n return $('html,body').scrollTop(0);\n });\n intro.onexit(function() {\n return currentUserService.disableJoyRide();\n });\n initJoyrRide = function(next, config) {\n if (!config[next.joyride]) {\n return;\n }\n intro.setOptions({\n exitOnEsc: false,\n exitOnOverlayClick: false,\n showStepNumbers: false,\n nextLabel: $translate.instant('JOYRIDE.NAV.NEXT') + ' →',\n prevLabel: '← ' + $translate.instant('JOYRIDE.NAV.BACK'),\n skipLabel: $translate.instant('JOYRIDE.NAV.SKIP'),\n doneLabel: $translate.instant('JOYRIDE.NAV.DONE'),\n disableInteraction: true\n });\n intro.setOption('steps', joyRideService.get(next.joyride));\n return intro.start();\n };\n return $rootScope.$on('$routeChangeSuccess', function(event, next) {\n if (!next.joyride || !currentUserService.isAuthenticated()) {\n intro.exit();\n if (unsuscribe) {\n unsuscribe();\n }\n return;\n }\n intro.oncomplete(function() {\n return currentUserService.disableJoyRide(next.joyride);\n });\n if (next.loader) {\n return unsuscribe = $rootScope.$on('loader:end', function() {\n currentUserService.loadJoyRideConfig().then(function(config) {\n return initJoyrRide(next, config);\n });\n return unsuscribe();\n });\n } else {\n return currentUserService.loadJoyRideConfig().then(function(config) {\n return initJoyrRide(next, config);\n });\n }\n });\n };\n return {\n scope: {},\n link: link\n };\n };\n\n JoyRideDirective.$inject = [\"$rootScope\", \"tgCurrentUserService\", \"tgJoyRideService\", \"$location\", \"$translate\"];\n\n angular.module(\"taigaComponents\").directive(\"tgJoyRide\", JoyRideDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: joy-ride.service.coffee\n */\n\n(function() {\n var JoyRideService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n JoyRideService = (function(superClass) {\n extend(JoyRideService, superClass);\n\n JoyRideService.$inject = ['$translate', 'tgCheckPermissionsService'];\n\n function JoyRideService(translate, checkPermissionsService) {\n this.translate = translate;\n this.checkPermissionsService = checkPermissionsService;\n }\n\n JoyRideService.prototype.getConfig = function() {\n return {\n dashboard: (function(_this) {\n return function() {\n var steps;\n steps = [\n {\n element: '.project-list > section:not(.ng-hide)',\n position: 'left',\n joyride: {\n title: _this.translate.instant('JOYRIDE.DASHBOARD.STEP1.TITLE'),\n text: _this.translate.instant('JOYRIDE.DASHBOARD.STEP1.TEXT')\n }\n }, {\n element: '.working-on-container',\n position: 'right',\n joyride: {\n title: _this.translate.instant('JOYRIDE.DASHBOARD.STEP2.TITLE'),\n text: _this.translate.instant('JOYRIDE.DASHBOARD.STEP2.TEXT')\n }\n }, {\n element: '.watching-container',\n position: 'right',\n joyride: {\n title: _this.translate.instant('JOYRIDE.DASHBOARD.STEP3.TITLE'),\n text: [_this.translate.instant('JOYRIDE.DASHBOARD.STEP3.TEXT1'), _this.translate.instant('JOYRIDE.DASHBOARD.STEP3.TEXT2')]\n }\n }\n ];\n if (!$('.project-list .create-project-button').is(':hidden')) {\n steps.push({\n element: '.project-list .create-project-button',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.DASHBOARD.STEP4.TITLE'),\n text: [_this.translate.instant('JOYRIDE.DASHBOARD.STEP4.TEXT1'), _this.translate.instant('JOYRIDE.DASHBOARD.STEP4.TEXT2')]\n }\n });\n }\n return steps;\n };\n })(this),\n backlog: (function(_this) {\n return function() {\n var steps;\n steps = [\n {\n element: '.summary',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.BACKLOG.STEP1.TITLE'),\n text: [_this.translate.instant('JOYRIDE.BACKLOG.STEP1.TEXT1'), _this.translate.instant('JOYRIDE.BACKLOG.STEP1.TEXT2')]\n }\n }, {\n element: '.backlog-table-empty',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.BACKLOG.STEP2.TITLE'),\n text: _this.translate.instant('JOYRIDE.BACKLOG.STEP2.TEXT')\n }\n }, {\n element: '.sprints',\n position: 'left',\n joyride: {\n title: _this.translate.instant('JOYRIDE.BACKLOG.STEP3.TITLE'),\n text: _this.translate.instant('JOYRIDE.BACKLOG.STEP3.TEXT')\n }\n }\n ];\n if (_this.checkPermissionsService.check('add_us')) {\n steps.push({\n element: '.new-us',\n position: 'rigth',\n joyride: {\n title: _this.translate.instant('JOYRIDE.BACKLOG.STEP4.TITLE'),\n text: _this.translate.instant('JOYRIDE.BACKLOG.STEP4.TEXT')\n }\n });\n }\n return steps;\n };\n })(this),\n kanban: (function(_this) {\n return function() {\n var steps;\n steps = [\n {\n element: '.kanban-table-inner',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.KANBAN.STEP1.TITLE'),\n text: _this.translate.instant('JOYRIDE.KANBAN.STEP1.TEXT')\n }\n }, {\n element: '.card-placeholder',\n position: 'right',\n joyride: {\n title: _this.translate.instant('JOYRIDE.KANBAN.STEP2.TITLE'),\n text: _this.translate.instant('JOYRIDE.KANBAN.STEP2.TEXT')\n }\n }\n ];\n if (_this.checkPermissionsService.check('add_us')) {\n steps.push({\n element: '.icon-plus',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.KANBAN.STEP3.TITLE'),\n text: [_this.translate.instant('JOYRIDE.KANBAN.STEP3.TEXT1'), _this.translate.instant('JOYRIDE.KANBAN.STEP3.TEXT2')]\n }\n });\n }\n return steps;\n };\n })(this)\n };\n };\n\n JoyRideService.prototype.get = function(name) {\n var joyRide, joyRides;\n joyRides = this.getConfig();\n joyRide = joyRides[name].call(this);\n return _.map(joyRide, function(item) {\n var html;\n html = \"\";\n if (item.joyride.title) {\n html += \"

\" + item.joyride.title + \"

\";\n }\n if (_.isArray(item.joyride.text)) {\n _.forEach(item.joyride.text, function(text) {\n return html += \"

\" + text + \"

\";\n });\n } else {\n html += \"

\" + item.joyride.text + \"

\";\n }\n item.intro = html;\n return item;\n });\n };\n\n return JoyRideService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgJoyRideService\", JoyRideService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Andrey Antukh \n * Copyright (C) 2014-2015 Jesús Espino Garcia \n * Copyright (C) 2014-2015 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: live-announcement.directive.coffee\n */\n\n(function() {\n var LiveAnnouncementDirective;\n\n LiveAnnouncementDirective = function(liveAnnouncementService) {\n var link;\n link = function(scope, el, attrs) {};\n return {\n restrict: \"AE\",\n scope: {},\n controllerAs: 'vm',\n controller: function() {\n this.close = function() {\n return liveAnnouncementService.open = false;\n };\n return Object.defineProperties(this, {\n open: {\n get: function() {\n return liveAnnouncementService.open;\n }\n },\n title: {\n get: function() {\n return liveAnnouncementService.title;\n }\n },\n desc: {\n get: function() {\n return liveAnnouncementService.desc;\n }\n }\n });\n },\n link: link,\n templateUrl: \"components/live-announcement/live-announcement.html\"\n };\n };\n\n LiveAnnouncementDirective.$inject = [\"tgLiveAnnouncementService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgLiveAnnouncement\", LiveAnnouncementDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: notification.service.coffee\n */\n\n(function() {\n var LiveAnnouncementService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n LiveAnnouncementService = (function(superClass) {\n extend(LiveAnnouncementService, superClass);\n\n function LiveAnnouncementService() {\n this.open = false;\n this.title = \"\";\n this.desc = \"\";\n }\n\n LiveAnnouncementService.prototype.show = function(title, desc) {\n this.open = true;\n this.title = title;\n return this.desc = desc;\n };\n\n return LiveAnnouncementService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgLiveAnnouncementService\", LiveAnnouncementService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project-logo.directive.coffee\n */\n\n(function() {\n var COLORS, IMAGES, LOGOS, ProjectLogoSrcDirective,\n modulo = function(a, b) { return (+a % (b = +b) + b) % b; };\n\n IMAGES = [\"/\" + window._version + \"/images/project-logos/project-logo-01.png\", \"/\" + window._version + \"/images/project-logos/project-logo-02.png\", \"/\" + window._version + \"/images/project-logos/project-logo-03.png\", \"/\" + window._version + \"/images/project-logos/project-logo-04.png\", \"/\" + window._version + \"/images/project-logos/project-logo-05.png\"];\n\n COLORS = [\"rgba( 153, 214, 220, 1 )\", \"rgba( 213, 156, 156, 1 )\", \"rgba( 214, 161, 212, 1 )\", \"rgba( 164, 162, 219, 1 )\", \"rgba( 152, 224, 168, 1 )\"];\n\n LOGOS = _.cartesianProduct(IMAGES, COLORS);\n\n ProjectLogoSrcDirective = function($parse) {\n var _getDefaultProjectLogo, link;\n _getDefaultProjectLogo = function(project) {\n var idx, key, logo;\n key = (project.get(\"slug\")) + \"-\" + (project.get(\"id\"));\n idx = modulo(murmurhash3_32_gc(key, 42), LOGOS.length);\n logo = LOGOS[idx];\n return {\n src: logo[0],\n color: logo[1]\n };\n };\n link = function(scope, el, attrs) {\n scope.$watch(\"project\", function(project) {\n var logo, projectLogo;\n project = Immutable.fromJS(project);\n if (!project) {\n return;\n }\n projectLogo = project.get('logo_small_url');\n if (projectLogo) {\n el.attr(\"src\", projectLogo);\n return el.css('background', \"\");\n } else {\n logo = _getDefaultProjectLogo(project);\n el.attr(\"src\", logo.src);\n return el.css('background', logo.color);\n }\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n };\n return {\n link: link,\n scope: {\n project: \"=tgProjectLogoSrc\"\n }\n };\n };\n\n ProjectLogoSrcDirective.$inject = [\"$parse\"];\n\n angular.module(\"taigaComponents\").directive(\"tgProjectLogoSrc\", ProjectLogoSrcDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project-menu.controller.coffee\n */\n\n(function() {\n var ProjectMenuController;\n\n ProjectMenuController = (function() {\n ProjectMenuController.$inject = [\"tgProjectService\", \"tgLightboxFactory\"];\n\n function ProjectMenuController(projectService, lightboxFactory) {\n this.projectService = projectService;\n this.lightboxFactory = lightboxFactory;\n this.project = null;\n this.menu = Immutable.Map();\n }\n\n ProjectMenuController.prototype.show = function() {\n this.project = this.projectService.project;\n this.active = this._getActiveSection();\n this._setVideoConference();\n return this._setMenuPermissions();\n };\n\n ProjectMenuController.prototype.hide = function() {\n this.project = null;\n return this.menu = {};\n };\n\n ProjectMenuController.prototype.search = function() {\n return this.lightboxFactory.create(\"tg-search-box\", {\n \"class\": \"lightbox lightbox-search\"\n });\n };\n\n ProjectMenuController.prototype._setVideoConference = function() {\n var videoconferenceUrl;\n videoconferenceUrl = this._videoConferenceUrl();\n if (videoconferenceUrl) {\n return this.project = this.project.set(\"videoconferenceUrl\", videoconferenceUrl);\n }\n };\n\n ProjectMenuController.prototype._setMenuPermissions = function() {\n this.menu = Immutable.Map({\n backlog: false,\n kanban: false,\n issues: false,\n wiki: false\n });\n if (this.project.get(\"is_backlog_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_us\") !== -1) {\n this.menu = this.menu.set(\"backlog\", true);\n }\n if (this.project.get(\"is_kanban_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_us\") !== -1) {\n this.menu = this.menu.set(\"kanban\", true);\n }\n if (this.project.get(\"is_issues_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_issues\") !== -1) {\n this.menu = this.menu.set(\"issues\", true);\n }\n if (this.project.get(\"is_wiki_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_wiki_pages\") !== -1) {\n return this.menu = this.menu.set(\"wiki\", true);\n }\n };\n\n ProjectMenuController.prototype._getActiveSection = function() {\n var indexBacklog, indexKanban, oldSectionName, sectionName, sectionsBreadcrumb;\n sectionName = this.projectService.section;\n sectionsBreadcrumb = this.projectService.sectionsBreadcrumb;\n indexBacklog = sectionsBreadcrumb.lastIndexOf(\"backlog\");\n indexKanban = sectionsBreadcrumb.lastIndexOf(\"kanban\");\n if (indexBacklog !== -1 || indexKanban !== -1) {\n if (indexKanban === -1 || indexBacklog > indexKanban) {\n oldSectionName = \"backlog\";\n } else {\n oldSectionName = \"kanban\";\n }\n }\n if (sectionName === \"backlog-kanban\") {\n if (oldSectionName === \"backlog\" || oldSectionName === \"kanban\") {\n sectionName = oldSectionName;\n } else if (this.project.get(\"is_backlog_activated\") && !this.project.get(\"is_kanban_activated\")) {\n sectionName = \"backlog\";\n } else if (!this.project.get(\"is_backlog_activated\") && this.project.get(\"is_kanban_activated\")) {\n sectionName = \"kanban\";\n }\n }\n return sectionName;\n };\n\n ProjectMenuController.prototype._videoConferenceUrl = function() {\n var baseUrl, url;\n if (this.project.get(\"videoconferences\") === \"appear-in\") {\n baseUrl = \"https://appear.in/\";\n } else if (this.project.get(\"videoconferences\") === \"talky\") {\n baseUrl = \"https://talky.io/\";\n } else if (this.project.get(\"videoconferences\") === \"jitsi\") {\n baseUrl = \"https://meet.jit.si/\";\n url = this.project.get(\"slug\") + \"-\" + taiga.slugify(this.project.get(\"videoconferences_extra_data\"));\n url = url.replace(/-/g, \"\");\n return baseUrl + url;\n } else if (this.project.get(\"videoconferences\") === \"custom\") {\n return this.project.get(\"videoconferences_extra_data\");\n } else {\n return \"\";\n }\n if (this.project.get(\"videoconferences_extra_data\")) {\n url = this.project.get(\"slug\") + \"-\" + this.project.get(\"videoconferences_extra_data\");\n } else {\n url = this.project.get(\"slug\");\n }\n return baseUrl + url;\n };\n\n return ProjectMenuController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"ProjectMenu\", ProjectMenuController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project-menu.directive.coffee\n */\n\n(function() {\n var ProjectMenuDirective, taiga;\n\n taiga = this.taiga;\n\n ProjectMenuDirective = function(projectService, lightboxFactory) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var projectChange;\n projectChange = function() {\n if (projectService.project) {\n return ctrl.show();\n } else {\n return ctrl.hide();\n }\n };\n scope.$watch((function() {\n return projectService.project;\n }), projectChange);\n scope.vm.fixed = false;\n return $(window).on(\"scroll\", function() {\n var position;\n position = $(window).scrollTop();\n if (position > 100 && scope.vm.fixed === false) {\n scope.vm.fixed = true;\n return scope.$digest();\n } else if (position < 100 && scope.vm.fixed === true) {\n scope.vm.fixed = false;\n return scope.$digest();\n }\n });\n };\n return {\n scope: {},\n controller: \"ProjectMenu\",\n controllerAs: \"vm\",\n templateUrl: \"components/project-menu/project-menu.html\",\n link: link\n };\n };\n\n ProjectMenuDirective.$inject = [\"tgProjectService\", \"tgLightboxFactory\"];\n\n angular.module(\"taigaComponents\").directive(\"tgProjectMenu\", ProjectMenuDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.directive.coffee\n */\n\n(function() {\n var TermsOfServiceAndPrivacyPolicyNoticeDirective;\n\n TermsOfServiceAndPrivacyPolicyNoticeDirective = function($config) {\n var link;\n link = function(scope, el, attrs) {\n scope.privacyPolicyUrl = $config.get(\"privacyPolicyUrl\");\n return scope.termsOfServiceUrl = $config.get(\"termsOfServiceUrl\");\n };\n return {\n restrict: \"AE\",\n scope: {},\n link: link,\n templateUrl: \"components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.html\"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgTermsOfServiceAndPrivacyPolicyNotice\", [\"$tgConfig\", TermsOfServiceAndPrivacyPolicyNoticeDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: vote-button.controller.coffee\n */\n\n(function() {\n var VoteButtonController;\n\n VoteButtonController = (function() {\n VoteButtonController.$inject = [\"tgCurrentUserService\"];\n\n function VoteButtonController(currentUserService) {\n this.currentUserService = currentUserService;\n this.user = this.currentUserService.getUser();\n this.isMouseOver = false;\n this.loading = false;\n }\n\n VoteButtonController.prototype.showTextWhenMouseIsOver = function() {\n return this.isMouseOver = true;\n };\n\n VoteButtonController.prototype.showTextWhenMouseIsLeave = function() {\n return this.isMouseOver = false;\n };\n\n VoteButtonController.prototype.toggleVote = function() {\n var promise;\n this.loading = true;\n if (!this.item.is_voter) {\n promise = this._upvote();\n } else {\n promise = this._downvote();\n }\n promise[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n return promise;\n };\n\n VoteButtonController.prototype._upvote = function() {\n return this.onUpvote().then((function(_this) {\n return function() {\n return _this.showTextWhenMouseIsLeave();\n };\n })(this));\n };\n\n VoteButtonController.prototype._downvote = function() {\n return this.onDownvote();\n };\n\n return VoteButtonController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"VoteButton\", VoteButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: vote-button.directive.coffee\n */\n\n(function() {\n var VoteButtonDirective;\n\n VoteButtonDirective = function() {\n return {\n scope: {},\n controller: \"VoteButton\",\n bindToController: {\n item: \"=\",\n onUpvote: \"=\",\n onDownvote: \"=\"\n },\n controllerAs: \"vm\",\n templateUrl: \"components/vote-button/vote-button.html\"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgVoteButton\", VoteButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-button.controller.coffee\n */\n\n(function() {\n var WatchButtonController;\n\n WatchButtonController = (function() {\n WatchButtonController.$inject = [\"tgCurrentUserService\", \"$rootScope\"];\n\n function WatchButtonController(currentUserService, rootScope) {\n this.currentUserService = currentUserService;\n this.rootScope = rootScope;\n this.user = this.currentUserService.getUser();\n this.isMouseOver = false;\n this.loading = false;\n }\n\n WatchButtonController.prototype.showTextWhenMouseIsOver = function() {\n return this.isMouseOver = true;\n };\n\n WatchButtonController.prototype.showTextWhenMouseIsLeave = function() {\n return this.isMouseOver = false;\n };\n\n WatchButtonController.prototype.openWatchers = function() {\n return this.rootScope.$broadcast(\"watcher:add\", this.item);\n };\n\n WatchButtonController.prototype.getPerms = function() {\n var name, perms;\n if (!this.item) {\n return \"\";\n }\n name = this.item._name;\n perms = {\n userstories: 'modify_us',\n issues: 'modify_issue',\n tasks: 'modify_task'\n };\n return perms[name];\n };\n\n WatchButtonController.prototype.toggleWatch = function() {\n var promise;\n this.loading = true;\n if (!this.item.is_watcher) {\n promise = this._watch();\n } else {\n promise = this._unwatch();\n }\n promise[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n return promise;\n };\n\n WatchButtonController.prototype._watch = function() {\n return this.onWatch().then((function(_this) {\n return function() {\n return _this.showTextWhenMouseIsLeave();\n };\n })(this));\n };\n\n WatchButtonController.prototype._unwatch = function() {\n return this.onUnwatch();\n };\n\n return WatchButtonController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"WatchButton\", WatchButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-button.directive.coffee\n */\n\n(function() {\n var WatchButtonDirective;\n\n WatchButtonDirective = function() {\n return {\n scope: {},\n controller: \"WatchButton\",\n bindToController: {\n item: \"=\",\n onWatch: \"=\",\n onUnwatch: \"=\"\n },\n controllerAs: \"vm\",\n templateUrl: function(item, attributes) {\n return \"components/watch-button/watch-button-\" + attributes.environment + \".html\";\n }\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgWatchButton\", WatchButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-home-order-by.controller.coffee\n */\n\n(function() {\n var DiscoverHomeOrderByController;\n\n DiscoverHomeOrderByController = (function() {\n DiscoverHomeOrderByController.$inject = ['$translate'];\n\n function DiscoverHomeOrderByController(translate) {\n this.translate = translate;\n this.is_open = false;\n this.texts = {\n week: this.translate.instant('DISCOVER.FILTERS.WEEK'),\n month: this.translate.instant('DISCOVER.FILTERS.MONTH'),\n year: this.translate.instant('DISCOVER.FILTERS.YEAR'),\n all: this.translate.instant('DISCOVER.FILTERS.ALL_TIME')\n };\n }\n\n DiscoverHomeOrderByController.prototype.currentText = function() {\n return this.texts[this.currentOrderBy];\n };\n\n DiscoverHomeOrderByController.prototype.open = function() {\n return this.is_open = true;\n };\n\n DiscoverHomeOrderByController.prototype.close = function() {\n return this.is_open = false;\n };\n\n DiscoverHomeOrderByController.prototype.orderBy = function(type) {\n this.currentOrderBy = type;\n this.is_open = false;\n return this.onChange({\n orderBy: this.currentOrderBy\n });\n };\n\n return DiscoverHomeOrderByController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverHomeOrderBy\", DiscoverHomeOrderByController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-home-order-by.directive.coffee\n */\n\n(function() {\n var DiscoverHomeOrderByDirective;\n\n DiscoverHomeOrderByDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n controller: \"DiscoverHomeOrderBy\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"discover/components/discover-home-order-by/discover-home-order-by.html\",\n scope: {\n currentOrderBy: \"=orderBy\",\n onChange: \"&\"\n },\n link: link\n };\n };\n\n DiscoverHomeOrderByDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgDiscoverHomeOrderBy\", DiscoverHomeOrderByDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search-bar.controller.coffee\n */\n\n(function() {\n var DiscoverSearchBarController;\n\n DiscoverSearchBarController = (function() {\n DiscoverSearchBarController.$inject = ['tgDiscoverProjectsService'];\n\n function DiscoverSearchBarController(discoverProjectsService) {\n this.discoverProjectsService = discoverProjectsService;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.discoverProjectsService.projectsCount;\n };\n })(this));\n this.discoverProjectsService.fetchStats();\n }\n\n DiscoverSearchBarController.prototype.selectFilter = function(filter) {\n return this.onChange({\n filter: filter,\n q: this.q\n });\n };\n\n DiscoverSearchBarController.prototype.submitFilter = function() {\n return this.onChange({\n filter: this.filter,\n q: this.q\n });\n };\n\n return DiscoverSearchBarController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverSearchBar\", DiscoverSearchBarController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search.directive.coffee\n */\n\n(function() {\n var DiscoverSearchBarDirective;\n\n DiscoverSearchBarDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {};\n return {\n controller: \"DiscoverSearchBar\",\n controllerAs: \"vm\",\n templateUrl: 'discover/components/discover-search-bar/discover-search-bar.html',\n bindToController: true,\n scope: {\n q: \"=\",\n filter: \"=\",\n onChange: \"&\"\n },\n link: link\n };\n };\n\n DiscoverSearchBarDirective.$inject = [];\n\n angular.module('taigaDiscover').directive('tgDiscoverSearchBar', DiscoverSearchBarDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search-list-header.controller.coffee\n */\n\n(function() {\n var DiscoverSearchListHeaderController;\n\n DiscoverSearchListHeaderController = (function() {\n DiscoverSearchListHeaderController.$inject = [];\n\n function DiscoverSearchListHeaderController() {\n this.like_is_open = this.orderBy.indexOf('-total_fans') === 0;\n this.activity_is_open = this.orderBy.indexOf('-total_activity') === 0;\n }\n\n DiscoverSearchListHeaderController.prototype.openLike = function() {\n this.like_is_open = true;\n this.activity_is_open = false;\n return this.setOrderBy('-total_fans_last_week');\n };\n\n DiscoverSearchListHeaderController.prototype.openActivity = function() {\n this.activity_is_open = true;\n this.like_is_open = false;\n return this.setOrderBy('-total_activity_last_week');\n };\n\n DiscoverSearchListHeaderController.prototype.setOrderBy = function(type) {\n if (type == null) {\n type = '';\n }\n if (!type) {\n this.like_is_open = false;\n this.activity_is_open = false;\n }\n return this.onChange({\n orderBy: type\n });\n };\n\n return DiscoverSearchListHeaderController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverSearchListHeader\", DiscoverSearchListHeaderController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search-list-header.directive.coffee\n */\n\n(function() {\n var DiscoverSearchListHeaderDirective;\n\n DiscoverSearchListHeaderDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n controller: \"DiscoverSearchListHeader\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"discover/components/discover-search-list-header/discover-search-list-header.html\",\n scope: {\n onChange: \"&\",\n orderBy: \"=\"\n },\n link: link\n };\n };\n\n DiscoverSearchListHeaderDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgDiscoverSearchListHeader\", DiscoverSearchListHeaderDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: featured-projects.controller.coffee\n */\n\n(function() {\n var FeaturedProjectsController;\n\n FeaturedProjectsController = (function() {\n FeaturedProjectsController.$inject = [\"tgDiscoverProjectsService\"];\n\n function FeaturedProjectsController(discoverProjectsService) {\n this.discoverProjectsService = discoverProjectsService;\n taiga.defineImmutableProperty(this, \"featured\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.featured;\n };\n })(this));\n this.discoverProjectsService.fetchFeatured();\n }\n\n return FeaturedProjectsController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"FeaturedProjects\", FeaturedProjectsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: featured-projects.directive.coffee\n */\n\n(function() {\n var FeaturedProjectsDirective;\n\n FeaturedProjectsDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n controller: \"FeaturedProjects\",\n controllerAs: \"vm\",\n templateUrl: \"discover/components/featured-projects/featured-projects.html\",\n scope: {},\n link: link\n };\n };\n\n FeaturedProjectsDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgFeaturedProjects\", FeaturedProjectsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: highlighted.directive.coffee\n */\n\n(function() {\n var HighlightedDirective;\n\n HighlightedDirective = function() {\n return {\n templateUrl: \"discover/components/highlighted/highlighted.html\",\n scope: {\n loading: \"=\",\n highlighted: \"=\",\n orderBy: \"=\"\n }\n };\n };\n\n HighlightedDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgHighlighted\", HighlightedDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: most-active.controller.coffee\n */\n\n(function() {\n var MostActiveController;\n\n MostActiveController = (function() {\n MostActiveController.$inject = [\"tgDiscoverProjectsService\"];\n\n function MostActiveController(discoverProjectsService) {\n this.discoverProjectsService = discoverProjectsService;\n taiga.defineImmutableProperty(this, \"highlighted\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.mostActive;\n };\n })(this));\n this.currentOrderBy = 'week';\n this.order_by = this.getOrderBy();\n }\n\n MostActiveController.prototype.fetch = function() {\n this.loading = true;\n this.order_by = this.getOrderBy();\n return this.discoverProjectsService.fetchMostActive({\n order_by: this.order_by\n }).then((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n };\n\n MostActiveController.prototype.orderBy = function(type) {\n this.currentOrderBy = type;\n return this.fetch();\n };\n\n MostActiveController.prototype.getOrderBy = function(type) {\n if (this.currentOrderBy === 'all') {\n return '-total_activity';\n } else {\n return '-total_activity_last_' + this.currentOrderBy;\n }\n };\n\n return MostActiveController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"MostActive\", MostActiveController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: most-active.directive.coffee\n */\n\n(function() {\n var MostActiveDirective;\n\n MostActiveDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.fetch();\n };\n return {\n controller: \"MostActive\",\n controllerAs: \"vm\",\n templateUrl: \"discover/components/most-active/most-active.html\",\n scope: {},\n link: link\n };\n };\n\n MostActiveDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgMostActive\", MostActiveDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: msot-liked.controller.coffee\n */\n\n(function() {\n var MostLikedController;\n\n MostLikedController = (function() {\n MostLikedController.$inject = [\"tgDiscoverProjectsService\"];\n\n function MostLikedController(discoverProjectsService) {\n this.discoverProjectsService = discoverProjectsService;\n taiga.defineImmutableProperty(this, \"highlighted\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.mostLiked;\n };\n })(this));\n this.currentOrderBy = 'week';\n this.order_by = this.getOrderBy();\n }\n\n MostLikedController.prototype.fetch = function() {\n this.loading = true;\n this.order_by = this.getOrderBy();\n return this.discoverProjectsService.fetchMostLiked({\n order_by: this.order_by\n }).then((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n };\n\n MostLikedController.prototype.orderBy = function(type) {\n this.currentOrderBy = type;\n return this.fetch();\n };\n\n MostLikedController.prototype.getOrderBy = function() {\n if (this.currentOrderBy === 'all') {\n return '-total_fans';\n } else {\n return '-total_fans_last_' + this.currentOrderBy;\n }\n };\n\n return MostLikedController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"MostLiked\", MostLikedController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: most-liked.directive.coffee\n */\n\n(function() {\n var MostLikedDirective;\n\n MostLikedDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.fetch();\n };\n return {\n controller: \"MostLiked\",\n controllerAs: \"vm\",\n templateUrl: \"discover/components/most-liked/most-liked.html\",\n scope: {},\n link: link\n };\n };\n\n MostLikedDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgMostLiked\", MostLikedDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-home.controller.coffee\n */\n\n(function() {\n var DiscoverHomeController;\n\n DiscoverHomeController = (function() {\n DiscoverHomeController.$inject = ['$tgLocation', '$tgNavUrls'];\n\n function DiscoverHomeController(location, navUrls) {\n this.location = location;\n this.navUrls = navUrls;\n }\n\n DiscoverHomeController.prototype.onSubmit = function(q) {\n var url;\n url = this.navUrls.resolve('discover-search');\n return this.location.search('text', q).path(url);\n };\n\n return DiscoverHomeController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverHome\", DiscoverHomeController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search.controller.coffee\n */\n\n(function() {\n var DiscoverSearchController;\n\n DiscoverSearchController = (function() {\n DiscoverSearchController.$inject = ['$routeParams', 'tgDiscoverProjectsService', '$route'];\n\n function DiscoverSearchController(routeParams, discoverProjectsService, route) {\n this.routeParams = routeParams;\n this.discoverProjectsService = discoverProjectsService;\n this.route = route;\n this.page = 1;\n taiga.defineImmutableProperty(this, \"searchResult\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.searchResult;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"nextSearchPage\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.nextSearchPage;\n };\n })(this));\n this.q = this.routeParams.text;\n this.filter = this.routeParams.filter || 'all';\n this.orderBy = this.routeParams['order_by'] || '';\n this.loadingGlobal = false;\n this.loadingList = false;\n this.loadingPagination = false;\n }\n\n DiscoverSearchController.prototype.fetch = function() {\n this.page = 1;\n this.discoverProjectsService.resetSearchList();\n return this.search();\n };\n\n DiscoverSearchController.prototype.fetchByGlobalSearch = function() {\n if (this.loadingGlobal) {\n return;\n }\n this.loadingGlobal = true;\n return this.fetch().then((function(_this) {\n return function() {\n return _this.loadingGlobal = false;\n };\n })(this));\n };\n\n DiscoverSearchController.prototype.fetchByOrderBy = function() {\n if (this.loadingList) {\n return;\n }\n this.loadingList = true;\n return this.fetch().then((function(_this) {\n return function() {\n return _this.loadingList = false;\n };\n })(this));\n };\n\n DiscoverSearchController.prototype.showMore = function() {\n if (this.loadingPagination) {\n return;\n }\n this.loadingPagination = true;\n this.page++;\n return this.search().then((function(_this) {\n return function() {\n return _this.loadingPagination = false;\n };\n })(this));\n };\n\n DiscoverSearchController.prototype.search = function() {\n var filter, params;\n filter = this.getFilter();\n params = {\n page: this.page,\n q: this.q,\n order_by: this.orderBy\n };\n _.assign(params, filter);\n return this.discoverProjectsService.fetchSearch(params);\n };\n\n DiscoverSearchController.prototype.getFilter = function() {\n if (this.filter === 'people') {\n return {\n is_looking_for_people: true\n };\n } else if (this.filter === 'scrum') {\n return {\n is_backlog_activated: true\n };\n } else if (this.filter === 'kanban') {\n return {\n is_kanban_activated: true\n };\n }\n return {};\n };\n\n DiscoverSearchController.prototype.onChangeFilter = function(filter, q) {\n this.filter = filter;\n this.q = q;\n this.route.updateParams({\n filter: this.filter,\n text: this.q\n });\n return this.fetchByGlobalSearch();\n };\n\n DiscoverSearchController.prototype.onChangeOrder = function(orderBy) {\n this.orderBy = orderBy;\n this.route.updateParams({\n order_by: orderBy\n });\n return this.fetchByOrderBy();\n };\n\n return DiscoverSearchController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverSearch\", DiscoverSearchController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search.directive.coffee\n */\n\n(function() {\n var DiscoverSearchDirective;\n\n DiscoverSearchDirective = function() {\n var link;\n link = function(scope, element, attrs, ctrl) {\n return ctrl.fetch();\n };\n return {\n controller: \"DiscoverSearch\",\n controllerAs: \"vm\",\n link: link\n };\n };\n\n DiscoverSearchDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgDiscoverSearch\", DiscoverSearchDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-projects.service.coffee\n */\n\n(function() {\n var DiscoverProjectsService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n DiscoverProjectsService = (function(superClass) {\n extend(DiscoverProjectsService, superClass);\n\n DiscoverProjectsService.$inject = [\"tgResources\", \"tgProjectsService\"];\n\n function DiscoverProjectsService(rs, projectsService) {\n this.rs = rs;\n this.projectsService = projectsService;\n this._mostLiked = Immutable.List();\n this._mostActive = Immutable.List();\n this._featured = Immutable.List();\n this._searchResult = Immutable.List();\n this._projectsCount = 0;\n this.decorate = this.projectsService._decorate.bind(this.projectsService);\n taiga.defineImmutableProperty(this, \"mostLiked\", (function(_this) {\n return function() {\n return _this._mostLiked;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"mostActive\", (function(_this) {\n return function() {\n return _this._mostActive;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"featured\", (function(_this) {\n return function() {\n return _this._featured;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"searchResult\", (function(_this) {\n return function() {\n return _this._searchResult;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"nextSearchPage\", (function(_this) {\n return function() {\n return _this._nextSearchPage;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"projectsCount\", (function(_this) {\n return function() {\n return _this._projectsCount;\n };\n })(this));\n }\n\n DiscoverProjectsService.prototype.fetchMostLiked = function(params) {\n return this.rs.projects.getProjects(params, false).then((function(_this) {\n return function(result) {\n var data, projects;\n data = result.data.slice(0, 5);\n projects = Immutable.fromJS(data);\n projects = projects.map(_this.decorate);\n return _this._mostLiked = projects;\n };\n })(this));\n };\n\n DiscoverProjectsService.prototype.fetchMostActive = function(params) {\n return this.rs.projects.getProjects(params, false).then((function(_this) {\n return function(result) {\n var data, projects;\n data = result.data.slice(0, 5);\n projects = Immutable.fromJS(data);\n projects = projects.map(_this.decorate);\n return _this._mostActive = projects;\n };\n })(this));\n };\n\n DiscoverProjectsService.prototype.fetchFeatured = function() {\n var params;\n params = {\n is_featured: true\n };\n return this.rs.projects.getProjects(params, false).then((function(_this) {\n return function(result) {\n var data, projects;\n data = result.data.slice(0, 4);\n projects = Immutable.fromJS(data);\n projects = projects.map(_this.decorate);\n return _this._featured = projects;\n };\n })(this));\n };\n\n DiscoverProjectsService.prototype.resetSearchList = function() {\n return this._searchResult = Immutable.List();\n };\n\n DiscoverProjectsService.prototype.fetchStats = function() {\n return this.rs.stats.discover().then((function(_this) {\n return function(discover) {\n return _this._projectsCount = discover.getIn(['projects', 'total']);\n };\n })(this));\n };\n\n DiscoverProjectsService.prototype.fetchSearch = function(params) {\n return this.rs.projects.getProjects(params).then((function(_this) {\n return function(result) {\n var projects;\n _this._nextSearchPage = !!result.headers('X-Pagination-Next');\n projects = Immutable.fromJS(result.data);\n projects = projects.map(_this.decorate);\n return _this._searchResult = _this._searchResult.concat(projects);\n };\n })(this));\n };\n\n return DiscoverProjectsService;\n\n })(taiga.Service);\n\n angular.module(\"taigaDiscover\").service(\"tgDiscoverProjectsService\", DiscoverProjectsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: external-app.controller.coffee\n */\n\n(function() {\n var ExternalAppController, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n ExternalAppController = (function(superClass) {\n extend(ExternalAppController, superClass);\n\n ExternalAppController.$inject = [\"$routeParams\", \"tgExternalAppsService\", \"$window\", \"tgCurrentUserService\", \"$location\", \"$tgNavUrls\", \"tgXhrErrorService\", \"tgLoader\"];\n\n function ExternalAppController(routeParams, externalAppsService, window, currentUserService, location, navUrls, xhrError, loader) {\n var loginUrl, nextUrl;\n this.routeParams = routeParams;\n this.externalAppsService = externalAppsService;\n this.window = window;\n this.currentUserService = currentUserService;\n this.location = location;\n this.navUrls = navUrls;\n this.xhrError = xhrError;\n this.loader = loader;\n this.createApplicationToken = bind(this.createApplicationToken, this);\n this._getApplicationToken = bind(this._getApplicationToken, this);\n this._redirect = bind(this._redirect, this);\n this.loader.start(false);\n this._applicationId = this.routeParams.application;\n this._state = this.routeParams.state;\n this._getApplicationToken();\n this._user = this.currentUserService.getUser();\n this._application = null;\n nextUrl = encodeURIComponent(this.location.url());\n loginUrl = this.navUrls.resolve(\"login\");\n this.loginWithAnotherUserUrl = loginUrl + \"?next=\" + nextUrl;\n taiga.defineImmutableProperty(this, \"user\", (function(_this) {\n return function() {\n return _this._user;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"application\", (function(_this) {\n return function() {\n return _this._application;\n };\n })(this));\n }\n\n ExternalAppController.prototype._redirect = function(applicationToken) {\n var nextUrl;\n nextUrl = applicationToken.get(\"next_url\");\n return this.window.open(nextUrl, \"_self\");\n };\n\n ExternalAppController.prototype._getApplicationToken = function() {\n return this.externalAppsService.getApplicationToken(this._applicationId, this._state).then((function(_this) {\n return function(data) {\n _this._application = data.get(\"application\");\n if (data.get(\"auth_code\")) {\n return _this._redirect(data);\n } else {\n return _this.loader.pageLoaded();\n }\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n _this.loader.pageLoaded();\n return _this.xhrError.response(xhr);\n };\n })(this));\n };\n\n ExternalAppController.prototype.cancel = function() {\n return this.window.history.back();\n };\n\n ExternalAppController.prototype.createApplicationToken = function() {\n return this.externalAppsService.authorizeApplicationToken(this._applicationId, this._state).then((function(_this) {\n return function(data) {\n return _this._redirect(data);\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n return _this.xhrError.response(xhr);\n };\n })(this));\n };\n\n return ExternalAppController;\n\n })(taiga.Controller);\n\n angular.module(\"taigaExternalApps\").controller(\"ExternalApp\", ExternalAppController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: external-app.service.coffee\n */\n\n(function() {\n var ExternalAppsService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n ExternalAppsService = (function(superClass) {\n extend(ExternalAppsService, superClass);\n\n ExternalAppsService.$inject = [\"tgResources\"];\n\n function ExternalAppsService(rs) {\n this.rs = rs;\n }\n\n ExternalAppsService.prototype.getApplicationToken = function(applicationId, state) {\n return this.rs.externalapps.getApplicationToken(applicationId, state);\n };\n\n ExternalAppsService.prototype.authorizeApplicationToken = function(applicationId, state) {\n return this.rs.externalapps.authorizeApplicationToken(applicationId, state);\n };\n\n return ExternalAppsService;\n\n })(taiga.Service);\n\n angular.module(\"taigaExternalApps\").service(\"tgExternalAppsService\", ExternalAppsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: feedback.service.coffee\n */\n\n(function() {\n var FeedbackService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n FeedbackService = (function(superClass) {\n extend(FeedbackService, superClass);\n\n FeedbackService.$inject = [\"tgLightboxFactory\"];\n\n function FeedbackService(lightboxFactory) {\n this.lightboxFactory = lightboxFactory;\n }\n\n FeedbackService.prototype.sendFeedback = function() {\n return this.lightboxFactory.create(\"tg-lb-feedback\", {\n \"class\": \"lightbox lightbox-feedback lightbox-generic-form\"\n });\n };\n\n return FeedbackService;\n\n })(taiga.Service);\n\n angular.module(\"taigaFeedback\").service(\"tgFeedbackService\", FeedbackService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: duty.directive.coffee\n */\n\n(function() {\n var DutyDirective;\n\n DutyDirective = function(navurls, $translate) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n scope.vm.duty = scope.duty;\n return scope.vm.getDutyType = function() {\n if (scope.vm.duty) {\n if (scope.vm.duty.get('_name') === \"userstories\") {\n return $translate.instant(\"COMMON.USER_STORY\");\n }\n if (scope.vm.duty.get('_name') === \"tasks\") {\n return $translate.instant(\"COMMON.TASK\");\n }\n if (scope.vm.duty.get('_name') === \"issues\") {\n return $translate.instant(\"COMMON.ISSUE\");\n }\n }\n };\n };\n return {\n templateUrl: \"home/duties/duty.html\",\n scope: {\n \"duty\": \"=tgDuty\"\n },\n link: link\n };\n };\n\n DutyDirective.$inject = [\"$tgNavUrls\", \"$translate\"];\n\n angular.module(\"taigaHome\").directive(\"tgDuty\", DutyDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: home.controller.coffee\n */\n\n(function() {\n var HomeController;\n\n HomeController = (function() {\n HomeController.$inject = [\"tgCurrentUserService\", \"$location\", \"$tgNavUrls\"];\n\n function HomeController(currentUserService, location, navUrls) {\n this.currentUserService = currentUserService;\n this.location = location;\n this.navUrls = navUrls;\n if (!this.currentUserService.getUser()) {\n this.location.path(this.navUrls.resolve(\"discover\"));\n }\n }\n\n return HomeController;\n\n })();\n\n angular.module(\"taigaHome\").controller(\"Home\", HomeController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: home.service.coffee\n */\n\n(function() {\n var HomeService, groupBy,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n groupBy = this.taiga.groupBy;\n\n HomeService = (function(superClass) {\n extend(HomeService, superClass);\n\n HomeService.$inject = [\"$tgNavUrls\", \"tgResources\", \"tgProjectsService\"];\n\n function HomeService(navurls, rs, projectsService) {\n this.navurls = navurls;\n this.rs = rs;\n this.projectsService = projectsService;\n }\n\n HomeService.prototype._attachProjectInfoToWorkInProgress = function(workInProgress, projectsById) {\n var _attachProjectInfoToDuty, _duties, assignedTo, watching;\n _attachProjectInfoToDuty = (function(_this) {\n return function(duty, objType) {\n var ctx, project, url;\n project = projectsById.get(String(duty.get('project')));\n ctx = {\n project: project.get('slug'),\n ref: duty.get('ref')\n };\n url = _this.navurls.resolve(\"project-\" + objType + \"-detail\", ctx);\n duty = duty.set('url', url);\n duty = duty.set('projectName', project.get('name'));\n duty = duty.set(\"_name\", objType);\n return duty;\n };\n })(this);\n assignedTo = workInProgress.get(\"assignedTo\");\n if (assignedTo.get(\"userStories\")) {\n _duties = assignedTo.get(\"userStories\").map(function(duty) {\n return _attachProjectInfoToDuty(duty, \"userstories\");\n });\n assignedTo = assignedTo.set(\"userStories\", _duties);\n }\n if (assignedTo.get(\"tasks\")) {\n _duties = assignedTo.get(\"tasks\").map(function(duty) {\n return _attachProjectInfoToDuty(duty, \"tasks\");\n });\n assignedTo = assignedTo.set(\"tasks\", _duties);\n }\n if (assignedTo.get(\"issues\")) {\n _duties = assignedTo.get(\"issues\").map(function(duty) {\n return _attachProjectInfoToDuty(duty, \"issues\");\n });\n assignedTo = assignedTo.set(\"issues\", _duties);\n }\n watching = workInProgress.get(\"watching\");\n if (watching.get(\"userStories\")) {\n _duties = watching.get(\"userStories\").filter(function(duty) {\n return !!projectsById.get(String(duty.get('project')));\n });\n _duties = _duties.map(function(duty) {\n return _attachProjectInfoToDuty(duty, \"userstories\");\n });\n watching = watching.set(\"userStories\", _duties);\n }\n if (watching.get(\"tasks\")) {\n _duties = watching.get(\"tasks\").filter(function(duty) {\n return !!projectsById.get(String(duty.get('project')));\n });\n _duties = _duties.map(function(duty) {\n return _attachProjectInfoToDuty(duty, \"tasks\");\n });\n watching = watching.set(\"tasks\", _duties);\n }\n if (watching.get(\"issues\")) {\n _duties = watching.get(\"issues\").filter(function(duty) {\n return !!projectsById.get(String(duty.get('project')));\n });\n _duties = _duties.map(function(duty) {\n return _attachProjectInfoToDuty(duty, \"issues\");\n });\n watching = watching.set(\"issues\", _duties);\n }\n workInProgress = workInProgress.set(\"assignedTo\", assignedTo);\n return workInProgress = workInProgress.set(\"watching\", watching);\n };\n\n HomeService.prototype.getWorkInProgress = function(userId) {\n var assignedIssuesPromise, assignedTasksPromise, assignedTo, assignedUserStoriesPromise, params, params_us, projectsById, projectsPromise, watching, watchingIssuesPromise, watchingTasksPromise, watchingUserStoriesPromise, workInProgress;\n projectsById = Immutable.Map();\n projectsPromise = this.projectsService.getProjectsByUserId(userId).then(function(projects) {\n return projectsById = Immutable.fromJS(groupBy(projects.toJS(), function(p) {\n return p.id;\n }));\n });\n assignedTo = Immutable.Map();\n params = {\n status__is_closed: false,\n assigned_to: userId\n };\n params_us = {\n is_closed: false,\n assigned_to: userId\n };\n assignedUserStoriesPromise = this.rs.userstories.listInAllProjects(params_us).then(function(userstories) {\n return assignedTo = assignedTo.set(\"userStories\", userstories);\n });\n assignedTasksPromise = this.rs.tasks.listInAllProjects(params).then(function(tasks) {\n return assignedTo = assignedTo.set(\"tasks\", tasks);\n });\n assignedIssuesPromise = this.rs.issues.listInAllProjects(params).then(function(issues) {\n return assignedTo = assignedTo.set(\"issues\", issues);\n });\n params = {\n status__is_closed: false,\n watchers: userId\n };\n params_us = {\n is_closed: false,\n watchers: userId\n };\n watching = Immutable.Map();\n watchingUserStoriesPromise = this.rs.userstories.listInAllProjects(params_us).then(function(userstories) {\n return watching = watching.set(\"userStories\", userstories);\n });\n watchingTasksPromise = this.rs.tasks.listInAllProjects(params).then(function(tasks) {\n return watching = watching.set(\"tasks\", tasks);\n });\n watchingIssuesPromise = this.rs.issues.listInAllProjects(params).then(function(issues) {\n return watching = watching.set(\"issues\", issues);\n });\n workInProgress = Immutable.Map();\n return Promise.all([projectsPromise, assignedUserStoriesPromise, assignedTasksPromise, assignedIssuesPromise, watchingUserStoriesPromise, watchingTasksPromise, watchingIssuesPromise]).then((function(_this) {\n return function() {\n workInProgress = workInProgress.set(\"assignedTo\", assignedTo);\n workInProgress = workInProgress.set(\"watching\", watching);\n workInProgress = _this._attachProjectInfoToWorkInProgress(workInProgress, projectsById);\n return workInProgress;\n };\n })(this));\n };\n\n return HomeService;\n\n })(taiga.Service);\n\n angular.module(\"taigaHome\").service(\"tgHomeService\", HomeService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: home-project-list.directive.coffee\n */\n\n(function() {\n var HomeProjectListDirective;\n\n HomeProjectListDirective = function(currentUserService, projectsService) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n taiga.defineImmutableProperty(scope.vm, \"projects\", function() {\n return currentUserService.projects.get(\"recents\");\n });\n return scope.vm.newProject = function() {\n return projectsService.newProject();\n };\n };\n directive = {\n templateUrl: \"home/projects/home-project-list.html\",\n scope: {},\n link: link\n };\n return directive;\n };\n\n HomeProjectListDirective.$inject = [\"tgCurrentUserService\", \"tgProjectsService\"];\n\n angular.module(\"taigaHome\").directive(\"tgHomeProjectList\", HomeProjectListDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: working-on.controller.coffee\n */\n\n(function() {\n var WorkingOnController;\n\n WorkingOnController = (function() {\n WorkingOnController.$inject = [\"tgHomeService\"];\n\n function WorkingOnController(homeService) {\n this.homeService = homeService;\n this.assignedTo = Immutable.Map();\n this.watching = Immutable.Map();\n }\n\n WorkingOnController.prototype._setAssignedTo = function(workInProgress) {\n var issues, tasks, userStories;\n userStories = workInProgress.get(\"assignedTo\").get(\"userStories\");\n tasks = workInProgress.get(\"assignedTo\").get(\"tasks\");\n issues = workInProgress.get(\"assignedTo\").get(\"issues\");\n this.assignedTo = userStories.concat(tasks).concat(issues);\n if (this.assignedTo.size > 0) {\n return this.assignedTo = this.assignedTo.sortBy(function(elem) {\n return elem.get(\"modified_date\");\n }).reverse();\n }\n };\n\n WorkingOnController.prototype._setWatching = function(workInProgress) {\n var issues, tasks, userStories;\n userStories = workInProgress.get(\"watching\").get(\"userStories\");\n tasks = workInProgress.get(\"watching\").get(\"tasks\");\n issues = workInProgress.get(\"watching\").get(\"issues\");\n this.watching = userStories.concat(tasks).concat(issues);\n if (this.watching.size > 0) {\n return this.watching = this.watching.sortBy(function(elem) {\n return elem.get(\"modified_date\");\n }).reverse();\n }\n };\n\n WorkingOnController.prototype.getWorkInProgress = function(userId) {\n return this.homeService.getWorkInProgress(userId).then((function(_this) {\n return function(workInProgress) {\n _this._setAssignedTo(workInProgress);\n return _this._setWatching(workInProgress);\n };\n })(this));\n };\n\n return WorkingOnController;\n\n })();\n\n angular.module(\"taigaHome\").controller(\"WorkingOn\", WorkingOnController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: working-on.directive.coffee\n */\n\n(function() {\n var WorkingOnDirective;\n\n WorkingOnDirective = function(homeService, currentUserService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var user, userId;\n user = currentUserService.getUser();\n if (user) {\n userId = user.get(\"id\");\n return ctrl.getWorkInProgress(userId);\n }\n };\n return {\n controller: \"WorkingOn\",\n controllerAs: \"vm\",\n templateUrl: \"home/working-on/working-on.html\",\n scope: {},\n link: link\n };\n };\n\n WorkingOnDirective.$inject = [\"tgHomeService\", \"tgCurrentUserService\"];\n\n angular.module(\"taigaHome\").directive(\"tgWorkingOn\", WorkingOnDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: dropdown-project-list.directive.coffee\n */\n\n(function() {\n var DropdownProjectListDirective;\n\n DropdownProjectListDirective = function(currentUserService, projectsService) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n taiga.defineImmutableProperty(scope.vm, \"projects\", function() {\n return currentUserService.projects.get(\"recents\");\n });\n return scope.vm.newProject = function() {\n return projectsService.newProject();\n };\n };\n directive = {\n templateUrl: \"navigation-bar/dropdown-project-list/dropdown-project-list.html\",\n scope: {},\n link: link\n };\n return directive;\n };\n\n DropdownProjectListDirective.$inject = [\"tgCurrentUserService\", \"tgProjectsService\"];\n\n angular.module(\"taigaNavigationBar\").directive(\"tgDropdownProjectList\", DropdownProjectListDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: dropdown-user.directive.coffee\n */\n\n(function() {\n var DropdownUserDirective;\n\n DropdownUserDirective = function(authService, configService, locationService, navUrlsService, feedbackService) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n scope.vm.isFeedbackEnabled = configService.get(\"feedbackEnabled\");\n taiga.defineImmutableProperty(scope.vm, \"user\", function() {\n return authService.userData;\n });\n scope.vm.logout = function() {\n authService.logout();\n locationService.url(navUrlsService.resolve(\"discover\"));\n return locationService.search({});\n };\n return scope.vm.sendFeedback = function() {\n return feedbackService.sendFeedback();\n };\n };\n directive = {\n templateUrl: \"navigation-bar/dropdown-user/dropdown-user.html\",\n scope: {},\n link: link\n };\n return directive;\n };\n\n DropdownUserDirective.$inject = [\"$tgAuth\", \"$tgConfig\", \"$tgLocation\", \"$tgNavUrls\", \"tgFeedbackService\"];\n\n angular.module(\"taigaNavigationBar\").directive(\"tgDropdownUser\", DropdownUserDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: navigation-bar.directive.coffee\n */\n\n(function() {\n var NavigationBarDirective;\n\n NavigationBarDirective = function(currentUserService, navigationBarService, locationService, navUrlsService) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n scope.$on(\"$routeChangeSuccess\", function() {\n if (locationService.path() === \"/\") {\n return scope.vm.active = true;\n } else {\n return scope.vm.active = false;\n }\n });\n taiga.defineImmutableProperty(scope.vm, \"projects\", function() {\n return currentUserService.projects.get(\"recents\");\n });\n taiga.defineImmutableProperty(scope.vm, \"isAuthenticated\", function() {\n return currentUserService.isAuthenticated();\n });\n taiga.defineImmutableProperty(scope.vm, \"isEnabledHeader\", function() {\n return navigationBarService.isEnabledHeader();\n });\n scope.vm.login = function() {\n var nextUrl;\n nextUrl = encodeURIComponent(locationService.url());\n locationService.url(navUrlsService.resolve(\"login\"));\n return locationService.search({\n next: nextUrl\n });\n };\n return scope.vm.register = function() {\n var nextUrl;\n nextUrl = encodeURIComponent(locationService.url());\n locationService.url(navUrlsService.resolve(\"register\"));\n return locationService.search({\n next: nextUrl\n });\n };\n };\n directive = {\n templateUrl: \"navigation-bar/navigation-bar.html\",\n scope: {},\n link: link\n };\n return directive;\n };\n\n NavigationBarDirective.$inject = [\"tgCurrentUserService\", \"tgNavigationBarService\", \"$tgLocation\", \"$tgNavUrls\"];\n\n angular.module(\"taigaNavigationBar\").directive(\"tgNavigationBar\", NavigationBarDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: navigation-bar.service.coffee\n */\n\n(function() {\n var NavigationBarService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n NavigationBarService = (function(superClass) {\n extend(NavigationBarService, superClass);\n\n function NavigationBarService() {\n this.disableHeader();\n }\n\n NavigationBarService.prototype.enableHeader = function() {\n return this.enabledHeader = true;\n };\n\n NavigationBarService.prototype.disableHeader = function() {\n return this.enabledHeader = false;\n };\n\n NavigationBarService.prototype.isEnabledHeader = function() {\n return this.enabledHeader;\n };\n\n return NavigationBarService;\n\n })(taiga.Service);\n\n angular.module(\"taigaNavigationBar\").service(\"tgNavigationBarService\", NavigationBarService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-bar.controller.coffee\n */\n\n(function() {\n var ProfileBarController;\n\n ProfileBarController = (function() {\n ProfileBarController.$inject = [\"tgUserService\"];\n\n function ProfileBarController(userService) {\n this.userService = userService;\n this.loadStats();\n }\n\n ProfileBarController.prototype.loadStats = function() {\n return this.userService.getStats(this.user.get(\"id\")).then((function(_this) {\n return function(stats) {\n return _this.stats = stats;\n };\n })(this));\n };\n\n return ProfileBarController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"ProfileBar\", ProfileBarController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-bar.directive.coffee\n */\n\n(function() {\n var ProfileBarDirective;\n\n ProfileBarDirective = function() {\n return {\n templateUrl: \"profile/profile-bar/profile-bar.html\",\n controller: \"ProfileBar\",\n controllerAs: \"vm\",\n scope: {\n user: \"=user\",\n isCurrentUser: \"=iscurrentuser\"\n },\n bindToController: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileBar\", ProfileBarDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-contacts.controller.coffee\n */\n\n(function() {\n var ProfileContactsController;\n\n ProfileContactsController = (function() {\n ProfileContactsController.$inject = [\"tgUserService\", \"tgCurrentUserService\"];\n\n function ProfileContactsController(userService, currentUserService) {\n this.userService = userService;\n this.currentUserService = currentUserService;\n this.currentUser = this.currentUserService.getUser();\n this.isCurrentUser = false;\n if (this.currentUser && this.currentUser.get(\"id\") === this.user.get(\"id\")) {\n this.isCurrentUser = true;\n }\n }\n\n ProfileContactsController.prototype.loadContacts = function() {\n return this.userService.getContacts(this.user.get(\"id\")).then((function(_this) {\n return function(contacts) {\n return _this.contacts = contacts;\n };\n })(this));\n };\n\n return ProfileContactsController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"ProfileContacts\", ProfileContactsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-contacts.directive.coffee\n */\n\n(function() {\n var ProfileContactsDirective;\n\n ProfileContactsDirective = function() {\n var link;\n link = function(scope, elm, attrs, ctrl) {\n return ctrl.loadContacts();\n };\n return {\n templateUrl: \"profile/profile-contacts/profile-contacts.html\",\n scope: {\n user: \"=\"\n },\n controllerAs: \"vm\",\n controller: \"ProfileContacts\",\n link: link,\n bindToController: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileContacts\", ProfileContactsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: items.directive.coffee\n */\n\n(function() {\n var FavItemDirective;\n\n FavItemDirective = function() {\n var link, templateUrl;\n link = function(scope, el, attrs, ctrl) {\n return scope.vm = {\n item: scope.item\n };\n };\n templateUrl = function(el, attrs) {\n if (attrs.itemType === \"project\") {\n return \"profile/profile-favs/items/project.html\";\n } else {\n return \"profile/profile-favs/items/ticket.html\";\n }\n };\n return {\n scope: {\n \"item\": \"=tgFavItem\"\n },\n link: link,\n templateUrl: templateUrl\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgFavItem\", FavItemDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-favs.controller.coffee\n */\n\n(function() {\n var FavsBaseController, ProfileLikedController, ProfileVotedController, ProfileWatchedController, debounceLeading,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n debounceLeading = this.taiga.debounceLeading;\n\n FavsBaseController = (function() {\n function FavsBaseController() {\n this._init();\n }\n\n FavsBaseController.prototype._init = function() {\n this.enableFilterByAll = true;\n this.enableFilterByProjects = true;\n this.enableFilterByUserStories = true;\n this.enableFilterByTasks = true;\n this.enableFilterByIssues = true;\n this.enableFilterByTextQuery = true;\n this._resetList();\n this.q = null;\n return this.type = null;\n };\n\n FavsBaseController.prototype._resetList = function() {\n this.items = Immutable.List();\n this.scrollDisabled = false;\n return this._page = 1;\n };\n\n FavsBaseController.prototype._enableLoadingSpinner = function() {\n return this.isLoading = true;\n };\n\n FavsBaseController.prototype._disableLoadingSpinner = function() {\n return this.isLoading = false;\n };\n\n FavsBaseController.prototype._enableScroll = function() {\n return this.scrollDisabled = false;\n };\n\n FavsBaseController.prototype._disableScroll = function() {\n return this.scrollDisabled = true;\n };\n\n FavsBaseController.prototype._checkIfHasMorePages = function(hasNext) {\n if (hasNext) {\n this._page += 1;\n return this._enableScroll();\n } else {\n return this._disableScroll();\n }\n };\n\n FavsBaseController.prototype._checkIfHasNoResults = function() {\n return this.hasNoResults = this.items.size === 0;\n };\n\n FavsBaseController.prototype.loadItems = function() {\n this._enableLoadingSpinner();\n this._disableScroll();\n return this._getItems(this.user.get(\"id\"), this._page, this.type, this.q).then((function(_this) {\n return function(response) {\n _this.items = _this.items.concat(response.get(\"data\"));\n _this._checkIfHasMorePages(response.get(\"next\"));\n _this._checkIfHasNoResults();\n _this._disableLoadingSpinner();\n return _this.items;\n };\n })(this))[\"catch\"]((function(_this) {\n return function() {\n _this._disableLoadingSpinner();\n return _this.items;\n };\n })(this));\n };\n\n FavsBaseController.prototype.filterByTextQuery = debounceLeading(500, function() {\n this._resetList();\n return this.loadItems();\n });\n\n FavsBaseController.prototype.showAll = function() {\n if (this.type !== null) {\n this.type = null;\n this._resetList();\n return this.loadItems();\n }\n };\n\n FavsBaseController.prototype.showProjectsOnly = function() {\n if (this.type !== \"project\") {\n this.type = \"project\";\n this._resetList();\n return this.loadItems();\n }\n };\n\n FavsBaseController.prototype.showUserStoriesOnly = function() {\n if (this.type !== \"userstory\") {\n this.type = \"userstory\";\n this._resetList();\n return this.loadItems();\n }\n };\n\n FavsBaseController.prototype.showTasksOnly = function() {\n if (this.type !== \"task\") {\n this.type = \"task\";\n this._resetList();\n return this.loadItems();\n }\n };\n\n FavsBaseController.prototype.showIssuesOnly = function() {\n if (this.type !== \"issue\") {\n this.type = \"issue\";\n this._resetList();\n return this.loadItems();\n }\n };\n\n return FavsBaseController;\n\n })();\n\n ProfileLikedController = (function(superClass) {\n extend(ProfileLikedController, superClass);\n\n ProfileLikedController.$inject = [\"tgUserService\"];\n\n function ProfileLikedController(userService) {\n this.userService = userService;\n ProfileLikedController.__super__.constructor.call(this);\n this.enableFilterByAll = false;\n this.enableFilterByProjects = false;\n this.enableFilterByUserStories = false;\n this.enableFilterByTasks = false;\n this.enableFilterByIssues = false;\n this.enableFilterByTextQuery = true;\n this._getItems = this.userService.getLiked;\n }\n\n return ProfileLikedController;\n\n })(FavsBaseController);\n\n angular.module(\"taigaProfile\").controller(\"ProfileLiked\", ProfileLikedController);\n\n ProfileVotedController = (function(superClass) {\n extend(ProfileVotedController, superClass);\n\n ProfileVotedController.$inject = [\"tgUserService\"];\n\n function ProfileVotedController(userService) {\n this.userService = userService;\n ProfileVotedController.__super__.constructor.call(this);\n this.enableFilterByAll = true;\n this.enableFilterByProjects = false;\n this.enableFilterByUserStories = true;\n this.enableFilterByTasks = true;\n this.enableFilterByIssues = true;\n this.enableFilterByTextQuery = true;\n this._getItems = this.userService.getVoted;\n }\n\n return ProfileVotedController;\n\n })(FavsBaseController);\n\n angular.module(\"taigaProfile\").controller(\"ProfileVoted\", ProfileVotedController);\n\n ProfileWatchedController = (function(superClass) {\n extend(ProfileWatchedController, superClass);\n\n ProfileWatchedController.$inject = [\"tgUserService\"];\n\n function ProfileWatchedController(userService) {\n this.userService = userService;\n ProfileWatchedController.__super__.constructor.call(this);\n this._getItems = this.userService.getWatched;\n }\n\n return ProfileWatchedController;\n\n })(FavsBaseController);\n\n angular.module(\"taigaProfile\").controller(\"ProfileWatched\", ProfileWatchedController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-favs.directive.coffee\n */\n\n(function() {\n var ProfileLikedDirective, ProfileVotedDirective, ProfileWatchedDirective, base;\n\n base = {\n scope: {},\n bindToController: {\n user: \"=\",\n type: \"@\",\n q: \"@\",\n scrollDisabled: \"@\",\n isLoading: \"@\",\n hasNoResults: \"@\"\n },\n controller: null,\n controllerAs: \"vm\",\n templateUrl: \"profile/profile-favs/profile-favs.html\"\n };\n\n ProfileLikedDirective = function() {\n return _.extend({}, base, {\n controller: \"ProfileLiked\"\n });\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileLiked\", ProfileLikedDirective);\n\n ProfileVotedDirective = function() {\n return _.extend({}, base, {\n controller: \"ProfileVoted\"\n });\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileVoted\", ProfileVotedDirective);\n\n ProfileWatchedDirective = function() {\n return _.extend({}, base, {\n controller: \"ProfileWatched\"\n });\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileWatched\", ProfileWatchedDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-hints.controller.coffee\n */\n\n(function() {\n var ProfileHints;\n\n ProfileHints = (function() {\n ProfileHints.prototype.HINTS = [\n {\n url: \"https://taiga.io/support/import-export-projects/\"\n }, {\n url: \"https://taiga.io/support/custom-fields/\"\n }, {}, {}\n ];\n\n function ProfileHints(translate) {\n var hintKey;\n this.translate = translate;\n hintKey = Math.floor(Math.random() * this.HINTS.length) + 1;\n this.hint = this.HINTS[hintKey - 1];\n this.hint.linkText = this.hint.linkText || 'HINTS.LINK';\n this.hint.title = this.translate.instant(\"HINTS.HINT\" + hintKey + \"_TITLE\");\n this.hint.text = this.translate.instant(\"HINTS.HINT\" + hintKey + \"_TEXT\");\n }\n\n return ProfileHints;\n\n })();\n\n ProfileHints.$inject = [\"$translate\"];\n\n angular.module(\"taigaProfile\").controller(\"ProfileHints\", ProfileHints);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-hints.directive.coffee\n */\n\n(function() {\n var ProfileHints;\n\n ProfileHints = function($translate) {\n return {\n scope: {},\n controller: \"ProfileHints\",\n controllerAs: \"vm\",\n templateUrl: \"profile/profile-hints/profile-hints.html\"\n };\n };\n\n ProfileHints.$inject = [\"$translate\"];\n\n angular.module(\"taigaProfile\").directive(\"tgProfileHints\", ProfileHints);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-projects.controller.coffee\n */\n\n(function() {\n var ProfileProjectsController;\n\n ProfileProjectsController = (function() {\n ProfileProjectsController.$inject = [\"tgProjectsService\", \"tgUserService\"];\n\n function ProfileProjectsController(projectsService, userService) {\n this.projectsService = projectsService;\n this.userService = userService;\n }\n\n ProfileProjectsController.prototype.loadProjects = function() {\n return this.projectsService.getProjectsByUserId(this.user.get(\"id\")).then((function(_this) {\n return function(projects) {\n return _this.userService.attachUserContactsToProjects(_this.user.get(\"id\"), projects);\n };\n })(this)).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n return ProfileProjectsController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"ProfileProjects\", ProfileProjectsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-projects.directive.coffee\n */\n\n(function() {\n var ProfileProjectsDirective;\n\n ProfileProjectsDirective = function() {\n var link;\n link = function(scope, elm, attr, ctrl) {\n return ctrl.loadProjects();\n };\n return {\n templateUrl: \"profile/profile-projects/profile-projects.html\",\n scope: {\n user: \"=\"\n },\n link: link,\n bindToController: true,\n controllerAs: \"vm\",\n controller: \"ProfileProjects\"\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileProjects\", ProfileProjectsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-tab.directive.coffee\n */\n\n(function() {\n var ProfileTabDirective;\n\n ProfileTabDirective = function() {\n var link;\n link = function(scope, element, attrs, ctrl, transclude) {\n scope.tab = {};\n attrs.$observe(\"tgProfileTab\", function(name) {\n return scope.tab.name = name;\n });\n attrs.$observe(\"tabTitle\", function(title) {\n return scope.tab.title = title;\n });\n scope.tab.icon = attrs.tabIcon;\n scope.tab.active = !!attrs.tabActive;\n if (scope.$eval(attrs.tabDisabled) !== true) {\n return ctrl.addTab(scope.tab);\n }\n };\n return {\n templateUrl: \"profile/profile-tab/profile-tab.html\",\n scope: {},\n require: \"^tgProfileTabs\",\n link: link,\n transclude: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileTab\", ProfileTabDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-tabs.controller.coffee\n */\n\n(function() {\n var ProfileTabsController;\n\n ProfileTabsController = (function() {\n function ProfileTabsController() {\n this.tabs = [];\n }\n\n ProfileTabsController.prototype.addTab = function(tab) {\n return this.tabs.push(tab);\n };\n\n ProfileTabsController.prototype.toggleTab = function(tab) {\n _.map(this.tabs, function(tab) {\n return tab.active = false;\n });\n return tab.active = true;\n };\n\n return ProfileTabsController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"ProfileTabs\", ProfileTabsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-tabs.directive.coffee\n */\n\n(function() {\n var ProfileTabsDirective;\n\n ProfileTabsDirective = function() {\n return {\n scope: {},\n controller: \"ProfileTabs\",\n controllerAs: \"vm\",\n templateUrl: \"profile/profile-tabs/profile-tabs.html\",\n transclude: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileTabs\", ProfileTabsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile.controller.coffee\n */\n\n(function() {\n var ProfileController;\n\n ProfileController = (function() {\n ProfileController.$inject = [\"tgAppMetaService\", \"tgCurrentUserService\", \"$routeParams\", \"tgUserService\", \"tgXhrErrorService\", \"$translate\"];\n\n function ProfileController(appMetaService, currentUserService, routeParams, userService, xhrError, translate) {\n this.appMetaService = appMetaService;\n this.currentUserService = currentUserService;\n this.routeParams = routeParams;\n this.userService = userService;\n this.xhrError = xhrError;\n this.translate = translate;\n this.isCurrentUser = false;\n if (this.routeParams.slug) {\n this.userService.getUserByUserName(this.routeParams.slug).then((function(_this) {\n return function(user) {\n if (!user.get('is_active')) {\n return _this.xhrError.notFound();\n } else {\n _this.user = user;\n _this.isCurrentUser = false;\n _this._setMeta(_this.user);\n return user;\n }\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n return _this.xhrError.response(xhr);\n };\n })(this));\n } else {\n this.user = this.currentUserService.getUser();\n this.isCurrentUser = true;\n this._setMeta(this.user);\n }\n }\n\n ProfileController.prototype._setMeta = function(user) {\n var ctx, description, title;\n ctx = {\n userFullName: user.get(\"full_name_display\"),\n userUsername: user.get(\"username\")\n };\n title = this.translate.instant(\"USER.PROFILE.PAGE_TITLE\", ctx);\n description = user.get(\"bio\");\n return this.appMetaService.setAll(title, description);\n };\n\n return ProfileController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"Profile\", ProfileController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: like-project-button.controller.coffee\n */\n\n(function() {\n var LikeProjectButtonController;\n\n LikeProjectButtonController = (function() {\n LikeProjectButtonController.$inject = [\"$tgConfirm\", \"tgLikeProjectButtonService\"];\n\n function LikeProjectButtonController(confirm, likeButtonService) {\n this.confirm = confirm;\n this.likeButtonService = likeButtonService;\n this.isMouseOver = false;\n this.loading = false;\n }\n\n LikeProjectButtonController.prototype.showTextWhenMouseIsOver = function() {\n return this.isMouseOver = true;\n };\n\n LikeProjectButtonController.prototype.showTextWhenMouseIsLeave = function() {\n return this.isMouseOver = false;\n };\n\n LikeProjectButtonController.prototype.toggleLike = function() {\n var promise;\n this.loading = true;\n if (!this.project.get(\"is_fan\")) {\n promise = this._like();\n } else {\n promise = this._unlike();\n }\n promise[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n return promise;\n };\n\n LikeProjectButtonController.prototype._like = function() {\n return this.likeButtonService.like(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.showTextWhenMouseIsLeave();\n };\n })(this))[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this));\n };\n\n LikeProjectButtonController.prototype._unlike = function() {\n return this.likeButtonService.unlike(this.project.get('id'))[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this));\n };\n\n return LikeProjectButtonController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"LikeProjectButton\", LikeProjectButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: like-project-button.directive.coffee\n */\n\n(function() {\n var LikeProjectButtonDirective;\n\n LikeProjectButtonDirective = function() {\n return {\n scope: {},\n controller: \"LikeProjectButton\",\n bindToController: {\n project: '='\n },\n controllerAs: \"vm\",\n templateUrl: \"projects/components/like-project-button/like-project-button.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgLikeProjectButton\", LikeProjectButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: like-project-button.service.coffee\n */\n\n(function() {\n var LikeProjectButtonService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n LikeProjectButtonService = (function(superClass) {\n extend(LikeProjectButtonService, superClass);\n\n LikeProjectButtonService.$inject = [\"tgResources\", \"tgCurrentUserService\", \"tgProjectService\"];\n\n function LikeProjectButtonService(rs, currentUserService, projectService) {\n this.rs = rs;\n this.currentUserService = currentUserService;\n this.projectService = projectService;\n }\n\n LikeProjectButtonService.prototype._getProjectIndex = function(projectId) {\n return this.currentUserService.projects.get('all').findIndex(function(project) {\n return project.get('id') === projectId;\n });\n };\n\n LikeProjectButtonService.prototype._updateProjects = function(projectId, isFan) {\n var projectIndex, projects;\n projectIndex = this._getProjectIndex(projectId);\n if (projectIndex === -1) {\n return;\n }\n projects = this.currentUserService.projects.get('all').update(projectIndex, function(project) {\n var totalFans;\n totalFans = project.get(\"total_fans\");\n if (isFan) {\n totalFans++;\n } else {\n totalFans--;\n }\n return project.merge({\n is_fan: isFan,\n total_fans: totalFans\n });\n });\n return this.currentUserService.setProjects(projects);\n };\n\n LikeProjectButtonService.prototype._updateCurrentProject = function(isFan) {\n var project, totalFans;\n totalFans = this.projectService.project.get(\"total_fans\");\n if (isFan) {\n totalFans++;\n } else {\n totalFans--;\n }\n project = this.projectService.project.merge({\n is_fan: isFan,\n total_fans: totalFans\n });\n return this.projectService.setProject(project);\n };\n\n LikeProjectButtonService.prototype.like = function(projectId) {\n return this.rs.projects.likeProject(projectId).then((function(_this) {\n return function() {\n _this._updateProjects(projectId, true);\n return _this._updateCurrentProject(true);\n };\n })(this));\n };\n\n LikeProjectButtonService.prototype.unlike = function(projectId) {\n return this.rs.projects.unlikeProject(projectId).then((function(_this) {\n return function() {\n _this._updateProjects(projectId, false);\n return _this._updateCurrentProject(false);\n };\n })(this));\n };\n\n return LikeProjectButtonService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgLikeProjectButtonService\", LikeProjectButtonService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: sort-projects.directive.coffee\n */\n\n(function() {\n var SortProjectsDirective;\n\n SortProjectsDirective = function(currentUserService) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n var itemEl;\n itemEl = null;\n el.sortable({\n dropOnEmpty: true,\n revert: 200,\n axis: \"y\",\n opacity: .95,\n placeholder: 'placeholder',\n cancel: '.project-name'\n });\n return el.on(\"sortstop\", function(event, ui) {\n var i, index, len, project, sortData, sorted_project_ids, value;\n itemEl = ui.item;\n project = itemEl.scope().project;\n index = itemEl.index();\n sorted_project_ids = _.map(scope.projects.toJS(), function(p) {\n return p.id;\n });\n sorted_project_ids = _.without(sorted_project_ids, project.get(\"id\"));\n sorted_project_ids.splice(index, 0, project.get('id'));\n sortData = [];\n for (index = i = 0, len = sorted_project_ids.length; i < len; index = ++i) {\n value = sorted_project_ids[index];\n sortData.push({\n \"project_id\": value,\n \"order\": index\n });\n }\n return currentUserService.bulkUpdateProjectsOrder(sortData);\n });\n };\n directive = {\n scope: {\n projects: \"=tgSortProjects\"\n },\n link: link\n };\n return directive;\n };\n\n angular.module(\"taigaProjects\").directive(\"tgSortProjects\", [\"tgCurrentUserService\", SortProjectsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-project-button.controller.coffee\n */\n\n(function() {\n var WatchProjectButtonController;\n\n WatchProjectButtonController = (function() {\n WatchProjectButtonController.$inject = [\"$tgConfirm\", \"tgWatchProjectButtonService\"];\n\n function WatchProjectButtonController(confirm, watchButtonService) {\n this.confirm = confirm;\n this.watchButtonService = watchButtonService;\n this.showWatchOptions = false;\n this.loading = false;\n }\n\n WatchProjectButtonController.prototype.toggleWatcherOptions = function() {\n return this.showWatchOptions = !this.showWatchOptions;\n };\n\n WatchProjectButtonController.prototype.closeWatcherOptions = function() {\n return this.showWatchOptions = false;\n };\n\n WatchProjectButtonController.prototype.watch = function(notifyLevel) {\n if (notifyLevel === this.project.get('notify_level')) {\n return;\n }\n this.loading = true;\n this.closeWatcherOptions();\n return this.watchButtonService.watch(this.project.get('id'), notifyLevel)[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this))[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n };\n\n WatchProjectButtonController.prototype.unwatch = function() {\n this.loading = true;\n this.closeWatcherOptions();\n return this.watchButtonService.unwatch(this.project.get('id'))[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this))[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n };\n\n return WatchProjectButtonController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"WatchProjectButton\", WatchProjectButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-project-button.directive.coffee\n */\n\n(function() {\n var WatchProjectButtonDirective;\n\n WatchProjectButtonDirective = function() {\n return {\n scope: {},\n controller: \"WatchProjectButton\",\n bindToController: {\n project: \"=\"\n },\n controllerAs: \"vm\",\n templateUrl: \"projects/components/watch-project-button/watch-project-button.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgWatchProjectButton\", WatchProjectButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-project-button.service.coffee\n */\n\n(function() {\n var WatchProjectButtonService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n WatchProjectButtonService = (function(superClass) {\n extend(WatchProjectButtonService, superClass);\n\n WatchProjectButtonService.$inject = [\"tgResources\", \"tgCurrentUserService\", \"tgProjectService\"];\n\n function WatchProjectButtonService(rs, currentUserService, projectService) {\n this.rs = rs;\n this.currentUserService = currentUserService;\n this.projectService = projectService;\n }\n\n WatchProjectButtonService.prototype._getProjectIndex = function(projectId) {\n return this.currentUserService.projects.get('all').findIndex(function(project) {\n return project.get('id') === projectId;\n });\n };\n\n WatchProjectButtonService.prototype._updateProjects = function(projectId, notifyLevel, isWatcher) {\n var projectIndex, projects;\n projectIndex = this._getProjectIndex(projectId);\n if (projectIndex === -1) {\n return;\n }\n projects = this.currentUserService.projects.get('all').update(projectIndex, (function(_this) {\n return function(project) {\n var totalWatchers;\n totalWatchers = project.get('total_watchers');\n if (!_this.projectService.project.get('is_watcher') && isWatcher) {\n totalWatchers++;\n } else if (_this.projectService.project.get('is_watcher') && !isWatcher) {\n totalWatchers--;\n }\n return project.merge({\n is_watcher: isWatcher,\n total_watchers: totalWatchers,\n notify_level: notifyLevel\n });\n };\n })(this));\n return this.currentUserService.setProjects(projects);\n };\n\n WatchProjectButtonService.prototype._updateCurrentProject = function(notifyLevel, isWatcher) {\n var project, totalWatchers;\n totalWatchers = this.projectService.project.get(\"total_watchers\");\n if (!this.projectService.project.get('is_watcher') && isWatcher) {\n totalWatchers++;\n } else if (this.projectService.project.get('is_watcher') && !isWatcher) {\n totalWatchers--;\n }\n project = this.projectService.project.merge({\n is_watcher: isWatcher,\n notify_level: notifyLevel,\n total_watchers: totalWatchers\n });\n return this.projectService.setProject(project);\n };\n\n WatchProjectButtonService.prototype.watch = function(projectId, notifyLevel) {\n return this.rs.projects.watchProject(projectId, notifyLevel).then((function(_this) {\n return function() {\n _this._updateProjects(projectId, notifyLevel, true);\n return _this._updateCurrentProject(notifyLevel, true);\n };\n })(this));\n };\n\n WatchProjectButtonService.prototype.unwatch = function(projectId) {\n return this.rs.projects.unwatchProject(projectId).then((function(_this) {\n return function() {\n _this._updateProjects(projectId, null, false);\n return _this._updateCurrentProject(null, false);\n };\n })(this));\n };\n\n return WatchProjectButtonService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgWatchProjectButtonService\", WatchProjectButtonService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: projects-listing.controller.coffee\n */\n\n(function() {\n var ProjectsListingController;\n\n ProjectsListingController = (function() {\n ProjectsListingController.$inject = [\"tgCurrentUserService\", \"tgProjectsService\"];\n\n function ProjectsListingController(currentUserService, projectsService) {\n this.currentUserService = currentUserService;\n this.projectsService = projectsService;\n taiga.defineImmutableProperty(this, \"projects\", (function(_this) {\n return function() {\n return _this.currentUserService.projects.get(\"all\");\n };\n })(this));\n }\n\n ProjectsListingController.prototype.newProject = function() {\n return this.projectsService.newProject();\n };\n\n return ProjectsListingController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ProjectsListing\", ProjectsListingController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project.controller.coffee\n */\n\n(function() {\n var ProjectController;\n\n ProjectController = (function() {\n ProjectController.$inject = [\"$routeParams\", \"tgAppMetaService\", \"$tgAuth\", \"$translate\", \"tgProjectService\"];\n\n function ProjectController(routeParams, appMetaService, auth, translate, projectService) {\n var projectSlug;\n this.routeParams = routeParams;\n this.appMetaService = appMetaService;\n this.auth = auth;\n this.translate = translate;\n this.projectService = projectService;\n projectSlug = this.routeParams.pslug;\n this.user = this.auth.userData;\n taiga.defineImmutableProperty(this, \"project\", (function(_this) {\n return function() {\n return _this.projectService.project;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"members\", (function(_this) {\n return function() {\n return _this.projectService.activeMembers;\n };\n })(this));\n this.appMetaService.setfn(this._setMeta.bind(this));\n }\n\n ProjectController.prototype._setMeta = function(project) {\n var ctx, metas;\n if (!this.project) {\n return null;\n }\n metas = {};\n ctx = {\n projectName: this.project.get(\"name\")\n };\n metas.title = this.translate.instant(\"PROJECT.PAGE_TITLE\", ctx);\n metas.description = this.project.get(\"description\");\n return metas;\n };\n\n return ProjectController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"Project\", ProjectController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: projects.service.coffee\n */\n\n(function() {\n var ProjectsService, groupBy, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n ProjectsService = (function(superClass) {\n extend(ProjectsService, superClass);\n\n ProjectsService.$inject = [\"tgResources\", \"$projectUrl\", \"tgLightboxFactory\"];\n\n function ProjectsService(rs, projectUrl, lightboxFactory) {\n this.rs = rs;\n this.projectUrl = projectUrl;\n this.lightboxFactory = lightboxFactory;\n }\n\n ProjectsService.prototype.getProjectBySlug = function(projectSlug) {\n return this.rs.projects.getProjectBySlug(projectSlug).then((function(_this) {\n return function(project) {\n return _this._decorate(project);\n };\n })(this));\n };\n\n ProjectsService.prototype.getProjectStats = function(projectId) {\n return this.rs.projects.getProjectStats(projectId);\n };\n\n ProjectsService.prototype.getProjectsByUserId = function(userId, paginate) {\n return this.rs.projects.getProjectsByUserId(userId, paginate).then((function(_this) {\n return function(projects) {\n return projects.map(_this._decorate.bind(_this));\n };\n })(this));\n };\n\n ProjectsService.prototype._decorate = function(project) {\n var colorized_tags, tags, url;\n url = this.projectUrl.get(project.toJS());\n project = project.set(\"url\", url);\n colorized_tags = [];\n if (project.get(\"tags\")) {\n tags = project.get(\"tags\").sort();\n colorized_tags = tags.map(function(tag) {\n var color;\n color = project.get(\"tags_colors\").get(tag);\n return Immutable.fromJS({\n name: tag,\n color: color\n });\n });\n project = project.set(\"colorized_tags\", colorized_tags);\n }\n return project;\n };\n\n ProjectsService.prototype.newProject = function() {\n return this.lightboxFactory.create(\"tg-lb-create-project\", {\n \"class\": \"wizard-create-project\"\n });\n };\n\n ProjectsService.prototype.bulkUpdateProjectsOrder = function(sortData) {\n return this.rs.projects.bulkUpdateOrder(sortData);\n };\n\n return ProjectsService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgProjectsService\", ProjectsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-resource.service.coffee\n */\n\n(function() {\n var Resource, module, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n Resource = function(urlsService, http, config, $rootScope, $q, storage) {\n var service;\n service = {};\n service.list = function(type, objectId, projectId) {\n var httpOptions, params, url, urlname;\n urlname = \"attachments/\" + type;\n params = {\n object_id: objectId,\n project: projectId\n };\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n url = urlsService.resolve(urlname);\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service[\"delete\"] = function(type, id) {\n var url, urlname;\n urlname = \"attachments/\" + type;\n url = urlsService.resolve(urlname) + (\"/\" + id);\n return http[\"delete\"](url);\n };\n service.patch = function(type, id, patch) {\n var url, urlname;\n urlname = \"attachments/\" + type;\n url = urlsService.resolve(urlname) + (\"/\" + id);\n return http.patch(url, patch);\n };\n service.create = function(type, projectId, objectId, file) {\n var data, defered, maxFileSize, response, token, uploadComplete, uploadFailed, uploadProgress, url, urlname, xhr;\n urlname = \"attachments/\" + type;\n url = urlsService.resolve(urlname);\n defered = $q.defer();\n if (file === void 0) {\n defered.reject(null);\n return defered.promise;\n }\n maxFileSize = config.get(\"maxUploadFileSize\", null);\n if (maxFileSize && file.size > maxFileSize) {\n response = {\n status: 413,\n data: {\n _error_message: \"'\" + file.name + \"' (\" + (sizeFormat(file.size)) + \") is too heavy for our oompa loompas, try it with a smaller than (\" + (sizeFormat(maxFileSize)) + \")\"\n }\n };\n defered.reject(response);\n return defered.promise;\n }\n uploadProgress = (function(_this) {\n return function(evt) {\n return $rootScope.$apply(function() {\n file.status = \"in-progress\";\n file.size = sizeFormat(evt.total);\n file.progressMessage = \"upload \" + (sizeFormat(evt.loaded)) + \" of \" + (sizeFormat(evt.total));\n return file.progressPercent = (Math.round((evt.loaded / evt.total) * 100)) + \"%\";\n });\n };\n })(this);\n uploadComplete = (function(_this) {\n return function(evt) {\n return $rootScope.$apply(function() {\n var attachment, error, ref, status;\n file.status = \"done\";\n status = evt.target.status;\n try {\n attachment = JSON.parse(evt.target.responseText);\n } catch (error) {\n attachment = {};\n }\n if (status >= 200 && status < 400) {\n attachment = Immutable.fromJS(attachment);\n return defered.resolve(attachment);\n } else {\n response = {\n status: status,\n data: {\n _error_message: (ref = data['attached_file']) != null ? ref[0] : void 0\n }\n };\n return defered.reject(response);\n }\n });\n };\n })(this);\n uploadFailed = (function(_this) {\n return function(evt) {\n return $rootScope.$apply(function() {\n file.status = \"error\";\n return defered.reject(\"fail\");\n });\n };\n })(this);\n data = new FormData();\n data.append(\"project\", projectId);\n data.append(\"object_id\", objectId);\n data.append(\"attached_file\", file);\n xhr = new XMLHttpRequest();\n xhr.upload.addEventListener(\"progress\", uploadProgress, false);\n xhr.addEventListener(\"load\", uploadComplete, false);\n xhr.addEventListener(\"error\", uploadFailed, false);\n token = storage.get('token');\n xhr.open(\"POST\", url);\n xhr.setRequestHeader(\"Authorization\", \"Bearer \" + token);\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send(data);\n return defered.promise;\n };\n return function() {\n return {\n \"attachments\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\", \"$tgConfig\", \"$rootScope\", \"$q\", \"$tgStorage\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgAttachmentsResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: external-apps-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.getApplicationToken = function(applicationId, state) {\n var url;\n url = urlsService.resolve(\"applications\");\n url = url + \"/\" + applicationId + \"/token?state=\" + state;\n return http.get(url).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.authorizeApplicationToken = function(applicationId, state) {\n var data, url;\n url = urlsService.resolve(\"application-tokens\");\n url = url + \"/authorize\";\n data = {\n \"state\": state,\n \"application\": applicationId\n };\n return http.post(url, data).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"externalapps\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgExternalAppsResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: issues-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.listInAllProjects = function(params) {\n var httpOptions, url;\n url = urlsService.resolve(\"issues\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"issues\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgIssuesResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: projects-resource.service.coffee\n */\n\n(function() {\n var Resource, module, pagination;\n\n pagination = function() {};\n\n Resource = function(urlsService, http, paginateResponseService) {\n var service;\n service = {};\n service.getProjects = function(params, pagination) {\n var httpOptions, url;\n if (params == null) {\n params = {};\n }\n if (pagination == null) {\n pagination = true;\n }\n url = urlsService.resolve(\"projects\");\n httpOptions = {};\n if (!pagination) {\n httpOptions = {\n headers: {\n \"x-lazy-pagination\": true\n }\n };\n }\n return http.get(url, params, httpOptions);\n };\n service.getProjectBySlug = function(projectSlug) {\n var url;\n url = urlsService.resolve(\"projects\");\n url = url + \"/by_slug?slug=\" + projectSlug;\n return http.get(url).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getProjectsByUserId = function(userId, paginate) {\n var httpOptions, params, url;\n if (paginate == null) {\n paginate = false;\n }\n url = urlsService.resolve(\"projects\");\n httpOptions = {};\n if (!paginate) {\n httpOptions.headers = {\n \"x-disable-pagination\": \"1\"\n };\n }\n params = {\n \"member\": userId,\n \"order_by\": \"memberships__user_order\"\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getProjectStats = function(projectId) {\n var url;\n url = urlsService.resolve(\"projects\");\n url = url + \"/\" + projectId;\n return http.get(url).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.bulkUpdateOrder = function(bulkData) {\n var url;\n url = urlsService.resolve(\"bulk-update-projects-order\");\n return http.post(url, bulkData);\n };\n service.getTimeline = function(projectId, page) {\n var params, url;\n params = {\n page: page,\n only_relevant: true\n };\n url = urlsService.resolve(\"timeline-project\");\n url = url + \"/\" + projectId;\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.likeProject = function(projectId) {\n var url;\n url = urlsService.resolve(\"project-like\", projectId);\n return http.post(url);\n };\n service.unlikeProject = function(projectId) {\n var url;\n url = urlsService.resolve(\"project-unlike\", projectId);\n return http.post(url);\n };\n service.watchProject = function(projectId, notifyLevel) {\n var data, url;\n data = {\n notify_level: notifyLevel\n };\n url = urlsService.resolve(\"project-watch\", projectId);\n return http.post(url, data);\n };\n service.unwatchProject = function(projectId) {\n var url;\n url = urlsService.resolve(\"project-unwatch\", projectId);\n return http.post(url);\n };\n return function() {\n return {\n \"projects\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\", \"tgPaginateResponseService\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgProjectsResources\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: resources.coffee\n */\n\n(function() {\n var Resources, services;\n\n services = [\"tgProjectsResources\", \"tgUserResources\", \"tgUsersResources\", \"tgUserstoriesResource\", \"tgTasksResource\", \"tgIssuesResource\", \"tgExternalAppsResource\", \"tgAttachmentsResource\", \"tgStatsResource\"];\n\n Resources = function($injector) {\n var i, j, len, len1, ref, service, serviceFn, serviceName, serviceProperty;\n for (i = 0, len = services.length; i < len; i++) {\n serviceName = services[i];\n serviceFn = $injector.get(serviceName);\n service = $injector.invoke(serviceFn);\n ref = Object.keys(service);\n for (j = 0, len1 = ref.length; j < len1; j++) {\n serviceProperty = ref[j];\n if (this[serviceProperty]) {\n console.warm(\"repeated resource \" + serviceProperty);\n }\n this[serviceProperty] = service[serviceProperty];\n }\n }\n return this;\n };\n\n Resources.$inject = [\"$injector\"];\n\n angular.module(\"taigaResources2\").service(\"tgResources\", Resources);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: stats-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.discover = function(applicationId, state) {\n var url;\n url = urlsService.resolve(\"stats-discover\");\n return http.get(url).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"stats\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgStatsResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tasks-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.listInAllProjects = function(params) {\n var httpOptions, url;\n url = urlsService.resolve(\"tasks\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"tasks\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgTasksResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http, paginateResponseService) {\n var service;\n service = {};\n service.getUserStorage = function(key) {\n var httpOptions, url;\n url = urlsService.resolve(\"user-storage\");\n if (key) {\n url += '/' + key;\n }\n httpOptions = {};\n return http.get(url, {}).then(function(response) {\n return response.data.value;\n });\n };\n service.setUserStorage = function(key, value) {\n var params, url;\n url = urlsService.resolve(\"user-storage\") + '/' + key;\n params = {\n key: key,\n value: value\n };\n return http.put(url, params);\n };\n service.createUserStorage = function(key, value) {\n var params, url;\n url = urlsService.resolve(\"user-storage\");\n params = {\n key: key,\n value: value\n };\n return http.post(url, params);\n };\n return function() {\n return {\n \"user\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgUserResources\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: users-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http, paginateResponseService) {\n var service;\n service = {};\n service.getUserByUsername = function(username) {\n var httpOptions, params, url;\n url = urlsService.resolve(\"by_username\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n params = {\n username: username\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getStats = function(userId) {\n var httpOptions, url;\n url = urlsService.resolve(\"user-stats\", userId);\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, {}, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getContacts = function(userId) {\n var httpOptions, url;\n url = urlsService.resolve(\"user-contacts\", userId);\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, {}, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getLiked = function(userId, page, type, q) {\n var params, url;\n url = urlsService.resolve(\"user-liked\", userId);\n params = {};\n if (page != null) {\n params.page = page;\n }\n if (type != null) {\n params.type = type;\n }\n if (q != null) {\n params.q = q;\n }\n params.only_relevant = true;\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.getVoted = function(userId, page, type, q) {\n var params, url;\n url = urlsService.resolve(\"user-voted\", userId);\n params = {};\n if (page != null) {\n params.page = page;\n }\n if (type != null) {\n params.type = type;\n }\n if (q != null) {\n params.q = q;\n }\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.getWatched = function(userId, page, type, q) {\n var params, url;\n url = urlsService.resolve(\"user-watched\", userId);\n params = {};\n if (page != null) {\n params.page = page;\n }\n if (type != null) {\n params.type = type;\n }\n if (q != null) {\n params.q = q;\n }\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.getProfileTimeline = function(userId, page) {\n var params, url;\n params = {\n page: page\n };\n url = urlsService.resolve(\"timeline-profile\");\n url = url + \"/\" + userId;\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.getUserTimeline = function(userId, page) {\n var params, url;\n params = {\n page: page,\n only_relevant: true\n };\n url = urlsService.resolve(\"timeline-user\");\n url = url + \"/\" + userId;\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n return function() {\n return {\n \"users\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\", \"tgPaginateResponseService\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgUsersResources\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: userstories-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.listInAllProjects = function(params) {\n var httpOptions, url;\n url = urlsService.resolve(\"userstories\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"userstories\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgUserstoriesResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: app-meta.service.coffee\n */\n\n(function() {\n var AppMetaService, taiga, truncate;\n\n taiga = this.taiga;\n\n truncate = taiga.truncate;\n\n AppMetaService = (function() {\n AppMetaService.$inject = [\"$rootScope\"];\n\n function AppMetaService(rootScope) {\n this.rootScope = rootScope;\n }\n\n AppMetaService.prototype._set = function(key, value) {\n var meta;\n if (!key) {\n return;\n }\n if (key === \"title\") {\n meta = $(\"title\");\n if (meta.length === 0) {\n meta = $(\"\");\n $(\"head\").append(meta);\n }\n return meta.text(value || \"\");\n } else if (key.indexOf(\"og:\") === 0) {\n meta = $(\"meta[property='\" + key + \"']\");\n if (meta.length === 0) {\n meta = $(\"\");\n $(\"head\").append(meta);\n }\n return meta.attr(\"content\", value || \"\");\n } else {\n meta = $(\"meta[name='\" + key + \"']\");\n if (meta.length === 0) {\n meta = $(\"\");\n $(\"head\").append(meta);\n }\n return meta.attr(\"content\", value || \"\");\n }\n };\n\n AppMetaService.prototype.setTitle = function(title) {\n return this._set('title', title);\n };\n\n AppMetaService.prototype.setDescription = function(description) {\n return this._set(\"description\", truncate(description, 250));\n };\n\n AppMetaService.prototype.setTwitterMetas = function(title, description) {\n this._set(\"twitter:card\", \"summary\");\n this._set(\"twitter:site\", \"@taigaio\");\n this._set(\"twitter:title\", title);\n this._set(\"twitter:description\", truncate(description, 300));\n return this._set(\"twitter:image\", window.location.origin + \"/\" + window._version + \"/images/logo-color.png\");\n };\n\n AppMetaService.prototype.setOpenGraphMetas = function(title, description) {\n this._set(\"og:type\", \"object\");\n this._set(\"og:site_name\", \"Taiga - Love your projects\");\n this._set(\"og:title\", title);\n this._set(\"og:description\", truncate(description, 300));\n this._set(\"og:image\", window.location.origin + \"/\" + window._version + \"/images/logo-color.png\");\n return this._set(\"og:url\", window.location.href);\n };\n\n AppMetaService.prototype.setAll = function(title, description) {\n this.setTitle(title);\n this.setDescription(description);\n this.setTwitterMetas(title, description);\n return this.setOpenGraphMetas(title, description);\n };\n\n AppMetaService.prototype.addMobileViewport = function() {\n return $(\"head\").append(\"\");\n };\n\n AppMetaService.prototype.removeMobileViewport = function() {\n return $(\"meta[name=\\\"viewport\\\"]\").remove();\n };\n\n AppMetaService.prototype.setfn = function(fn) {\n if (this.listener) {\n this._listener();\n }\n return this._listener = this.rootScope.$watchCollection(fn, (function(_this) {\n return function(metas) {\n if (metas) {\n _this.setAll(metas.title, metas.description);\n return _this._listener();\n }\n };\n })(this));\n };\n\n return AppMetaService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgAppMetaService\", AppMetaService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments.service.coffee\n */\n\n(function() {\n var AttachmentsService, sizeFormat;\n\n sizeFormat = this.taiga.sizeFormat;\n\n AttachmentsService = (function() {\n AttachmentsService.$inject = [\"$tgConfirm\", \"$tgConfig\", \"$translate\", \"tgResources\"];\n\n function AttachmentsService(confirm, config, translate, rs) {\n this.confirm = confirm;\n this.config = config;\n this.translate = translate;\n this.rs = rs;\n this.maxFileSize = this.getMaxFileSize();\n if (this.maxFileSize) {\n this.maxFileSizeFormated = sizeFormat(this.maxFileSize);\n }\n }\n\n AttachmentsService.prototype.sizeError = function(file) {\n var message;\n message = this.translate.instant(\"ATTACHMENT.ERROR_MAX_SIZE_EXCEEDED\", {\n fileName: file.name,\n fileSize: sizeFormat(file.size),\n maxFileSize: this.maxFileSizeFormated\n });\n return this.confirm.notify(\"error\", message);\n };\n\n AttachmentsService.prototype.validate = function(file) {\n if (this.maxFileSize && file.size > this.maxFileSize) {\n this.sizeError(file);\n return false;\n }\n return true;\n };\n\n AttachmentsService.prototype.getMaxFileSize = function() {\n return this.config.get(\"maxUploadFileSize\", null);\n };\n\n AttachmentsService.prototype.list = function(type, objId, projectId) {\n return this.rs.attachments.list(type, objId, projectId).then((function(_this) {\n return function(attachments) {\n return attachments.sortBy(function(attachment) {\n return attachment.get('order');\n });\n };\n })(this));\n };\n\n AttachmentsService.prototype[\"delete\"] = function(type, id) {\n return this.rs.attachments[\"delete\"](type, id);\n };\n\n AttachmentsService.prototype.saveError = function(file, data) {\n var message;\n message = \"\";\n if (file) {\n message = this.translate.instant(\"ATTACHMENT.ERROR_UPLOAD_ATTACHMENT\", {\n fileName: file.name,\n errorMessage: data.data._error_message\n });\n }\n return this.confirm.notify(\"error\", message);\n };\n\n AttachmentsService.prototype.upload = function(file, objId, projectId, type) {\n var promise;\n promise = this.rs.attachments.create(type, projectId, objId, file);\n promise.then(null, this.saveError.bind(this, file));\n return promise;\n };\n\n AttachmentsService.prototype.patch = function(id, type, patch) {\n var promise;\n promise = this.rs.attachments.patch(type, id, patch);\n promise.then(null, this.saveError.bind(this, null));\n return promise;\n };\n\n return AttachmentsService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgAttachmentsService\", AttachmentsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: check-permissions.service.coffee\n */\n\n(function() {\n var ChekcPermissionsService, taiga;\n\n taiga = this.taiga;\n\n ChekcPermissionsService = (function() {\n ChekcPermissionsService.$inject = [\"tgProjectService\"];\n\n function ChekcPermissionsService(projectService) {\n this.projectService = projectService;\n }\n\n ChekcPermissionsService.prototype.check = function(permission) {\n return this.projectService.project.get('my_permissions').indexOf(permission) !== -1;\n };\n\n return ChekcPermissionsService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgCheckPermissionsService\", ChekcPermissionsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: current-user.service.coffee\n */\n\n(function() {\n var CurrentUserService, groupBy, taiga;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n CurrentUserService = (function() {\n CurrentUserService.$inject = [\"tgProjectsService\", \"$tgStorage\", \"tgResources\"];\n\n function CurrentUserService(projectsService, storageService, rs) {\n this.projectsService = projectsService;\n this.storageService = storageService;\n this.rs = rs;\n this._user = null;\n this._projects = Immutable.Map();\n this._projectsById = Immutable.Map();\n this._joyride = null;\n taiga.defineImmutableProperty(this, \"projects\", (function(_this) {\n return function() {\n return _this._projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"projectsById\", (function(_this) {\n return function() {\n return _this._projectsById;\n };\n })(this));\n }\n\n CurrentUserService.prototype.isAuthenticated = function() {\n if (this.getUser() !== null) {\n return true;\n }\n return false;\n };\n\n CurrentUserService.prototype.getUser = function() {\n var userData;\n if (!this._user) {\n userData = this.storageService.get(\"userInfo\");\n if (userData) {\n userData = Immutable.fromJS(userData);\n this.setUser(userData);\n }\n }\n return this._user;\n };\n\n CurrentUserService.prototype.removeUser = function() {\n this._user = null;\n this._projects = Immutable.Map();\n this._projectsById = Immutable.Map();\n return this._joyride = null;\n };\n\n CurrentUserService.prototype.setUser = function(user) {\n this._user = user;\n return this._loadUserInfo();\n };\n\n CurrentUserService.prototype.bulkUpdateProjectsOrder = function(sortData) {\n return this.projectsService.bulkUpdateProjectsOrder(sortData).then((function(_this) {\n return function() {\n return _this.loadProjects();\n };\n })(this));\n };\n\n CurrentUserService.prototype.loadProjects = function() {\n return this.projectsService.getProjectsByUserId(this._user.get(\"id\")).then((function(_this) {\n return function(projects) {\n return _this.setProjects(projects);\n };\n })(this));\n };\n\n CurrentUserService.prototype.disableJoyRide = function(section) {\n if (section) {\n this._joyride[section] = false;\n } else {\n this._joyride = {\n backlog: false,\n kanban: false,\n dashboard: false\n };\n }\n return this.rs.user.setUserStorage('joyride', this._joyride);\n };\n\n CurrentUserService.prototype.loadJoyRideConfig = function() {\n return new Promise((function(_this) {\n return function(resolve) {\n if (_this._joyride !== null) {\n resolve(_this._joyride);\n return;\n }\n return _this.rs.user.getUserStorage('joyride').then(function(config) {\n _this._joyride = config;\n return resolve(_this._joyride);\n })[\"catch\"](function() {\n _this._joyride = {\n backlog: true,\n kanban: true,\n dashboard: true\n };\n _this.rs.user.createUserStorage('joyride', _this._joyride);\n return resolve(_this._joyride);\n });\n };\n })(this));\n };\n\n CurrentUserService.prototype._loadUserInfo = function() {\n return Promise.all([this.loadProjects()]);\n };\n\n CurrentUserService.prototype.setProjects = function(projects) {\n this._projects = this._projects.set(\"all\", projects);\n this._projects = this._projects.set(\"recents\", projects.slice(0, 10));\n this._projectsById = Immutable.fromJS(groupBy(projects.toJS(), function(p) {\n return p.id;\n }));\n return this.projects;\n };\n\n return CurrentUserService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgCurrentUserService\", CurrentUserService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: lightbox-factory.service.coffee\n */\n\n(function() {\n var LightboxFactory;\n\n LightboxFactory = (function() {\n LightboxFactory.$inject = [\"$rootScope\", \"$compile\"];\n\n function LightboxFactory(rootScope, compile) {\n this.rootScope = rootScope;\n this.compile = compile;\n }\n\n LightboxFactory.prototype.create = function(name, attrs, scopeAttrs) {\n var elm, html, scope;\n scope = this.rootScope.$new();\n scope = _.merge(scope, scopeAttrs);\n elm = $(\"
\").attr(name, true).attr(\"tg-bind-scope\", true);\n if (attrs) {\n elm.attr(attrs);\n }\n elm.addClass(\"remove-on-close\");\n html = this.compile(elm)(scope);\n $(document.body).append(html);\n };\n\n return LightboxFactory;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgLightboxFactory\", LightboxFactory);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: paginate-response.service.coffee\n */\n\n(function() {\n var PaginateResponse;\n\n PaginateResponse = function() {\n return function(result) {\n var paginateResponse;\n paginateResponse = Immutable.Map({\n \"data\": result.get(\"data\"),\n \"next\": !!result.get(\"headers\")(\"x-pagination-next\"),\n \"prev\": !!result.get(\"headers\")(\"x-pagination-prev\"),\n \"current\": result.get(\"headers\")(\"x-pagination-current\"),\n \"count\": result.get(\"headers\")(\"x-pagination-count\")\n });\n return paginateResponse;\n };\n };\n\n angular.module(\"taigaCommon\").factory(\"tgPaginateResponseService\", PaginateResponse);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project.service.coffee\n */\n\n(function() {\n var ProjectService, taiga;\n\n taiga = this.taiga;\n\n ProjectService = (function() {\n ProjectService.$inject = [\"tgProjectsService\", \"tgXhrErrorService\"];\n\n function ProjectService(projectsService, xhrError) {\n this.projectsService = projectsService;\n this.xhrError = xhrError;\n this._project = null;\n this._section = null;\n this._sectionsBreadcrumb = Immutable.List();\n this._activeMembers = Immutable.List();\n taiga.defineImmutableProperty(this, \"project\", (function(_this) {\n return function() {\n return _this._project;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"section\", (function(_this) {\n return function() {\n return _this._section;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"sectionsBreadcrumb\", (function(_this) {\n return function() {\n return _this._sectionsBreadcrumb;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"activeMembers\", (function(_this) {\n return function() {\n return _this._activeMembers;\n };\n })(this));\n }\n\n ProjectService.prototype.setSection = function(section) {\n this._section = section;\n if (section) {\n return this._sectionsBreadcrumb = this._sectionsBreadcrumb.push(this._section);\n } else {\n return this._sectionsBreadcrumb = Immutable.List();\n }\n };\n\n ProjectService.prototype.setProjectBySlug = function(pslug) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n if (!_this.project || _this.project.get('slug') !== pslug) {\n return _this.projectsService.getProjectBySlug(pslug).then(function(project) {\n _this.setProject(project);\n return resolve();\n })[\"catch\"](function(xhr) {\n return _this.xhrError.response(xhr);\n });\n } else {\n return resolve();\n }\n };\n })(this));\n };\n\n ProjectService.prototype.setProject = function(project) {\n this._project = project;\n return this._activeMembers = this._project.get('members').filter(function(member) {\n return member.get('is_active');\n });\n };\n\n ProjectService.prototype.cleanProject = function() {\n this._project = null;\n this._activeMembers = Immutable.List();\n this._section = null;\n return this._sectionsBreadcrumb = Immutable.List();\n };\n\n ProjectService.prototype.hasPermission = function(permission) {\n return this._project.get('my_permissions').indexOf(permission) !== -1;\n };\n\n ProjectService.prototype.fetchProject = function() {\n var pslug;\n pslug = this.project.get('slug');\n return this.projectsService.getProjectBySlug(pslug).then((function(_this) {\n return function(project) {\n return _this.setProject(project);\n };\n })(this));\n };\n\n return ProjectService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgProjectService\", ProjectService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: scope-event.service.coffee\n */\n\n(function() {\n var ScopeEvent;\n\n ScopeEvent = (function() {\n function ScopeEvent() {}\n\n ScopeEvent.prototype.scopes = {};\n\n ScopeEvent.prototype._searchDuplicatedScopes = function(id) {\n return _.find(Object.keys(this.scopes), (function(_this) {\n return function(key) {\n return _this.scopes[key].$id === id;\n };\n })(this));\n };\n\n ScopeEvent.prototype._create = function(name, scope) {\n var duplicatedScopeName;\n duplicatedScopeName = this._searchDuplicatedScopes(scope.$id);\n if (duplicatedScopeName) {\n throw new Error(\"scopeEvent: this scope is already register with the name \\\"\" + duplicatedScopeName + \"\\\"\");\n }\n if (this.scopes[name]) {\n throw new Error(\"scopeEvent: \\\"\" + name + \"\\\" already in use\");\n } else {\n scope._tgEmitter = new EventEmitter2();\n scope.$on(\"$destroy\", (function(_this) {\n return function() {\n scope._tgEmitter.removeAllListeners();\n return delete _this.scopes[name];\n };\n })(this));\n return this.scopes[name] = scope;\n }\n };\n\n ScopeEvent.prototype.emitter = function(name, scope) {\n if (scope) {\n scope = this._create(name, scope);\n } else if (this.scopes[name]) {\n scope = this.scopes[name];\n } else {\n throw new Error(\"scopeEvent: \\\"\" + name + \"\\\" scope doesn't exist'\");\n }\n return scope._tgEmitter;\n };\n\n return ScopeEvent;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgScopeEvent\", ScopeEvent);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: theme.service.coffee\n */\n\n(function() {\n var ThemeService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n ThemeService = (function(superClass) {\n extend(ThemeService, superClass);\n\n function ThemeService() {\n return ThemeService.__super__.constructor.apply(this, arguments);\n }\n\n return ThemeService;\n\n })(taiga.Service = function() {\n return {\n use: function(themeName) {\n var stylesheetEl;\n stylesheetEl = $(\"link[rel='stylesheet']:first\");\n if (stylesheetEl.length === 0) {\n stylesheetEl = $(\"\");\n $(\"head\").append(stylesheetEl);\n }\n return stylesheetEl.attr(\"href\", \"/\" + window._version + \"/styles/theme-\" + themeName + \".css\");\n }\n };\n });\n\n angular.module(\"taigaCommon\").service(\"tgThemeService\", ThemeService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user.service.coffee\n */\n\n(function() {\n var UserService, bindMethods, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n bindMethods = taiga.bindMethods;\n\n UserService = (function(superClass) {\n extend(UserService, superClass);\n\n UserService.$inject = [\"tgResources\"];\n\n function UserService(rs) {\n this.rs = rs;\n bindMethods(this);\n }\n\n UserService.prototype.getUserByUserName = function(username) {\n return this.rs.users.getUserByUsername(username);\n };\n\n UserService.prototype.getContacts = function(userId) {\n return this.rs.users.getContacts(userId);\n };\n\n UserService.prototype.getLiked = function(userId, pageNumber, objectType, textQuery) {\n return this.rs.users.getLiked(userId, pageNumber, objectType, textQuery);\n };\n\n UserService.prototype.getVoted = function(userId, pageNumber, objectType, textQuery) {\n return this.rs.users.getVoted(userId, pageNumber, objectType, textQuery);\n };\n\n UserService.prototype.getWatched = function(userId, pageNumber, objectType, textQuery) {\n return this.rs.users.getWatched(userId, pageNumber, objectType, textQuery);\n };\n\n UserService.prototype.getStats = function(userId) {\n return this.rs.users.getStats(userId);\n };\n\n UserService.prototype.attachUserContactsToProjects = function(userId, projects) {\n return this.getContacts(userId).then(function(contacts) {\n projects = projects.map(function(project) {\n var contactsFiltered;\n contactsFiltered = contacts.filter(function(contact) {\n var contactId;\n contactId = contact.get(\"id\");\n return project.get('members').indexOf(contactId) !== -1;\n });\n project = project.set(\"contacts\", contactsFiltered);\n return project;\n });\n return projects;\n });\n };\n\n return UserService;\n\n })(taiga.Service);\n\n angular.module(\"taigaCommon\").service(\"tgUserService\", UserService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: xhrError.service.coffee\n */\n\n(function() {\n var xhrError,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n xhrError = (function(superClass) {\n extend(xhrError, superClass);\n\n xhrError.$inject = [\"$q\", \"$location\", \"$tgNavUrls\"];\n\n function xhrError(q, location, navUrls) {\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n }\n\n xhrError.prototype.notFound = function() {\n this.location.path(this.navUrls.resolve(\"not-found\"));\n return this.location.replace();\n };\n\n xhrError.prototype.permissionDenied = function() {\n this.location.path(this.navUrls.resolve(\"permission-denied\"));\n return this.location.replace();\n };\n\n xhrError.prototype.response = function(xhr) {\n if (xhr) {\n if (xhr.status === 404) {\n this.notFound();\n } else if (xhr.status === 403) {\n this.permissionDenied();\n }\n }\n return this.q.reject(xhr);\n };\n\n return xhrError;\n\n })(taiga.Service);\n\n angular.module(\"taigaCommon\").service(\"tgXhrErrorService\", xhrError);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-attachment.directive.coffee\n */\n\n(function() {\n var UserTimelineAttachmentDirective;\n\n UserTimelineAttachmentDirective = function(template, $compile) {\n var isImage, link, validFileExtensions;\n validFileExtensions = [\".jpg\", \".jpeg\", \".bmp\", \".gif\", \".png\"];\n isImage = function(url) {\n url = url.toLowerCase();\n return _.some(validFileExtensions, function(extension) {\n return url.indexOf(extension, url - extension.length) !== -1;\n });\n };\n link = function(scope, el) {\n var is_image, templateHtml;\n is_image = isImage(scope.attachment.get('url'));\n if (is_image) {\n templateHtml = template.get(\"user-timeline/user-timeline-attachment/user-timeline-attachment-image.html\");\n } else {\n templateHtml = template.get(\"user-timeline/user-timeline-attachment/user-timeline-attachment.html\");\n }\n el.html(templateHtml);\n $compile(el.contents())(scope);\n return el.find(\"img\").error(function() {\n return this.remove();\n });\n };\n return {\n link: link,\n scope: {\n attachment: \"=tgUserTimelineAttachment\"\n }\n };\n };\n\n UserTimelineAttachmentDirective.$inject = [\"$tgTemplate\", \"$compile\"];\n\n angular.module(\"taigaUserTimeline\").directive(\"tgUserTimelineAttachment\", UserTimelineAttachmentDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-item-title.service.coffee\n */\n\n(function() {\n var UserTimelineItemTitle, unslugify;\n\n unslugify = this.taiga.unslugify;\n\n UserTimelineItemTitle = (function() {\n UserTimelineItemTitle.$inject = [\"$translate\", \"$sce\"];\n\n UserTimelineItemTitle.prototype._fieldTranslationKey = {\n 'status': 'COMMON.FIELDS.STATUS',\n 'subject': 'COMMON.FIELDS.SUBJECT',\n 'description_diff': 'COMMON.FIELDS.DESCRIPTION',\n 'points': 'COMMON.FIELDS.POINTS',\n 'assigned_to': 'COMMON.FIELDS.ASSIGNED_TO',\n 'severity': 'ISSUES.FIELDS.SEVERITY',\n 'priority': 'ISSUES.FIELDS.PRIORITY',\n 'type': 'ISSUES.FIELDS.TYPE',\n 'is_iocaine': 'TASK.FIELDS.IS_IOCAINE',\n 'is_blocked': 'COMMON.FIELDS.IS_BLOCKED'\n };\n\n UserTimelineItemTitle.prototype._params = {\n username: function(timeline, event) {\n var title_attr, url, user;\n user = timeline.getIn(['data', 'user']);\n if (user.get('is_profile_visible')) {\n title_attr = this.translate.instant('COMMON.SEE_USER_PROFILE', {\n username: user.get('username')\n });\n url = \"user-profile:username=timeline.getIn(['data', 'user', 'username'])\";\n return this._getLink(url, user.get('name'), title_attr);\n } else {\n return this._getUsernameSpan(user.get('name'));\n }\n },\n field_name: function(timeline, event) {\n var field_name;\n field_name = timeline.getIn(['data', 'value_diff', 'key']);\n return this.translate.instant(this._fieldTranslationKey[field_name]);\n },\n project_name: function(timeline, event) {\n var url;\n url = \"project:project=timeline.getIn(['data', 'project', 'slug'])\";\n return this._getLink(url, timeline.getIn([\"data\", \"project\", \"name\"]));\n },\n new_value: function(timeline, event) {\n var new_value, value;\n if (_.isArray(timeline.getIn([\"data\", \"value_diff\", \"value\"]).toJS())) {\n value = timeline.getIn([\"data\", \"value_diff\", \"value\"]).get(1);\n if (value === null && timeline.getIn([\"data\", \"value_diff\", \"key\"]) === 'assigned_to') {\n value = this.translate.instant('ACTIVITY.VALUES.UNASSIGNED');\n }\n new_value = value;\n } else {\n new_value = timeline.getIn([\"data\", \"value_diff\", \"value\"]).first().get(1);\n }\n return _.escape(new_value);\n },\n sprint_name: function(timeline, event) {\n var url;\n url = \"project-taskboard:project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['data', 'milestone', 'slug'])\";\n return this._getLink(url, timeline.getIn(['data', 'milestone', 'name']));\n },\n us_name: function(timeline, event) {\n var event_us, obj, text, url;\n obj = this._getTimelineObj(timeline, event).get('userstory');\n event_us = {\n obj: 'parent_userstory'\n };\n url = this._getDetailObjUrl(event_us);\n text = '#' + obj.get('ref') + ' ' + obj.get('subject');\n return this._getLink(url, text);\n },\n obj_name: function(timeline, event) {\n var obj, text, url;\n obj = this._getTimelineObj(timeline, event);\n url = this._getDetailObjUrl(event);\n if (event.obj === 'wikipage') {\n text = unslugify(obj.get('slug'));\n } else if (event.obj === 'milestone') {\n text = obj.get('name');\n } else {\n text = '#' + obj.get('ref') + ' ' + obj.get('subject');\n }\n return this._getLink(url, text);\n },\n role_name: function(timeline, event) {\n return _.escape(timeline.getIn(['data', 'value_diff', 'value']).keySeq().first());\n }\n };\n\n function UserTimelineItemTitle(translate, sce) {\n this.translate = translate;\n this.sce = sce;\n }\n\n UserTimelineItemTitle.prototype._translateTitleParams = function(param, timeline, event) {\n return this._params[param].call(this, timeline, event);\n };\n\n UserTimelineItemTitle.prototype._getTimelineObj = function(timeline, event) {\n return timeline.getIn(['data', event.obj]);\n };\n\n UserTimelineItemTitle.prototype._getDetailObjUrl = function(event) {\n var url;\n url = {\n \"issue\": [\"project-issues-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"],\n \"wikipage\": [\"project-wiki-page\", \":project=timeline.getIn(['data', 'project', 'slug']),slug=timeline.getIn(['obj', 'slug'])\"],\n \"task\": [\"project-tasks-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"],\n \"userstory\": [\"project-userstories-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"],\n \"parent_userstory\": [\"project-userstories-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'userstory', 'ref'])\"],\n \"milestone\": [\"project-taskboard\", \":project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['obj', 'slug'])\"]\n };\n return url[event.obj][0] + url[event.obj][1];\n };\n\n UserTimelineItemTitle.prototype._getLink = function(url, text, title) {\n title = title || text;\n return $('').attr('tg-nav', url).text(text).attr('title', title).prop('outerHTML');\n };\n\n UserTimelineItemTitle.prototype._getUsernameSpan = function(text) {\n var title;\n title = title || text;\n return $('').addClass('username').text(text).prop('outerHTML');\n };\n\n UserTimelineItemTitle.prototype._getParams = function(timeline, event, timeline_type) {\n var params;\n params = {};\n timeline_type.translate_params.forEach((function(_this) {\n return function(param) {\n return params[param] = _this._translateTitleParams(param, timeline, event);\n };\n })(this));\n return params;\n };\n\n UserTimelineItemTitle.prototype.getTitle = function(timeline, event, type) {\n var params, paramsKeys, translation;\n params = this._getParams(timeline, event, type);\n paramsKeys = {};\n Object.keys(params).forEach(function(key) {\n return paramsKeys[key] = '{{' + key + '}}';\n });\n translation = this.translate.instant(type.key, paramsKeys);\n Object.keys(params).forEach(function(key) {\n var find;\n find = '{{' + key + '}}';\n return translation = translation.replace(new RegExp(find, 'g'), params[key]);\n });\n return translation;\n };\n\n return UserTimelineItemTitle;\n\n })();\n\n angular.module(\"taigaUserTimeline\").service(\"tgUserTimelineItemTitle\", UserTimelineItemTitle);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-item-type.service.coffee\n */\n\n(function() {\n var UserTimelineType, timelineType;\n\n timelineType = function(timeline, event) {\n var types;\n types = [\n {\n check: function(timeline, event) {\n return event.obj === 'membership';\n },\n key: 'TIMELINE.NEW_MEMBER',\n translate_params: ['project_name'],\n member: function(timeline) {\n return Immutable.Map({\n user: timeline.getIn(['data', 'user']),\n role: timeline.getIn(['data', 'role'])\n });\n }\n }, {\n check: function(timeline, event) {\n return event.obj === 'project' && event.type === 'create';\n },\n key: 'TIMELINE.NEW_PROJECT',\n translate_params: ['username', 'project_name'],\n description: function(timeline) {\n return timeline.getIn(['data', 'project', 'description']);\n }\n }, {\n check: function(timeline, event) {\n return event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'attachments';\n },\n key: 'TIMELINE.UPLOAD_ATTACHMENT',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'userstory' && event.type === 'create';\n },\n key: 'TIMELINE.US_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'issue' && event.type === 'create';\n },\n key: 'TIMELINE.ISSUE_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'wikipage' && event.type === 'create';\n },\n key: 'TIMELINE.WIKI_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'create' && !timeline.getIn(['data', 'task', 'userstory']);\n },\n key: 'TIMELINE.TASK_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'create' && timeline.getIn(['data', 'task', 'userstory']);\n },\n key: 'TIMELINE.TASK_CREATED_WITH_US',\n translate_params: ['username', 'project_name', 'obj_name', 'us_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'milestone' && event.type === 'create';\n },\n key: 'TIMELINE.MILESTONE_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return timeline.getIn(['data', 'comment']) && event.obj === 'userstory';\n },\n key: 'TIMELINE.NEW_COMMENT_US',\n translate_params: ['username', 'obj_name'],\n description: function(timeline) {\n var text;\n text = timeline.getIn(['data', 'comment_html']);\n return $($.parseHTML(text)).text();\n }\n }, {\n check: function(timeline, event) {\n return timeline.getIn(['data', 'comment']) && event.obj === 'issue';\n },\n key: 'TIMELINE.NEW_COMMENT_ISSUE',\n translate_params: ['username', 'obj_name'],\n description: function(timeline) {\n var text;\n text = timeline.getIn(['data', 'comment_html']);\n return $($.parseHTML(text)).text();\n }\n }, {\n check: function(timeline, event) {\n return timeline.getIn(['data', 'comment']) && event.obj === 'task';\n },\n key: 'TIMELINE.NEW_COMMENT_TASK',\n translate_params: ['username', 'obj_name'],\n description: function(timeline) {\n var text;\n text = timeline.getIn(['data', 'comment_html']);\n return $($.parseHTML(text)).text();\n }\n }, {\n check: function(timeline, event) {\n return timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'moveInBacklog' && timeline.hasIn(['data', 'value_diff', 'value', 'backlog_order']) && event.type === 'change';\n },\n key: 'TIMELINE.US_MOVED',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n if (timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'moveInBacklog' && event.type === 'change' && event.obj === 'userstory') {\n return timeline.getIn(['data', 'value_diff', 'value', 'milestone']).get(1) === null;\n }\n return false;\n },\n key: 'TIMELINE.US_REMOVED_FROM_MILESTONE',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'moveInBacklog' && event.type === 'change' && event.obj === 'userstory';\n },\n key: 'TIMELINE.US_ADDED_MILESTONE',\n translate_params: ['username', 'obj_name', 'sprint_name']\n }, {\n check: function(timeline, event) {\n if (timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'blocked' && event.type === 'change') {\n return timeline.getIn(['data', 'value_diff', 'value', 'is_blocked']).get(1) === true;\n }\n return false;\n },\n key: 'TIMELINE.BLOCKED',\n translate_params: ['username', 'obj_name'],\n description: function(timeline) {\n var text;\n if (timeline.hasIn(['data', 'value_diff', 'value', 'blocked_note_html'])) {\n text = timeline.getIn(['data', 'value_diff', 'value', 'blocked_note_html']).get(1);\n return $($.parseHTML(text)).text();\n } else {\n return false;\n }\n }\n }, {\n check: function(timeline, event) {\n if (timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'blocked' && event.type === 'change') {\n return timeline.getIn(['data', 'value_diff', 'value', 'is_blocked']).get(1) === false;\n }\n return false;\n },\n key: 'TIMELINE.UNBLOCKED',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'milestone' && event.type === 'change';\n },\n key: 'TIMELINE.MILESTONE_UPDATED',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'wikipage' && event.type === 'change';\n },\n key: 'TIMELINE.WIKI_UPDATED',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'userstory' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'points';\n },\n key: 'TIMELINE.US_UPDATED_POINTS',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value', 'role_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'userstory' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.US_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'userstory' && event.type === 'change';\n },\n key: 'TIMELINE.US_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'issue' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.ISSUE_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'issue' && event.type === 'change';\n },\n key: 'TIMELINE.ISSUE_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'change' && !timeline.getIn(['data', 'task', 'userstory']) && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.TASK_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'change' && timeline.getIn(['data', 'task', 'userstory']) && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.TASK_UPDATED_WITH_US',\n translate_params: ['username', 'field_name', 'obj_name', 'us_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'change' && !timeline.getIn(['data', 'task', 'userstory']);\n },\n key: 'TIMELINE.TASK_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'change' && timeline.getIn(['data', 'task', 'userstory']);\n },\n key: 'TIMELINE.TASK_UPDATED_WITH_US_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'us_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'user' && event.type === 'create';\n },\n key: 'TIMELINE.NEW_USER',\n translate_params: ['username']\n }\n ];\n return _.find(types, function(obj) {\n return obj.check(timeline, event);\n });\n };\n\n UserTimelineType = (function() {\n function UserTimelineType() {}\n\n UserTimelineType.prototype.getType = function(timeline, event) {\n return timelineType(timeline, event);\n };\n\n return UserTimelineType;\n\n })();\n\n angular.module(\"taigaUserTimeline\").service(\"tgUserTimelineItemType\", UserTimelineType);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-item.directive.coffee\n */\n\n(function() {\n var UserTimelineItemDirective;\n\n UserTimelineItemDirective = function() {\n return {\n templateUrl: \"user-timeline/user-timeline-item/user-timeline-item.html\",\n scope: {\n timeline: \"=tgUserTimelineItem\"\n }\n };\n };\n\n angular.module(\"taigaUserTimeline\").directive(\"tgUserTimelineItem\", UserTimelineItemDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-pagination-sequence.service.coffee\n */\n\n(function() {\n var UserTimelinePaginationSequence;\n\n UserTimelinePaginationSequence = function() {\n var obj;\n obj = {};\n obj.generate = function(config) {\n var getContent, items, next, page;\n page = 1;\n items = Immutable.List();\n config.minItems = config.minItems || 20;\n next = function() {\n items = Immutable.List();\n return getContent();\n };\n getContent = function() {\n return config.fetch(page).then(function(response) {\n var data;\n page++;\n data = response.get(\"data\");\n if (config.filter) {\n data = config.filter(data);\n }\n if (config.map) {\n data = data.map(config.map);\n }\n items = items.concat(data);\n if (items.size < config.minItems && response.get(\"next\")) {\n return getContent();\n }\n return Immutable.Map({\n items: items,\n next: response.get(\"next\")\n });\n });\n };\n return {\n next: function() {\n return next();\n }\n };\n };\n return obj;\n };\n\n angular.module(\"taigaUserTimeline\").factory(\"tgUserTimelinePaginationSequenceService\", UserTimelinePaginationSequence);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/profile/profile-timeline/profile-timeline.controller.coffee\n */\n\n(function() {\n var UserTimelineController, mixOf, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n UserTimelineController = (function(superClass) {\n extend(UserTimelineController, superClass);\n\n UserTimelineController.$inject = [\"tgUserTimelineService\"];\n\n function UserTimelineController(userTimelineService) {\n this.userTimelineService = userTimelineService;\n this.timelineList = Immutable.List();\n this.scrollDisabled = false;\n this.timeline = null;\n if (this.projectId) {\n this.timeline = this.userTimelineService.getProjectTimeline(this.projectId);\n } else if (this.currentUser) {\n this.timeline = this.userTimelineService.getProfileTimeline(this.user.get(\"id\"));\n } else {\n this.timeline = this.userTimelineService.getUserTimeline(this.user.get(\"id\"));\n }\n }\n\n UserTimelineController.prototype.loadTimeline = function() {\n this.scrollDisabled = true;\n return this.timeline.next().then((function(_this) {\n return function(response) {\n _this.timelineList = _this.timelineList.concat(response.get(\"items\"));\n if (response.get(\"next\")) {\n _this.scrollDisabled = false;\n }\n return _this.timelineList;\n };\n })(this));\n };\n\n return UserTimelineController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n angular.module(\"taigaUserTimeline\").controller(\"UserTimeline\", UserTimelineController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline.directive.coffee\n */\n\n(function() {\n var UserTimelineDirective;\n\n UserTimelineDirective = function() {\n return {\n templateUrl: \"user-timeline/user-timeline/user-timeline.html\",\n controller: \"UserTimeline\",\n controllerAs: \"vm\",\n scope: {\n projectId: \"=projectid\",\n user: \"=\",\n currentUser: \"=\"\n },\n bindToController: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgUserTimeline\", UserTimelineDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline.service.coffee\n */\n\n(function() {\n var UserTimelineService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n UserTimelineService = (function(superClass) {\n extend(UserTimelineService, superClass);\n\n UserTimelineService.$inject = [\"tgResources\", \"tgUserTimelinePaginationSequenceService\", \"tgUserTimelineItemType\", \"tgUserTimelineItemTitle\"];\n\n function UserTimelineService(rs, userTimelinePaginationSequenceService, userTimelineItemType, userTimelineItemTitle) {\n this.rs = rs;\n this.userTimelinePaginationSequenceService = userTimelinePaginationSequenceService;\n this.userTimelineItemType = userTimelineItemType;\n this.userTimelineItemTitle = userTimelineItemTitle;\n }\n\n UserTimelineService.prototype._valid_fields = ['status', 'subject', 'description_diff', 'assigned_to', 'points', 'severity', 'priority', 'type', 'attachments', 'is_iocaine', 'content_diff', 'name', 'estimated_finish', 'estimated_start', 'blocked', 'moveInBacklog', 'milestone'];\n\n UserTimelineService.prototype._invalid = [\n {\n check: function(timeline) {\n var fieldKey, value_diff;\n value_diff = timeline.get(\"data\").get(\"value_diff\");\n if (value_diff) {\n fieldKey = value_diff.get('key');\n if (this._valid_fields.indexOf(fieldKey) === -1) {\n return true;\n } else if (fieldKey === 'attachments' && value_diff.get('value').get('new').size === 0) {\n return true;\n }\n }\n return false;\n }\n }, {\n check: function(timeline) {\n var event, value_diff;\n event = timeline.get('event_type').split(\".\");\n value_diff = timeline.get(\"data\").get(\"value_diff\");\n return event[2] === 'change' && value_diff === void 0;\n }\n }, {\n check: function(timeline) {\n var event;\n event = timeline.get('event_type').split(\".\");\n return event[2] === 'delete';\n }\n }, {\n check: function(timeline) {\n var event;\n event = timeline.get('event_type').split(\".\");\n return event[1] === 'project' && event[2] === 'change';\n }\n }, {\n check: function(timeline) {\n return !!timeline.get(\"data\").get(\"comment_deleted\");\n }\n }, {\n check: function(timeline) {\n var event, value_diff;\n event = timeline.get('event_type').split(\".\");\n value_diff = timeline.get(\"data\").get(\"value_diff\");\n if (value_diff && event[1] === \"task\" && event[2] === \"change\" && value_diff.get(\"key\") === \"milestone\") {\n return timeline.get(\"data\").get(\"value_diff\").get(\"value\");\n }\n return false;\n }\n }\n ];\n\n UserTimelineService.prototype._isInValidTimeline = function(timeline) {\n return _.some(this._invalid, (function(_this) {\n return function(invalid) {\n return invalid.check.call(_this, timeline);\n };\n })(this));\n };\n\n UserTimelineService.prototype._parseEventType = function(event_type) {\n event_type = event_type.split(\".\");\n return {\n section: event_type[0],\n obj: event_type[1],\n type: event_type[2]\n };\n };\n\n UserTimelineService.prototype._getTimelineObject = function(timeline, event) {\n if (timeline.get('data').get(event.obj)) {\n return timeline.get('data').get(event.obj);\n }\n };\n\n UserTimelineService.prototype._attachExtraInfoToTimelineEntry = function(timeline, event, type) {\n var title;\n title = this.userTimelineItemTitle.getTitle(timeline, event, type);\n timeline = timeline.set('title_html', title);\n timeline = timeline.set('obj', this._getTimelineObject(timeline, event));\n if (type.description) {\n timeline = timeline.set('description', type.description(timeline));\n }\n if (type.member) {\n timeline = timeline.set('member', type.member(timeline));\n }\n if (timeline.getIn(['data', 'value_diff', 'key']) === 'attachments' && timeline.hasIn(['data', 'value_diff', 'value', 'new'])) {\n timeline = timeline.set('attachments', timeline.getIn(['data', 'value_diff', 'value', 'new']));\n }\n return timeline;\n };\n\n UserTimelineService.prototype._parseTimeline = function(response) {\n var newdata;\n newdata = Immutable.List();\n response.get('data').forEach((function(_this) {\n return function(item) {\n var data, event, newItem, values_diff;\n event = _this._parseEventType(item.get('event_type'));\n data = item.get('data');\n values_diff = data.get('values_diff');\n if (values_diff && values_diff.count()) {\n if (values_diff.has('is_blocked')) {\n values_diff = Immutable.Map({\n 'blocked': values_diff\n });\n }\n if (values_diff.has('milestone')) {\n if (event.obj === 'userstory') {\n values_diff = Immutable.Map({\n 'moveInBacklog': values_diff\n });\n } else {\n values_diff = values_diff.deleteIn(['values_diff', 'milestone']);\n }\n } else if (event.obj === 'milestone') {\n values_diff = Immutable.Map({\n 'milestone': values_diff\n });\n }\n return values_diff.forEach(function(value, key) {\n var newItem, obj;\n obj = Immutable.Map({\n key: key,\n value: value\n });\n newItem = item.setIn(['data', 'value_diff'], obj);\n newItem = newItem.deleteIn(['data', 'values_diff']);\n return newdata = newdata.push(newItem);\n });\n } else {\n newItem = item.deleteIn(['data', 'values_diff']);\n return newdata = newdata.push(newItem);\n }\n };\n })(this));\n return response.set('data', newdata);\n };\n\n UserTimelineService.prototype._addEntyAttributes = function(item) {\n var event, type;\n event = this._parseEventType(item.get('event_type'));\n type = this.userTimelineItemType.getType(item, event);\n return this._attachExtraInfoToTimelineEntry(item, event, type);\n };\n\n UserTimelineService.prototype.getProfileTimeline = function(userId) {\n var config;\n config = {};\n config.fetch = (function(_this) {\n return function(page) {\n return _this.rs.users.getProfileTimeline(userId, page).then(function(response) {\n return _this._parseTimeline(response);\n });\n };\n })(this);\n config.map = (function(_this) {\n return function(obj) {\n return _this._addEntyAttributes(obj);\n };\n })(this);\n config.filter = (function(_this) {\n return function(items) {\n return items.filterNot(function(item) {\n return _this._isInValidTimeline(item);\n });\n };\n })(this);\n return this.userTimelinePaginationSequenceService.generate(config);\n };\n\n UserTimelineService.prototype.getUserTimeline = function(userId) {\n var config;\n config = {};\n config.fetch = (function(_this) {\n return function(page) {\n return _this.rs.users.getUserTimeline(userId, page).then(function(response) {\n return _this._parseTimeline(response);\n });\n };\n })(this);\n config.map = (function(_this) {\n return function(obj) {\n return _this._addEntyAttributes(obj);\n };\n })(this);\n config.filter = (function(_this) {\n return function(items) {\n return items.filterNot(function(item) {\n return _this._isInValidTimeline(item);\n });\n };\n })(this);\n return this.userTimelinePaginationSequenceService.generate(config);\n };\n\n UserTimelineService.prototype.getProjectTimeline = function(projectId) {\n var config;\n config = {};\n config.fetch = (function(_this) {\n return function(page) {\n return _this.rs.projects.getTimeline(projectId, page).then(function(response) {\n return _this._parseTimeline(response);\n });\n };\n })(this);\n config.map = (function(_this) {\n return function(obj) {\n return _this._addEntyAttributes(obj);\n };\n })(this);\n config.filter = (function(_this) {\n return function(items) {\n return items.filterNot(function(item) {\n return _this._isInValidTimeline(item);\n });\n };\n })(this);\n return this.userTimelinePaginationSequenceService.generate(config);\n };\n\n return UserTimelineService;\n\n })(taiga.Service);\n\n angular.module(\"taigaUserTimeline\").service(\"tgUserTimelineService\", UserTimelineService);\n\n}).call(this);\n\n//# sourceMappingURL=maps/app.js.map\n"]} \ No newline at end of file diff --git a/dist/v-1454172424320/styles/theme-high-contrast.css b/dist/v-1454172424320/styles/theme-high-contrast.css deleted file mode 100644 index 8304dfe..0000000 --- a/dist/v-1454172424320/styles/theme-high-contrast.css +++ /dev/null @@ -1,4 +0,0 @@ -@charset "UTF-8";.introjs-arrow,blockquote::after,blockquote::before,q::after,q::before{content:''}.pika-table,table{border-collapse:collapse;border-spacing:0}.kanban-task-minimized .task-name,h1 .date,h1 span{text-overflow:ellipsis;white-space:nowrap}.lightbox textarea,.wizard-create-project textarea,textarea{resize:vertical}.change-entry .activity-fromto,.kanban-task-maximized .task-name,.profile-bar .not-full-name,.profile-bar h1{word-wrap:break-word}.codehilite .hll{background-color:#49483e}.codehilite .c{color:#75715e}.codehilite .err{color:#960050;background-color:#1e0010}.codehilite .k{color:#66d9ef}.codehilite .l{color:#ae81ff}.codehilite .n{color:#f8f8f2}.codehilite .o{color:#f92672}.codehilite .p{color:#f8f8f2}.codehilite .c1,.codehilite .cm,.codehilite .cp,.codehilite .cs{color:#75715e}.codehilite .ge{font-style:italic}.codehilite .gs{font-weight:700}.codehilite .kc,.codehilite .kd{color:#66d9ef}.codehilite .kn{color:#f92672}.codehilite .kp,.codehilite .kr,.codehilite .kt{color:#66d9ef}.codehilite .ld{color:#e6db74}.codehilite .m{color:#ae81ff}.codehilite .s{color:#e6db74}.codehilite .na{color:#a6e22e}.codehilite .nb{color:#f8f8f2}.codehilite .nc{color:#a6e22e}.codehilite .no{color:#66d9ef}.codehilite .nd{color:#a6e22e}.codehilite .ni{color:#f8f8f2}.codehilite .ne,.codehilite .nf{color:#a6e22e}.codehilite .nl,.codehilite .nn{color:#f8f8f2}.codehilite .nx{color:#a6e22e}.codehilite .py{color:#f8f8f2}.codehilite .nt{color:#f92672}.codehilite .nv{color:#f8f8f2}.codehilite .ow{color:#f92672}.codehilite .w{color:#f8f8f2}.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#ae81ff}.codehilite .s2,.codehilite .sb,.codehilite .sc,.codehilite .sd{color:#e6db74}.codehilite .se{color:#ae81ff}.codehilite .s1,.codehilite .sh,.codehilite .si,.codehilite .sr,.codehilite .ss,.codehilite .sx{color:#e6db74}.codehilite .bp,.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#f8f8f2}.codehilite .il{color:#ae81ff}.codehilite .gu{color:#75715e}.codehilite .gd{color:#f92672}.codehilite .gi{color:#a6e22e}.mCustomScrollbar{-ms-touch-action:none;touch-action:none}.mCustomScrollbar.mCS_no_scrollbar{-ms-touch-action:auto;touch-action:auto}.mCustomScrollBox{position:relative;overflow:hidden;height:100%;max-width:100%;outline:0;direction:ltr}.mCSB_container{overflow:hidden;width:auto;height:auto}.mCSB_inside>.mCSB_container{margin-right:30px}.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container{margin-right:0;margin-left:30px}.mCS-dir-rtl>.mCSB_inside>.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-left:0}.mCSB_scrollTools{position:absolute;width:16px;height:auto;left:auto;top:0;right:0;bottom:0;opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_outside+.mCSB_scrollTools{right:-26px}.mCS-dir-rtl>.mCSB_inside>.mCSB_scrollTools,.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{right:auto;left:0}.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{left:-26px}.mCSB_scrollTools .mCSB_draggerContainer{position:absolute;top:0;left:0;bottom:0;right:0;height:auto}.mCSB_scrollTools a+.mCSB_draggerContainer{margin:20px 0}.mCSB_scrollTools .mCSB_draggerRail{width:2px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCSB_scrollTools .mCSB_dragger{cursor:pointer;width:100%;height:30px;z-index:1}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{position:relative;width:4px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px;text-align:center}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:12px}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:8px}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonUp{display:block;position:absolute;height:20px;width:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools .mCSB_buttonDown{bottom:0}.mCSB_horizontal.mCSB_inside>.mCSB_container{margin-right:0;margin-bottom:30px}.mCSB_horizontal.mCSB_outside>.mCSB_container{min-height:100%}.mCSB_horizontal>.mCSB_container.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal{width:auto;height:16px;top:auto;right:0;bottom:0;left:0}.mCustomScrollBox+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:-26px}.mCSB_scrollTools.mCSB_scrollTools_horizontal a+.mCSB_draggerContainer{margin:0 20px}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:2px;margin:7px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger{width:30px;height:100%;left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:4px;margin:6px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:12px;margin:2px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:8px;margin:4px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{display:block;position:absolute;width:20px;height:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft{left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{right:0}.mCSB_container_wrapper{position:absolute;height:auto;width:auto;overflow:hidden;top:0;left:0;right:0;bottom:0;margin-right:30px;margin-bottom:30px}.mCSB_container_wrapper>.mCSB_container{padding-right:30px;padding-bottom:30px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:20px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:20px}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden+.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:20px}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container_wrapper{margin-right:0;margin-left:30px}.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden>.mCSB_container{padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden>.mCSB_container{padding-bottom:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0;margin-left:0}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;transition:opacity .2s ease-in-out,background-color .2s ease-in-out}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar{-webkit-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out}.introjs-helperLayer,.introjs-overlay{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out}.mCS-autoHide>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide>.mCustomScrollBox~.mCSB_scrollTools{opacity:0;filter:"alpha(opacity=0)";-ms-filter:"alpha(opacity=0)"}.mCS-autoHide:hover>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide:hover>.mCustomScrollBox~.mCSB_scrollTools,.mCustomScrollBox:hover>.mCSB_scrollTools,.mCustomScrollBox:hover~.mCSB_scrollTools,.mCustomScrollbar>.mCustomScrollBox>.mCSB_scrollTools.mCSB_scrollTools_onDrag,.mCustomScrollbar>.mCustomScrollBox~.mCSB_scrollTools.mCSB_scrollTools_onDrag{opacity:1;filter:"alpha(opacity=100)";-ms-filter:"alpha(opacity=100)"}.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.4);filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75);filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85);filter:"alpha(opacity=85)";-ms-filter:"alpha(opacity=85)"}.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9);filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp{background-image:url(mCSB_buttons.png);background-repeat:no-repeat;opacity:.4;filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_buttonUp{background-position:0 0}.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -20px}.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -40px}.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -56px}.mCSB_scrollTools .mCSB_buttonDown:hover,.mCSB_scrollTools .mCSB_buttonLeft:hover,.mCSB_scrollTools .mCSB_buttonRight:hover,.mCSB_scrollTools .mCSB_buttonUp:hover{opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_buttonDown:active,.mCSB_scrollTools .mCSB_buttonLeft:active,.mCSB_scrollTools .mCSB_buttonRight:active,.mCSB_scrollTools .mCSB_buttonUp:active{opacity:.9;filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCS-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:rgba(0,0,0,.85)}.mCS-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:rgba(0,0,0,.9)}.mCS-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:4px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px auto}.mCS-light-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px 0}.mCS-light-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -20px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -40px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px 0}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -20px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -40px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px 0}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:6px;margin:5px auto}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px 0}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -20px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -40px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px 0}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -20px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -40px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -56px}.mCS-light-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.1)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:2px}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:2px;margin:7px auto}.mCS-dark-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-rounded.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger,.mCS-rounded.mCSB_scrollTools .mCSB_dragger{height:14px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:14px;margin:0 1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger{width:14px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:14px;margin:1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:16px;height:16px;margin:-1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:4px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:16px;width:16px;margin:0 -1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:4px;margin:6px 0}.mCS-rounded.mCSB_scrollTools .mCSB_buttonUp{background-position:0 -72px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -92px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -112px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -128px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px -72px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -92px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -112px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools_vertical .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_vertical .mCSB_draggerRail{width:4px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{background-color:transparent;background-position:center}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAANElEQVQYV2NkIAAYiVbw//9/Y6DiM1ANJoyMjGdBbLgJQAX/kU0DKgDLkaQAvxW4HEvQFwCRcxIJK1XznAAAAABJRU5ErkJggg==);background-repeat:repeat-y;opacity:.3;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{height:4px;margin:6px 0;background-repeat:repeat-x}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px -72px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -92px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -112px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYV2NkIAAYSVFgDFR8BqrBBEifBbGRTfiPZhpYjiQFBK3A6l6CvgAAE9kGCd1mvgEAAAAASUVORK5CYII=)}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px -72px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -92px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -112px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-y;background-image:-moz-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to right,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-x;background-image:-moz-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to bottom,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-3d.mCSB_scrollTools_vertical .mCSB_dragger{height:70px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger{width:70px}.mCS-3d-dark.mCSB_scrollTools,.mCS-3d.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{width:8px;background-color:#000;background-color:rgba(0,0,0,.2);box-shadow:inset 1px 0 1px rgba(0,0,0,.5),inset -1px 0 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:8px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:8px;margin:4px 0;box-shadow:inset 0 1px 1px rgba(0,0,0,.5),inset 0 -1px 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:8px;margin:4px auto}.mCS-3d.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);box-shadow:inset 1px 0 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{box-shadow:inset 0 1px 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer,.mCS-3d-thick.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.mCSB_inside+.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCSB_inside+.mCS-3d-thick.mCSB_scrollTools_vertical{right:1px}.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCS-3d-thick.mCSB_scrollTools_vertical{box-shadow:inset 1px 0 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal,.mCS-3d-thick.mCSB_scrollTools_horizontal{bottom:1px;box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;box-shadow:inset 1px 0 0 rgba(255,255,255,.4);width:12px;margin:2px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4);height:12px;width:auto}.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{background-color:#000;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-thick-dark.mCSB_scrollTools{box-shadow:inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal{box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 1px 0 0 rgba(255,255,255,.4),inset -1px 0 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4),inset 0 -1px 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#777}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer{background-color:#fff;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{right:0;margin:12px 0}.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:0;margin:0 12px}.mCS-dir-rtl>.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCS-dir-rtl>.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{left:0;right:auto}.mCS-minimal-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_vertical .mCSB_dragger{height:50px}.mCS-minimal-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_horizontal .mCSB_dragger{width:50px}.mCS-minimal.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools .mCSB_draggerRail{width:6px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px}.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:6px;margin:5px 0}.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:12px}.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:12px;margin:2px 0}.mCS-light-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools .mCSB_draggerRail{width:12px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;margin:3px 5px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:6px;margin:5px 3px;position:absolute;width:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:12px;margin:2px 0}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent;border-width:1px;border-style:solid;border-color:#fff;border-color:rgba(255,255,255,.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail{border-color:#000;border-color:rgba(0,0,0,.2)}.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.6)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.6)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.dropdown-menu{border:1px solid #ddd;background-color:#fff}.dropdown-menu li{border-top:1px solid #ddd;padding:2px 5px}.dropdown-menu li:first-child{border-top:none}.dropdown-menu .active,.dropdown-menu li:hover{background-color:#6eb7db;color:#fff}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff}.dropdown-menu{list-style:none;padding:0;margin:0}.dropdown-menu a:hover{cursor:pointer}.markItUp .markItUpButton1 a{background-image:url(../images/markitup/h1.png)}.markItUp .markItUpButton2 a{background-image:url(../images/markitup/h2.png)}.markItUp .markItUpButton3 a{background-image:url(../images/markitup/h3.png)}.markItUp .markItUpButton4 a{background-image:url(../images/markitup/bold.png)}.markItUp .markItUpButton5 a{background-image:url(../images/markitup/italic.png)}.markItUp .markItUpButton6 a{background-image:url(../images/markitup/stroke.png)}.markdown .markItUpButton7 a{background-image:url(../images/markitup/list-bullet.png)}.markdown .markItUpButton8 a{background-image:url(../images/markitup/list-numeric.png)}.markdown .markItUpButton9 a{background-image:url(../images/markitup/picture.png)}.markdown .markItUpButton10 a{background-image:url(../images/markitup/link.png)}.markdown .markItUpButton11 a{background-image:url(../images/markitup/quotes.png)}.markdown .markItUpButton12 a{background-image:url(../images/markitup/code.png)}.markdown .preview-icon a{background-image:url(../images/markitup/preview.png)}.markdown .help a{background-image:url(../images/markitup/help.png)}.markItUp *{margin:0;padding:0;outline:0}.markItUp a:link,.markItUp a:visited{color:#000;text-decoration:none}.markItUpContainer{font:11px Verdana,Arial,Helvetica,sans-serif}.markItUpEditor{font:12px 'Courier New',Courier,monospace;padding:5px;height:320px;clear:both;overflow:auto}.markItUpPreviewFrame{overflow:auto;background-color:#FFF;width:99.9%;height:300px;margin:5px 0}.markItUpFooter{width:100%}.markItUpResizeHandle{overflow:hidden;width:22px;height:5px;margin-left:auto;margin-right:auto;background-image:url(../images/markitup/handle.png);cursor:n-resize}.markItUp .markItUpHeader ul{margin:0}.markItUpHeader ul li{list-style:none;position:relative;margin:3px}.markItUpHeader ul li:hover>ul{display:block}.markItUpHeader ul .markItUpDropMenu{background:url(../images/markitup/menu.png) 115% 50% no-repeat;margin-right:5px}.markItUpHeader ul .markItUpDropMenu li{margin-right:0}.markItUpHeader ul ul{display:none;position:absolute;top:18px;left:0;background:#FFF;border:1px solid #000}.markItUpHeader ul ul li{float:none;border-bottom:1px solid #000}.markItUpHeader ul ul .markItUpDropMenu{background:url(../images/markitup/submenu.png) 100% 50% no-repeat #FFF}.markItUpHeader ul .markItUpSeparator{margin:2px 10px 0;width:1px;height:16px;overflow:hidden;background-color:#CCC}.introjs-button,button{overflow:visible}.markItUpHeader ul ul .markItUpSeparator{width:auto;height:1px;margin:0}.markItUpHeader ul ul ul{position:absolute;top:-1px;left:150px}.markItUpHeader ul ul ul li{float:none}.markItUpHeader ul a{display:block;width:16px;height:16px;text-indent:-10000px;background-repeat:no-repeat;padding:3px;margin:0}.markItUpHeader ul ul a{display:block;text-indent:0;width:120px;padding:5px 5px 5px 25px;background-position:2px 50%}.markItUpHeader ul ul a:hover{color:#FFF;background-color:#000}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}mark{background:#ff0;color:#000}sub,sup{line-height:0;position:relative}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}optgroup{font-weight:700}/*! - * Pikaday - * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ - */.pika-single{display:block;position:relative;width:240px;padding:8px;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-title{position:relative;text-align:center}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;filter:alpha(opacity=0);opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.introjs-bullets ul,.introjs-button,.pika-select{display:inline-block}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-table{width:100%;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700;text-align:center}.pika-button{cursor:pointer;display:block;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.is-today .pika-button{color:#3af;font-weight:700}.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.pika-button:hover{color:#fff!important;background:#ff8000!important;box-shadow:none!important;border-radius:3px!important}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;position:absolute!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border-radius:4px;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0);filter:progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000);box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid #fff;position:absolute}.introjs-arrow.top,.introjs-arrow.top-middle,.introjs-arrow.top-right{top:-10px;border-color:transparent transparent #fff}.introjs-arrow.top-right{right:10px}.introjs-arrow.top-middle{left:50%;margin-left:-5px}.introjs-arrow.left,.introjs-arrow.right{top:10px}.introjs-arrow.right,.introjs-arrow.right-bottom{right:-10px;border-color:transparent transparent transparent #fff}.introjs-arrow.right-bottom{bottom:10px}.introjs-arrow.bottom{bottom:-10px;border-color:#fff transparent transparent}.introjs-arrow.left,.introjs-arrow.left-bottom{left:-10px;border-color:transparent #fff transparent transparent}.introjs-arrow.left-bottom{bottom:10px}.introjs-tooltip{position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{position:relative;margin:10px 0 0;text-decoration:none;font:11px/normal sans-serif;white-space:nowrap;cursor:pointer;outline:0;-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;zoom:1}.introjs-progress,.loader-active,.taskboard,.taskboard-inner,body.loading-project,h1 .date,h1 span{overflow:hidden}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-bullets{text-align:center}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0}.introjs-bullets ul li{list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{height:10px;margin:10px 0 5px;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{float:left;width:0;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.admin-membership header a,.header-with-actions .button,.kanban .kanban-settings,.save-wiki{float:right}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.master,fieldset{position:relative}body,html{width:100%;min-height:100%}*{box-sizing:border-box}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{border:0;font:inherit;font-size:100%;margin:0;padding:0;vertical-align:baseline}body,h1,h2,h3,h4,h5,h6{font-weight:400;color:#212121}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}body{font-weight:400;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.3}.icon{font-family:taiga}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body .master.ng-animate{-webkit-transition:0;transition:0}.drag-active{overflow-x:hidden}.master{height:100%;min-height:100%}.menu-secondary,.menu-tertiary,.wrapper{min-height:calc(100vh - 40px)}.centered{margin:1rem auto;max-width:1200px;min-width:960px;width:90%}.wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-secondary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary.filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0;-webkit-transition:all .2s linear;transition:all .2s linear;width:0}.menu-secondary.filters-bar.active{padding:2em 1em;-webkit-transition:all .2s linear;transition:all .2s linear;width:260px}.menu-secondary.filters-bar.active .filters-inner{opacity:1;-webkit-transition:all .4s ease-in;transition:all .4s ease-in}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;min-width:0;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions .action-buttons{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;margin-left:10px}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}h1 span,h2{font-size:1.6rem}h1{font-size:2rem;margin-bottom:1rem;text-transform:uppercase}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.ttf) format("truetype")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.ttf) format("truetype")}@font-face{font-family:OpenSans-Regular;src:url(../fonts/OpenSans-Regular.ttf) format("truetype")}@font-face{font-family:OpenSans-Semibold;src:url(../fonts/OpenSans-Semibold.ttf) format("truetype")}@font-face{font-family:taiga;font-style:normal;font-weight:400;src:url(../fonts/taiga.eot);src:url(../fonts/taiga.eot?) format("eot"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype")}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.5}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1 span{margin-right:.5rem;vertical-align:bottom}h1 span.green,h1 span:last-child{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#000}h1 .date{max-width:500px}h2{line-height:1.2;margin-bottom:1rem}p{line-height:1.5;margin:0 0 20px}p img{margin:0}em{font-style:italic}strong{font-weight:700}[class*=' icon-']::before,[class^=icon-]::before,[data-icon]::before{font-family:taiga!important;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal!important;font-variant:normal!important;font-weight:400!important;line-height:1;speak:none;text-transform:none!important}hr{border:solid #212121;border-width:1px 0 0;clear:both;height:0;margin:10px 0 30px}a,a:visited{text-decoration:none}a:hover,a:visited:hover{-webkit-transition:color .3s linear;transition:color .3s linear}[data-icon]::before{content:attr(data-icon)}.admin-contrib .help .alt-image,.admin-third-parties .help .alt-image,.wysiwyg dl dt{font-style:italic}.icon-bug::before{content:'a'}.icon-copy::before{content:'b'}.icon-minimize::before{content:'c'}.icon-maximize::before{content:'d'}.icon-comment::before{content:'e'}.icon-plus::before{content:'f'}.icon-attachments::before{content:'g'}.icon-edit::before{content:'h'}.icon-documents::before{content:'i'}.icon-delete::before{content:'j'}.icon-arrow-bottom::before{content:'k'}.icon-arrow-left::before{content:'l'}.icon-arrow-right::before{content:'m'}.icon-arrow-up::before{content:'n'}.icon-briefcase::before{content:'o'}.icon-caret-down::before{content:'p'}.icon-caret-up::before{content:'q'}.icon-check-square::before{content:'r'}.icon-notification-error::before{content:'s'}.icon-settings::before{content:'t'}.icon-document::before{content:'u'}.icon-warning::before{content:'v'}.icon-move::before{content:'w'}.icon-drag-v::before{content:'x'}.icon-filter::before{content:'y'}.icon-help::before{content:'z'}.icon-reload::before{content:'A'}.icon-writer::before{content:'B'}.icon-stats::before{content:'C'}.icon-floppy::before{content:'D'}.icon-warning-alt::before{content:'E'}.icon-video::before{content:'F'}.icon-bulk::before{content:'G'}.icon-vunfold::before{content:'H'}.icon-tasks::before{content:'I'}.icon-kanban::before{content:'J'}.icon-search::before{content:'K'}.icon-wiki::before{content:'L'}.icon-team::before{content:'M'}.icon-vfold::before{content:'N'}.icon-issues::before{content:'O'}.icon-iocaine::before{content:'P'}.icon-archive::before{content:'Q'}.icon-capslock::before{content:'R'}.icon-upload::before{content:'S'}.icon-github::before{content:'T'}.icon-timeline::before{content:'U'}.icon-scrum::before{content:'V'}.icon-project::before{content:'W'}.icon-heart::before{content:'X'}.icon-eye::before{content:'Y'}@-webkit-keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@-webkit-keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;flex:10}}@keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;-ms-flex:10;flex:10}}@-webkit-keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes blink{85%{opacity:1}100%{opacity:.6}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote cite,sup{font-size:.9rem}.spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32;max-height:2rem;max-width:2rem}blockquote,blockquote p{line-height:1.25rem}blockquote{margin:0 0 20px;padding:.5rem 1.25rem}blockquote cite{display:block}blockquote cite::before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}sup{vertical-align:super}.icon{vertical-align:middle}.clickable{cursor:pointer}.not-clickable{cursor:default}.draggable{cursor:move}svg{height:1rem;width:1rem}.pika-single{z-index:999999}.pika-single .pika-title{color:#212121}.pika-single .is-selected .pika-button{background:#000;border-radius:0!important;box-shadow:inset 0 1px 3px #000}.pika-single .is-today .pika-button{color:#000}.pika-single .is-today.is-selected button{color:#fff}.pika-single .pika-button:hover{background:#212121!important;border-radius:0!important;box-shadow:inset 0 1px 3px #212121!important}fieldset{border:0;margin:0;padding:0;width:100%}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{border:1px solid;margin:0;padding:8px;width:100%}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{-webkit-transition:border .3s linear;transition:border .3s linear}button,button:active,button:focus{border:0;outline:0}textarea{min-height:10rem}.checksley-error-list{margin-bottom:0}.checksley-error-list li{padding:.2rem}.icon-capslock{bottom:.6rem;color:#757575;display:none;position:absolute;right:1rem}.auth,.error-main{bottom:0;z-index:999;left:0}.admin-membership header:after{clear:both;content:'';display:table}.admin-membership .check input{height:40px;width:85px}.admin-attributes .admin-attributes-section .checksley-error-list li{font-weight:100}.admin-roles p{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#757575}.auth .logo,.auth .tagline{color:#fff;text-align:center}.admin-attributes .admin-attributes-section{margin-bottom:2rem}.admin-attributes .admin-attributes-section .checksley-error-list{height:0;position:relative}.admin-attributes .admin-attributes-section .checksley-error-list li{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,36,0,.7);position:absolute;width:100%}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.project-values-title{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem;text-transform:uppercase}.project-values-title h2{margin:0}.auth .logo,.auth .tagline,.auth form{margin-bottom:1rem}.project-values-title h2 span{margin-left:.5rem;text-transform:none}.project-values-title a{display:inline-block}.auth{background:url(https://farm9.staticflickr.com/8449/7893171238_a201af22bc_k_d.jpg) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:fixed;right:0;top:0}.invitation-main .avatar,.invitation-main .invitation-container,.kanban{-webkit-box-orient:vertical;-webkit-box-direction:normal}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.auth .logo{font-size:3rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.auth .auth-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{text-align:center;width:100%}.auth .logo-svg svg{height:8rem;width:8rem}.kanban,.taskboard{height:calc(100vh - 40px)}.auth fieldset{margin-bottom:.5rem}.auth .login-text,.auth .register-text{text-align:center}.auth .login-text a:hover,.auth .register-text a:hover{color:#212121}.auth .button{color:#fff;display:block;text-align:center}.auth a:hover{color:#fff}.moustache{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moustache;animation-name:moustache;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;fill:rgba(0,0,0,.9);stroke:#212121;stroke-width:1px;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transition:.3s;transition:.3s}.moustache:hover{fill:rgba(33,33,33,.9);-webkit-transition:.3s;transition:.3s}.list-itemtype-project .icon path,.list-itemtype-project .list-itemtype-track-likers.active path,.list-itemtype-project .list-itemtype-track-watchers.active path,.list-itemtype-ticket .icon path,.list-itemtype-ticket .list-itemtype-track-likers.active path,.list-itemtype-ticket .list-itemtype-track-watchers.active path,.list-itemtype-timeline .icon path,.list-itemtype-timeline .list-itemtype-track-likers.active path,.list-itemtype-timeline .list-itemtype-track-watchers.active path,.list-itemtype-user .icon path,.list-itemtype-user .list-itemtype-track-likers.active path,.list-itemtype-user .list-itemtype-track-watchers.active path{fill:currentcolor}@-webkit-keyframes moustache{0%,30%,70%,90%{-webkit-transform:rotate(0);transform:rotate(0)}10%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}@keyframes moustache{0%,30%,70%,90%{-webkit-transform:rotate(0);transform:rotate(0)}10%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}.backlog-menu{background:#757575;color:#212121;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .trans-button{color:#212121;display:inline-block;padding:.4rem 1.5rem}.backlog-menu .trans-button.active,.backlog-menu .trans-button:hover{background:#757575;color:#757575}.backlog-menu .trans-button.active:hover{background:#c2c2c2}.backlog-menu .trans-button.move-to-sprint{display:none}.invitation-main,.invitation-main .invitation-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-menu .button-bulk{margin-left:.2rem}.invitation-main{background:url(https://farm9.staticflickr.com/8449/7893171238_a201af22bc_k_d.jpg) center center no-repeat;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-size:cover;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;z-index:999}.invitation-main .invitation-form .forgot-pass{font-size:.9rem}.invitation-main .avatar .person-name,.invitation-main .invitation-text,.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-weight:100;font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.invitation-main .invitation-container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar .person-name{color:#fff}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{color:#fff;text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{color:#757575;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#212121;-webkit-transition:color .3s linear;transition:color .3s linear}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header,.invitation-main .register-text{color:#fff}.invitation-main .login-form,.invitation-main .register-form{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .register-text a{color:#000}.invitation-main .button-auth{display:block}.invitation-main .button-blackish:hover{background:#000}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.issues .filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:260px}.issues .filters-inner{opacity:1;padding:1rem}.kanban{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px)}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.error-main,.taskboard-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.error-main{background:url(https://farm9.staticflickr.com/8449/7893171238_a201af22bc_k_d.jpg) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:fixed;right:0;top:0}.basic-table,.taskboard-inner{-webkit-box-orient:vertical;-webkit-box-direction:normal}.error-main .error-container{color:#fff;-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;text-align:center}.error-main .logo-svg{padding:0 32%;text-align:center;width:100%}.error-main h1{color:#fff;margin-bottom:3rem}.error-main a{color:#000}.error-main a:hover{color:#212121}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.taskboard-inner{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%}.us-story-main-data .us-title,.us-story-main-data header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.team h2{margin:1rem 0}.team h2 span:last-child{color:#000}.us-story-main-data .us-title,.us-story-main-data .us-title .us-number,.us-story-main-data .us-title .us-title-text{font-weight:400}.us-story-main-data .us-title .block-desc-container,.us-story-main-data .us-title .us-related-task{font-size:.9rem}.us-story-main-data .us-title,.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{font-size:1.2rem}.us-story-main-data .us-title .us-title-text{font-size:1.6rem}.blocked-warning .blocked,.blocked-warning .icon,.issue-nav a{font-size:2rem}.blocked-warning .blocked{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.us-story-main-data .us-title,.us-story-main-data .us-title .us-number,.us-story-main-data .us-title .us-title-text{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.us-story-main-data .us-title .block-description-title,.us-story-main-data .us-title.blocked .unblock{font-weight:800;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.card-placeholder p,.wiki .wiki-title{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32}.us-story-main-data{margin-bottom:1rem}.us-story-main-data header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.us-story-main-data .us-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#757575;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:.5rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear}.us-story-main-data .us-title.blocked{background:#ff2400;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:middle}.us-story-main-data .us-title.blocked .us-title-text,.us-story-main-data .us-title.blocked input{margin-bottom:.5rem}.us-story-main-data .us-title.blocked .us-name,.us-story-main-data .us-title.blocked .us-number,.us-story-main-data .us-title.blocked .us-related-task{color:#fff}.us-story-main-data .us-title.blocked a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title.blocked a:hover{color:#ff0062}.us-story-main-data .us-title.blocked .unblock{color:#fff;float:right}.us-story-main-data .us-title.blocked .unblock:hover{color:#ff0062;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title p{margin-bottom:0}.us-story-main-data .us-title .us-edit-name-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.us-story-main-data .us-title .edit-subject{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.us-story-main-data .us-title input{background:#fff;-webkit-box-flex:9;-webkit-flex-grow:9;-ms-flex-positive:9;flex-grow:9}.us-story-main-data .us-title .save-container{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.us-story-main-data .us-title .us-title-text{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-bottom:0;max-width:92%}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{max-height:1.5rem;max-width:1.5rem}.us-story-main-data .us-title .us-title-text:hover .icon-edit{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.us-story-main-data .us-title .us-number{color:#757575;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;line-height:2.2rem;margin-right:.5rem}.us-story-main-data .us-title .us-name{color:#757575;display:inline-block;line-height:2.2rem;padding-right:1rem;width:100%}.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{color:#757575;margin-left:.5rem}.us-story-main-data .us-title .icon-edit{opacity:0}.us-story-main-data .us-title .us-related-task{color:#757575;margin-top:.5rem}.us-story-main-data .us-title .us-related-task a{border-left:1px solid #757575;padding:0 .2rem}.us-story-main-data .us-title .us-related-task a:hover{color:#000}.us-story-main-data .us-title .us-related-task a:first-child{border:0}.us-story-main-data .us-title .block-description-title{color:#fff;margin-right:.5rem}.us-story-main-data .us-title .block-description{color:#fff;display:inline-block;margin-right:5rem}.basic-table,.subheader{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.blocked-warning{margin-bottom:1rem}.blocked-warning .blocked{color:#ff2400;line-height:2.5rem;margin-bottom:.5rem}.blocked-warning .icon{vertical-align:middle}.blocked-warning .block-description{color:#212121;margin:0}.duty-content .edit-description,.wiki-content{margin-bottom:2rem}.issue-nav{position:absolute;right:1rem;top:1rem}.subheader{display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:1280px){.subheader{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}}.subheader .ticket-created-by{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-basis:250px;-ms-flex-preferred-size:250px;flex-basis:250px}@media (max-width:1280px){.subheader .ticket-created-by{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}}.subheader .tags-block{-webkit-box-flex:3;-webkit-flex:3;-ms-flex:3;flex:3}@media (max-width:1280px){.subheader .tags-block{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}}.duty-content{position:relative}.duty-content .in-progress{cursor:progress}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#757575;cursor:pointer}.duty-content:hover .view-description .no-description{color:#212121}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#757575}.duty-content textarea{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-content .edit{color:#212121}.duty-content .view-description .edit{background:#757575;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .save{top:.4rem}.duty-content .edit-description .edit{position:absolute;right:2.5rem;top:.4rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wiki .remove{font-size:.9rem;color:#757575}.wiki .wiki-title{font-size:1.6rem}.wiki .remove:hover span{color:#212121;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove:hover .icon{color:#ff2400;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove .icon{color:#757575;margin-right:.2rem}.wiki-content{position:relative}.wiki-content .in-progress{cursor:progress}.wiki-content.editable:hover .wysiwyg{background:#757575;cursor:pointer}.wiki-content .view-wiki-content:hover .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .view-wiki-content .edit{background:#757575;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .icon:hover{color:#212121;opacity:.3;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .preview-icon{position:absolute;right:3.5rem}.wiki-content .edit-wiki-content .action-container{position:absolute;right:1rem;top:.3rem}.wiki-content .edit-wiki-content .edit{position:absolute;right:3.5rem;top:.4rem}.wiki-content .preview{padding-top:1.8rem}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row,.card-placeholder .placeholder-avatar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.basic-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #6b6b6b;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}.basic-table .row .width-1{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:4;-webkit-flex-grow:4;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:5;-webkit-flex-grow:5;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:7;-webkit-flex-grow:7;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.beta{left:0;position:absolute;top:0;z-index:9999}.button,.button-auth,.button-blackish,.button-bulk,.button-gray,.button-green,.button-red,.trans-button,a.button-gray,a.button-green{font-weight:100;font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:0 0;border:0;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;padding:.4rem 2rem;text-align:center;text-transform:uppercase;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:middle}.trans-button{font-size:1rem}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button:hover,.trans-button:hover{color:#fff;-webkit-transition:all .2s linear;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.trans-button span{-webkit-animation:loading .5s linear;animation:loading .5s linear}.admin-project-export-result .spin img,.loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.button span,.button-auth span,.button-blackish span,.button-bulk span,.button-gray span,.button-green span,.button-red span,.trans-button span{color:#fff}.button .icon,.button-auth .icon,.button-blackish .icon,.button-bulk .icon,.button-gray .icon,.button-green .icon,.button-red .icon,.trans-button .icon{color:#fff;margin-right:.3rem}.trans-button .icon,.trans-button span{color:#212121;-webkit-transition:color .2s linear;transition:color .2s linear}.trans-button.active .icon,.trans-button.active span,.trans-button:hover .icon,.trans-button:hover span{color:#000}.trans-button:visited{color:#212121}.submit-button{width:100%}.button-green,a.button-green{background:#000}.button-green.active,.button-green:hover,a.button-green.active,a.button-green:hover{background:#212121;color:#fff}.button-gray,a.button-gray{background:#757575}.button-gray.active,.button-gray:hover,a.button-gray.active,a.button-gray:hover{background:#212121;color:#fff}.button-blackish{background:#212121;color:#757575}.button-blackish:hover{background:#212121;color:#fff}.button-red{background:#ff0062}.button-red:hover{background:#ff2400;color:#fff}.button-red .icon{color:#fff}.button-block{background:#fff;color:#ff2400}.button-block:hover{background:#ff0062;color:#fff}.button-bulk{background:#000;padding:.35rem .5rem}.button-bulk .icon{margin-right:0}.button-auth,.button-bulk:hover{background:#212121}.button-auth .icon,.button-auth img{font-size:1.2rem;color:#fff;margin-right:.5rem}.button-auth:hover{background:#000}.card-placeholder{background:#707070;border:1px dashed #616161;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:flex}.card-placeholder .image{background:#616161;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.card-placeholder .line{background:#616161;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{color:#757575;margin:0}.check{background-color:#5c5c5c;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:500px;left:-10px;opacity:0;position:absolute;top:-10px;width:500px;z-index:999}.check input+div{background-color:#757575;height:25px;-webkit-transition:all .2s linear;transition:all .2s linear;width:50%}.check input~.check-text{font-weight:400;font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff;position:absolute;top:.2rem}.check input~.check-yes{opacity:0;right:.5rem}.check input~.check-no{left:.5rem;opacity:.6}.check input:checked+div{background-color:#212121;margin-left:50%;-webkit-transition:all .2s linear;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.check input:disabled{cursor:auto}.check input:disabled+div{background-color:#757575}.ticket-created-by{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}@media (max-width:1280px){.ticket-created-by{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:.5rem}}.ticket-created-by .user-avatar{-webkit-flex-basis:2rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-left:.5rem}.ticket-created-by .user-avatar img{width:100%}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{font-weight:100;font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block;text-align:right}.ticket-estimation .points-per-role,.wysiwyg-help{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}@media (max-width:1280px){.ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ticket-created-by .created-by{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{text-align:left}}.ticket-created-by .created-by .created-title{color:#000}.ticket-created-by .created-by .created-date{margin-left:.5rem}@media (max-width:1280px){.ticket-created-by .created-by .created-date{margin-left:0}}.drag-drop-help,.help-button,.help-markdown{font-size:.75rem}.wysiwyg-help{background:#757575;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:-.5rem;padding:.25rem .5rem}.drag-drop-help{color:#757575}.help-button:hover span,.help-markdown:hover span{-webkit-transition:color .2s linear;transition:color .2s linear}.help-button:hover .icon,.help-markdown:hover .icon{color:#212121;-webkit-transition:color .2s linear;transition:color .2s linear}.help-button .icon,.help-markdown .icon{margin-right:.2rem}.ticket-estimation .popover,.ticket-estimation .popover.fix,.ticket-estimation .ticket-role-points .points,.ticket-estimation .ticket-role-points .role{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .ticket-role-points:last-child .icon-arrow-bottom,.ticket-estimation .ticket-role-points:last-child .points,.ticket-estimation .ticket-role-points:last-child .role{font-weight:400;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#757575}.ticket-estimation .popover,.ticket-estimation .popover a,.ticket-estimation .popover.fix,.ticket-estimation .popover.fix a{font-size:.9rem}.ticket-estimation .points-per-role{display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.empty-burndown,.loading-bar{-webkit-box-orient:horizontal}.ticket-estimation .ticket-role-points{background:rgba(117,117,117,.2);color:#757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.1rem;min-height:2rem;padding:.5rem 1rem;position:relative;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .ticket-role-points.clickable.active,.ticket-estimation .ticket-role-points.clickable:hover{background:rgba(33,33,33,.9);color:#757575}.ticket-estimation .ticket-role-points.clickable.active .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable.active .points,.ticket-estimation .ticket-role-points.clickable.active .role,.ticket-estimation .ticket-role-points.clickable:hover .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable:hover .points,.ticket-estimation .ticket-role-points.clickable:hover .role{color:#757575}.ticket-estimation .ticket-role-points:last-child{background:rgba(0,0,0,.5);border-bottom:0;color:#757575}.ticket-estimation .ticket-role-points .icon-arrow-bottom{color:#757575;margin-left:.25rem;vertical-align:middle}.ticket-estimation .popover,.ticket-estimation .popover.fix{margin:0;z-index:99;background:#212121;position:absolute;list-style-type:none}.ticket-estimation .ticket-role-points .points{color:#212121}.ticket-estimation .popover{color:#fff;display:none;left:.5rem;padding:10px;top:100%;width:200px}.ticket-estimation .popover a{border-bottom:1px solid #212121;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#212121;content:'';height:10px;left:10px;position:absolute;top:-5px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:10px}.ticket-estimation .popover li{display:inline-block;width:23%}.ticket-estimation .popover a{display:block;text-align:center}.ticket-estimation .popover a.active,.ticket-estimation .popover a:hover{background:#212121;color:#fff}.ticket-estimation .popover.fix{color:#fff;display:none;left:-160px;padding:10px;top:100%;width:200px}.ticket-estimation .popover.fix a{border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.ticket-estimation .popover.fix a:last-child{border:0}.ticket-estimation .popover.fix a:hover{color:#212121;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#212121;content:'';height:10px;left:90%;position:absolute;top:-5px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:10px}.single-filter{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;cursor:pointer;display:block;margin-bottom:.5rem;opacity:.5;position:relative}.single-filter:after{clear:both;content:'';display:table}.single-filter.active,.single-filter.selected,.single-filter:hover{color:#212121;opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{background:#5c5c5c;display:block;width:100%}.single-filter .number{background:#424242;position:absolute;right:0;top:0}.single-filter .icon-delete{color:#212121;position:absolute;right:.5rem;top:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.single-filter .icon-delete:hover{color:#ff2400;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task .task-name{font-weight:800;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.kanban-task .avatar a,.kanban-task .task-text,.kanban-task-maximized .task-archived p,.kanban-task-maximized .task-points,.kanban-task-minimized .task-archived{font-size:.9rem}.kanban-task-minimized .icon-drag-h{font-size:1rem}.kanban-task .icon-drag-h,.kanban-task .icon-edit{font-size:1.2rem}.kanban-task{background:#F0EFD1;border:1px solid #000;box-shadow:none;cursor:move;margin:.2rem;position:relative}.kanban-task:last-child{margin-bottom:0}.kanban-task:hover .icon-drag-h,.kanban-task:hover .icon-edit{color:#000;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.kanban-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.kanban-task.ui-sortable-placeholder{background:#212121}.kanban-task.blocked{background:#ff2400;border:1px solid #cc1d00;color:#fff}.kanban-task.blocked a,.kanban-task.blocked span{color:#fff}.kanban-task.card-placeholder{background:#707070;border:3px dashed #616161;cursor:default}.kanban-task .kanban-tagline{border-color:#000;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.6rem}.kanban-task .kanban-tag{border-top:.3rem solid #000;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.kanban-task .kanban-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.kanban-task .avatar-wrapper{-webkit-flex-basis:55px;-ms-flex-preferred-size:55px;flex-basis:55px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:55px}.kanban-task .avatar-wrapper img{width:100%}.kanban-task .avatar a{text-align:center}.kanban-task .avatar img{margin:0 auto}.kanban-task .avatar img:hover{border:2px solid #000;-webkit-transition:border .3s linear;transition:border .3s linear}.kanban-task .task-text{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 .5rem 0 .8rem}.kanban-task .task-assigned{color:#000;display:block}.kanban-task .task-num{color:#212121;margin-right:.3rem}.kanban-task .loading{bottom:.5rem;position:absolute}.kanban-task .icon-drag-h,.kanban-task .icon-edit{color:#000;opacity:0;position:absolute;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.kanban-task .icon-drag-h:hover,.kanban-task .icon-edit:hover{color:#000;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task-maximized .task-archived{background:#686868;padding:.5rem;text-align:left;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived:hover{background:#616161;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-maximized .task-archived span{color:#757575}.kanban-task-maximized .task-archived p{color:#757575;margin:0}.kanban-task-maximized .task-archived p:last-child{color:#757575;margin:.5rem 0;text-align:center}.kanban-task-maximized .icon-edit,.kanban-task-maximized .loading{bottom:.2rem;right:.5rem}.kanban-task-maximized .icon-drag-h{font-size:2rem;bottom:.2rem;cursor:move;right:45%}.kanban-task-maximized .task-points{color:#000;margin:0}.kanban-task-maximized .task-points span{display:inline-block}.kanban-task-maximized .task-points span:first-child{padding-right:.2rem}.kanban-task-maximized .task-points .points-text{text-transform:lowercase}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{line-height:1.4;text-transform:none}.kanban-task-maximized .kanban-tag{border-top:.3rem solid}.kanban-task-minimized .kanban-task-inner{padding:0 .3rem}.kanban-task-minimized .task-archived{background:#686868;padding:.3rem;text-align:left}.kanban-task-minimized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-minimized .task-archived span{color:#757575}.kanban-task-minimized .task-archived .task-name{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kanban-task-minimized .task-archived p{color:#757575;margin:0}.kanban-task-minimized .task-archived p:last-child{display:none}.kanban-task-minimized .task-num{vertical-align:top}.kanban-task-minimized .task-name{display:inline-block;overflow:hidden;width:135px}.kanban-task-minimized .task-points{display:none}.kanban-task-minimized .icon-drag-h,.kanban-task-minimized .icon-edit{top:1.4rem}.kanban-task-minimized .icon-edit{bottom:.2rem;right:1rem}.kanban-task-minimized .icon-drag-h{cursor:move;right:.1rem;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.kanban-task-minimized .kanban-tag{border-top:.2rem solid}.level{background-color:#757575;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project p,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user .extra-info,.list-itemtype-user p{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{font-weight:400;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.list-itemtype-project .list-itemtype-track,.list-itemtype-ticket .list-itemtype-track,.list-itemtype-timeline .list-itemtype-track,.list-itemtype-user .extra-info,.list-itemtype-user .list-itemtype-track{font-size:.9rem}.list-itemtype-ticket h2{font-size:1rem}.list-itemtype-project h2,.list-itemtype-user h2,.loader p{font-size:1.2rem}.list-itemtype-project{border-bottom:1px solid #757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{color:#757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-project .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-project .list-itemtype-track-likers,.list-itemtype-project .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#000}.list-itemtype-project .icon svg{height:1rem;width:1rem}.list-itemtype-project h2,.list-itemtype-project p{margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-project .list-itemtype-avatar img{width:100%}.list-itemtype-project .list-itemtype-project-data-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;width:3rem}.list-itemtype-project .list-itemtype-project-members,.list-itemtype-project .list-itemtype-project-tags{-webkit-align-self:flex-end;-ms-flex-item-align:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-project .list-itemtype-project-image img{width:100%}.list-itemtype-project .list-itemtype-project-members{align-self:flex-end;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-wrap:wrap-reverse;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse;margin-top:1rem}.list-itemtype-project .list-itemtype-project-members img{border-radius:.1rem;margin-right:.3rem;width:2rem}.list-itemtype-project .list-itemtype-project-tags{align-self:flex-end;display:flex;-webkit-box-flex:3;-webkit-flex:3;-ms-flex:3;flex:3;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:.5rem}.list-itemtype-project .tag{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket h2,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user h2,.list-itemtype-user p{margin-bottom:0}.list-itemtype-ticket,.list-itemtype-timeline,.list-itemtype-user{border-bottom:1px solid #757575;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track{color:#757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-ticket .list-itemtype-track-likers,.list-itemtype-ticket .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user,.list-itemtype-user .list-itemtype-track{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#000}.list-itemtype-ticket .icon svg{height:1rem;width:1rem}.list-itemtype-ticket .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-ticket .list-itemtype-avatar img{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-project{color:#757575}.list-itemtype-ticket .list-itemtype-ticket-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-id{color:#757575;margin-right:.3rem}.list-itemtype-ticket .ticket-blocked{color:#ff2400;margin-left:.3rem}.list-itemtype-user{display:flex}.list-itemtype-user .list-itemtype-track{color:#757575;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-user .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-user .list-itemtype-track-likers,.list-itemtype-user .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#000}.list-itemtype-user .icon svg{height:1rem;width:1rem}.list-itemtype-user .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .list-itemtype-avatar img{width:100%}.list-itemtype-user .extra-info{margin-top:.25rem}.list-itemtype-timeline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track{color:#757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-timeline .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-timeline .list-itemtype-track-likers,.list-itemtype-timeline .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track-likers .icon,.list-itemtype-timeline .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-timeline .list-itemtype-track-likers.active,.list-itemtype-timeline .list-itemtype-track-watchers.active{color:#000}.list-itemtype-timeline .icon svg{height:1rem;width:1rem}.list-itemtype-timeline .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-timeline h2{margin-bottom:0}.admin-menu li,.empty-backlog .title,.empty-burndown .title,.sprints-empty .title,.taskboard-table-header .task-colum-name,.ticket-header .detail-status-inner,.ticket-header .ticket-title,.wysiwyg h1,.wysiwyg h2,.wysiwyg h3,tg-project-menu{text-transform:uppercase}.list-itemtype-timeline .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.loader p{color:#757575;text-align:center}.loader{background-color:#fff;bottom:0;display:none;height:100%;left:0;opacity:0;position:fixed;right:0;top:0;z-index:-100}.loader .container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar,.notification-light{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.loading-bar{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:loadBar;animation-name:loadBar;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;background:#757575;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{-webkit-animation-delay:0s;animation-delay:0s;background:#ffc107}.loading-bar .item-1{-webkit-animation-delay:1s;animation-delay:1s;background:#009688}.loading-bar .item-2{-webkit-animation-delay:2s;animation-delay:2s;background:#e91e63}.loading-bar .item-3{-webkit-animation-delay:3s;animation-delay:3s;background:#9c27b0}.loading-bar .item-4{-webkit-animation-delay:4s;animation-delay:4s;background:#cddc39}.loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;-webkit-transform-origin:32 32;transform-origin:32 32}.markItUpHeader ul{background:#757575;padding:.3rem}.markItUpHeader ul li{display:inline-block;float:none}.markItUpHeader ul li a{opacity:.8}.markItUpHeader ul li a:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.markItUpHeader ul .preview-icon{position:absolute;right:2.5rem}.markItUpContainer{padding:0}.markdown{position:relative}.preview .actions{background:#757575;margin-top:.5rem;min-height:2rem;padding:.3rem}.notification-light p{font-weight:100;font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.notification-message-success .warning{font-size:1.2rem;color:#fff;line-height:1.2}.notification-message-error .warning{font-size:2rem;color:#fff;line-height:2.4rem}.notification-message-error .icon-notification-error{font-size:3rem;display:inline;vertical-align:sub}.notification-message-error .warning,.notification-message-success .warning{font-weight:800;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.notification-message-success{background:rgba(33,33,33,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);opacity:1;right:-370px;top:2%;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{-webkit-animation:animSlide 2s linear both;animation:animSlide 2s linear both;opacity:1}.notification-message-success p{margin:0}@-webkit-keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}.notification-message-error{background:rgba(255,36,0,.9);top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error.inactive{-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-light p,.notification-message-error .text p{margin:0}.notification-message-error .icon-delete{color:#fff;position:absolute;right:1rem;top:1rem}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(117,117,117,.95);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;opacity:0;padding:1rem;position:absolute;top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s;width:100%;z-index:99999}.paginator ul,.summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.notification-light.inactive{opacity:0;-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s}.notification-light.active{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s;transition:all .6s}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{margin-right:1rem;width:2rem}.notification-light .close path{fill:#fff}.notification-message-light-error{background:rgba(255,36,0,.8)}.paginator{margin:2rem 0}.paginator ul{display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator .dots,.paginator a{background:#757575;color:#fff;padding:.5rem 1rem;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator .active span,.paginator a:hover{background:#212121}.paginator a:hover{color:#fff;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator .dots{background:0 0;color:#757575}.v-pagination-list{overflow:hidden}.v-pagination-next,.v-pagination-previous{background-color:#757575;color:#757575;display:block;padding:.1rem 0;text-align:center;visibility:hidden;width:100%}.select-color,.select-color:after{background:#212121;position:absolute}.v-pagination-next:hover,.v-pagination-previous:hover{background-color:#212121;-webkit-transition:background .3s linear;transition:background .3s linear}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.private{display:inline-block;margin-left:.5rem;width:.5rem}.private svg{width:1rem;height:1rem}.private path{fill:#757575;-webkit-transition:fill .3s linear;transition:fill .3s linear}.select-color{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;border-radius:0 10px 10px 0;padding:15px}.select-color,.select-color a{font-size:.9rem}.select-color input{font-weight:400;font-size:1rem}.select-color a{border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.select-color a:last-child{border:0}.select-color a:hover{color:#212121;-webkit-transition:color .3s linear;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:15px}.select-color li{float:left;margin:0 .5rem .5rem 0}.select-color li:nth-child(7n){margin-right:0}.select-color li:nth-last-child(-n+7){margin-bottom:0}.select-color .color{background-color:#757575;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background-color:#757575;width:243px}.select-color input::-webkit-input-placeholder{color:#757575}.select-color input::-moz-placeholder{color:#757575}.select-color input:-moz-placeholder{color:#757575}.select-color input:-ms-input-placeholder{color:#757575}.select-color .selected-color{background:#757575;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.empty-burndown,.empty-burndown .title,.summary .description{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.empty-burndown a,.summary .number{font-weight:800;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.summary .description{font-size:.9rem}.empty-burndown .title{font-size:1.2rem}.summary{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;padding:1em}.summary .summary-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .data .number{color:#212121}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{line-height:1}.summary .stats{cursor:pointer;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .color-line,.summary .stats:hover .graph{fill:#212121;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats.active .graph,.summary .stats.active svg,.summary .stats:hover svg{fill:#000}.summary .stats.active .color-line,.summary .stats.active .white-line{display:none}.summary .stats svg{fill:#000;height:100%;max-height:2rem;max-width:2rem;-webkit-transition:all .2s;transition:all .2s;width:100%}.summary .stats .color-line,.summary .stats .graph{fill:#424242;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats .white-line{fill:#212121}.empty-burndown path,.track-button.active .track-icon path{fill:#000}.summary .stats .color-line,.summary .stats .white-line{display:block}.summary-progress-bar{background:#fff;height:30px;margin-bottom:0;margin-right:10px;padding:3px;position:relative;width:15%}.summary-progress-bar .current-progress{background:#212121;height:24px}.summary-progress-bar .defined-points{background:#ff0062;height:24px;position:absolute;width:calc(100% - 6px)}.summary-progress-bar .project-points-progress{background:#fff;height:24px;position:absolute}.summary-progress-bar .closed-points-progress{background:#212121;height:24px;position:absolute}.large-summary{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.large-summary .large-summary-wrapper{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.empty-burndown,.taskboard-task .taskboard-tagline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.large-summary .summary-progress-bar{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.empty-burndown,.upvote-btn{-webkit-align-content:center;-ms-flex-line-pack:center}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats-divider{margin-right:2rem}.large-summary .icon{font-size:1.4rem;margin-right:.4rem}.large-summary .icon.icon-stats{color:#000;float:right;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#212121;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#212121}.large-summary .icon.icon-stats.active:hover{color:#000;-webkit-transition:color .3s linear;transition:color .3s linear}.empty-burndown{align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(0,0,0,.15);display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{-webkit-flex-basis:5rem;-ms-flex-preferred-size:5rem;flex-basis:5rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;width:5rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.empty-burndown .title{color:#000;margin:0}.empty-burndown a{-webkit-animation:blink 2s infinite;animation:blink 2s infinite}.graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.wysiwyg,.wysiwyg .codehilite{overflow:auto}.graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;-webkit-transition:none;transition:none}.tag{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-radius:0 5px 5px 0;color:#212121;display:inline-block;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.tag,.tags-block .add-tag-text,.tags-block .tag{font-size:.9rem}.tags-block .icon-plus{font-size:1.2rem}.tag .icon-delete{color:#757575;margin-left:1rem}.tag .icon-delete:hover{color:#ff2400}.ui-autocomplete{background:#fff;border:1px solid #757575;z-index:99910}.ui-autocomplete .ui-state-focus{background:#212121}.ui-autocomplete li{cursor:pointer}.ui-helper-hidden-accessible{display:none}.tags-block .tags-container{display:inline-block}.tags-block input{margin-right:.25rem;padding:.4rem;width:14rem}.tags-block input+.icon-floppy{margin-left:.5rem}.tags-block .tag{margin:0 .5rem .5rem 0;padding:.5rem}.tags-block .add-tag{color:#757575}.tags-block .add-tag:hover{color:#212121}.taskboard-task .task-name{font-weight:800;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name,.watch-options a{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.taskboard-task .task-assigned,.taskboard-task .taskboard-text,.taskboard-task .taskboard-user-avatar a{font-size:.9rem}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit,.taskboard-task .icon-iocaine{font-size:1.2rem}.taskboard-task{background:#F0EFD1;border:1px solid #000;box-shadow:none;cursor:move;margin:.2rem;position:relative}.taskboard-task:hover .icon-drag-h,.taskboard-task:hover .icon-edit{color:#000;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.taskboard-task.ui-sortable-placeholder{background:#212121}.taskboard-task .blocked{background:#ff2400;border:1px solid #cc1d00;color:#fff}.taskboard-task .blocked a,.taskboard-task .blocked span,.taskboard-task .blocked:hover .icon-drag-h,.taskboard-task .blocked:hover .icon-edit{color:#fff}.taskboard-task.card-placeholder{background:#707070;border:3px dashed #616161;cursor:default}.taskboard-task .taskboard-tagline{border-color:#000;display:flex;height:.6rem}.taskboard-task .taskboard-tag{border-top:.3rem solid #000;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.taskboard-task .taskboard-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.taskboard-task .taskboard-user-avatar{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:55px}.taskboard-task .taskboard-user-avatar a{display:block;text-align:center}.taskboard-task .taskboard-user-avatar img{margin:0 auto}.taskboard-task .taskboard-user-avatar img:hover{border:2px solid #000;-webkit-transition:border .3s linear;transition:border .3s linear}.taskboard-task .iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.taskboard-task .icon-iocaine{background:#000;border-radius:5px;color:#fff;left:.2rem;padding:.1rem;position:absolute;top:1rem}.taskboard-task .task-assigned{color:#000;display:block}.taskboard-task .task-assigned:hover{color:#000}.taskboard-task .task-num{color:#212121;margin-right:.5em}.taskboard-task .taskboard-text{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;padding:0 .5rem 0 1rem;word-wrap:break-word}.taskboard-task .icon{-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task .loading{bottom:.5rem;position:absolute}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit{bottom:.5rem;color:#000;opacity:0;position:absolute}.taskboard-task .icon-drag-h:hover,.taskboard-task .icon-edit:hover{color:#000}.taskboard-task .icon-edit,.taskboard-task .loading{right:1rem}.taskboard-task .icon-drag-h{font-size:2rem;cursor:move;right:45%}.task-drag{box-shadow:1px 1px 15px 6px rgba(0,0,0,.1)}.watch-options a{font-weight:100}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;position:relative}.track-button .track-inner{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;background:#757575;border-radius:4px 0 0 4px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;margin-right:.1rem;min-width:140px}.track-button .track-button-counter,.watch-options a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.track-button .track-inner:hover{background:#686868;-webkit-transition:background .3s;transition:background .3s}.track-button .track-inner span{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.track-button .track-inner .icon-arrow-up{margin-left:auto;padding:0 .5rem;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.track-button:hover{color:#212121}.track-button.active .track-inner{background:rgba(33,33,33,.2)}.track-button.watch-container{margin-right:1rem;position:relative}.track-button .track-icon{padding:.3rem .6rem .3rem .75rem}.track-button .track-icon svg{height:1.1rem;position:relative;top:2px;width:1.1rem}.track-button .track-icon path{fill:#212121}.track-button .track-button-counter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #757575;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;min-width:2rem}.like-button.active.is-hover .track-inner,.watch-button.active.is-hover .track-inner{background:#ff2400;color:#757575;-webkit-transition:background .3s;transition:background .3s}.like-button.active.is-hover path,.watch-button.active.is-hover path{fill:#ff0062}.watch-options{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;background:rgba(0,0,0,.9);border-radius:4px;margin:2.5rem 0 0;min-width:300px;padding:1rem;position:absolute;right:0;top:0;z-index:99}.watch-options.hidden{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse}.watch-options li{margin:0}.assigned-to-list,.ticket-watchers{margin-top:1rem}.watch-options li:last-child a{border:0}.watch-options a{border-bottom:1px solid rgba(117,117,117,.3);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.assigned-to-list .user-list-single,.upvote-btn{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.watch-options a.active{color:#212121}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check path{fill:#212121}.upvote-btn a.active path,.upvote-btn a:hover path{fill:#000}.upvote-btn{align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#757575;color:#757575;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#686868;color:#000;-webkit-transition:background .3s;transition:background .3s}.upvote-btn a.active{background:rgba(33,33,33,.2);color:#000;-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.is-hover{background:#ff2400;color:#757575}.upvote-btn a.is-hover svg{-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.is-hover path{fill:#ff0062}.upvote-btn svg{height:1rem;width:1rem}.assigned-to-list .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.upvote-btn span{display:block}.upvote-btn path{fill:#757575}.assigned-to-list .user-list-single{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #757575;display:flex;padding:.25rem 0;vertical-align:middle}.assigned-to-list .user-list-single:last-child{border:0}.assigned-to-list .user-list-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-name{color:#212121;margin-left:.5rem}.assigned-to-list .user-list-single.selected,.assigned-to-list .user-list-single:hover{background:#949494;cursor:pointer}.assigned-to-list .user-list-single:hover{-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{background:#8c8c8c;cursor:pointer;margin-bottom:1rem;position:relative;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.1s;transition-delay:.1s}.assigned-to-list .user-list-single.is-active .icon-delete{opacity:1;position:absolute;right:1rem;top:1.5rem;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .user-list-single{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.25rem 0;vertical-align:middle}.ticket-watchers .user-list-single:last-child{border:0}.ticket-watchers .user-list-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-watchers .user-list-name{color:#212121;margin-left:.5rem;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.ticket-watchers .user-list-single:hover .icon-delete{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .icon-delete{opacity:0;position:absolute;right:.5rem;top:0;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.ticket-watchers .icon-delete:hover{color:#ff2400;-webkit-transition:color .3s ease-in;transition:color .3s ease-in}.wysiwyg code,.wysiwyg pre{font-size:.9rem}.wysiwyg h2{font-size:1.2rem}.wysiwyg h1{font-weight:400;font-size:2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.wysiwyg h2,.wysiwyg h3{font-weight:800;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.wysiwyg{line-height:1.4rem;margin-bottom:2rem;padding:1rem}.wysiwyg h1{line-height:2.5rem}.wysiwyg h2{margin-bottom:.5rem}.wysiwyg ol,.wysiwyg ul{list-style-position:outside;margin-left:1rem}.wysiwyg ul{list-style-type:disc}.wysiwyg dl dt{font-size:1em;font-weight:700;margin-top:16px;padding:0}.wysiwyg dl dd{margin-bottom:16px;padding:0 16px}.wysiwyg p,.wysiwyg table{margin-bottom:1rem}.wysiwyg a{color:#000}.wysiwyg a:hover{color:#212121}.wysiwyg code,.wysiwyg pre{background:#3b3b3b;color:#757575;direction:ltr;font-family:'courier new',monospace;margin-bottom:1rem;overflow:auto;unicode-bidi:embed;white-space:pre}.admin-functionalities .functionality .title,.admin-membership-table .avatar .name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-membership-table .avatar figcaption span,.admin-submenu ul a span,.admin-submenu-roles .single-role,.admin-webhooks .webhook-url span,.custom-fields-table .custom-description{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wysiwyg pre{line-height:1.4rem;padding:.5rem}.wysiwyg table{border:1px solid #757575}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#757575 1px solid}.wysiwyg th{border-right:#757575 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#757575 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.wysiwyg textarea{background:#fff;max-height:none}.admin-common .total{font-size:1.2rem;background-color:#f5f5f5;color:#444;padding:.3rem 1rem}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{margin-bottom:2rem}.admin-common .total:hover .edit-value{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-field-options{margin-bottom:1rem;text-align:right}.custom-fields-table{margin-bottom:2em}.custom-fields-table .row{border-bottom:0;padding:.5rem 0}.custom-fields-table .table-header{border-bottom:3px solid #f5f5f5}.custom-fields-table .table-header .custom-description span,.custom-fields-table .table-header .custom-name span{padding-left:1.1rem}.custom-fields-table .table-body form:last-child .row{border:0}.custom-fields-table .table-body .row:hover{background:rgba(157,206,10,.05);cursor:move;-webkit-transition:background .2s linear;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag-v{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-fields-table .table-body form.row:hover{background:0 0;cursor:default}.custom-fields-table .table-body .custom-description{color:#b8b8b8}.custom-fields-table .single-custom-field{border-bottom:1px solid #f5f5f5;color:#555}.custom-fields-table .icon-drag-v{color:#b8b8b8;opacity:0;padding:0 .1rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .icon-drag-v:hover{color:#555;cursor:move;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{color:#555;margin-right:.5rem}.custom-fields-table .custom-name{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{max-width:100%;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.custom-fields-table .custom-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.admin-functionalities .functionality{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.3rem;margin-right:.3rem;opacity:.5;padding:1rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:top;width:32%}.admin-functionalities .functionality.active{background-color:rgba(114,161,20,.3);opacity:1}.admin-functionalities .functionality .icon{font-size:3rem;-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;margin:0 auto;min-width:60px}.admin-functionalities .functionality .desc{text-align:center;width:100%}.admin-functionalities .functionality .activate-input{display:none}.admin-functionalities .functionality .activate-input+label{color:#fff;cursor:pointer;display:block;text-align:center}.admin-functionalities .functionality .title{display:block}.admin-functionalities .functionality select{margin-top:1rem}.admin-functionalities .videoconference-attributes select{margin-bottom:.5rem}.admin-functionalities .button-green{color:#fff;display:block;text-align:center}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .delete,.admin-menu li{font-size:1.2rem}.admin-membership-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.admin-membership-table .avatar figcaption{margin-left:1rem;width:75%}.admin-membership-table .avatar figcaption span{width:100%}.admin-membership-table .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:35px}.admin-membership-table .avatar .email,.admin-membership-table .avatar .name{display:block;width:100%}.admin-membership-table .header-role,.admin-membership-table .header-status{padding-left:.5rem}.admin-membership-table .row-role{padding-right:1rem}.admin-membership-table .row-status{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.admin-membership-table .active,.admin-membership-table .resend{padding:.4rem .5rem}.admin-membership-table .active{background-color:#f5f5f5}.admin-membership-table .resend{background-color:#72a114;color:#fff}.admin-membership-table .resend:hover{background-color:#9dce0a;color:#fff;-webkit-transition:background-color .3s linear;transition:background-color .3s linear}.admin-membership-table .delete:hover{color:red}.admin-membership-table .pending{color:#ff8282}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-webkit-flex-basis:210px;-ms-flex-preferred-size:210px;flex-basis:210px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.admin-menu li{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #dcdcdc}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.admin-project-export-result .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;-webkit-transform-origin:32 32;transform-origin:32 32}.project-details .loading-spinner,.ticket-assigned-to .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.admin-project-export-buttons{margin:2rem 0 1rem}.admin-project-export-result{margin-top:1rem}.admin-project-export-result .spin{margin:0 auto;width:2.5rem}.admin-project-export-result .spin img{width:100%}.admin-project-export-result h3{font-size:1.2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin:.5rem;padding:.5rem;text-align:center}.admin-roles .general-category,.admin-roles .role-name,.project-details .looking-for-people,.project-details label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-project-export-result p{color:#b8b8b8;margin:.5rem 0;text-align:center}.project-details .delete-project:hover,.project-details .use-default-image:hover{color:red}.project-details .delete-project,.project-details .image-help,.project-details .private-or-public,.project-details .use-default-image{font-size:.75rem}.project-details .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;border:0;-webkit-transform-origin:center center;transform-origin:center center}.project-details form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-details fieldset{margin-bottom:1rem}.project-details label{display:block;margin-bottom:.2rem}.project-details .project-details-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.project-details .project-details-image .image{width:100%}.project-details .image-container{position:relative;margin-bottom:0}.project-details .loading-overlay{display:none}.project-details .loading-overlay.active{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.project-details .image-help{line-height:1rem;margin-bottom:.5rem;text-align:center}.project-details .use-default-image{text-align:center}.project-details .project-details-form-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.project-details form{display:block}}.project-details .looking-for-people{border-bottom:1px solid #f5f5f5;border-top:1px solid #f5f5f5;padding:1rem 0}.project-details .looking-for-people-selector{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-details .looking-for-people-selector svg{width:1rem;height:1rem;fill:#b8b8b8;margin-left:.5rem}.project-details .looking-for-people-selector .check{margin-left:auto}.project-details .looking-for-people-reason{display:block;margin-top:1rem}.project-details .looking-for-people-reason.ng-hide-remove-active{-webkit-animation:dropdownFade .3s;animation:dropdownFade .3s}.project-details .looking-for-people-reason.ng-hide-add-active{-webkit-animation:dropdownFade .2s reverse;animation:dropdownFade .2s reverse;-webkit-animation-delay:.1s;animation-delay:.1s}.project-details .delete-project{display:block;margin-top:1rem;text-align:right}.project-details .private-or-public{color:#b8b8b8;margin-bottom:2rem}.project-details .private-or-public svg{width:1.1rem;height:1.1rem;fill:#b8b8b8;margin-right:.5rem;vertical-align:middle}.project-privacy-settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.project-privacy-settings .privacy-option{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-transition:.2 linear;transition:.2 linear}.project-privacy-settings .privacy-option:first-child{margin-right:.5rem}.project-privacy-settings input[type=radio],.project-privacy-settings input[type=text]{display:none}.project-privacy-settings label{background:#f5f5f5;color:#444;text-align:center;-webkit-transition:all .2s linear;transition:all .2s linear}.project-privacy-settings label:hover{background:rgba(157,206,10,.4);color:#444}.project-privacy-settings label:hover svg{fill:#444}.project-privacy-settings label svg{width:1.1rem;height:1.1rem;fill:#444;margin-left:.5rem;vertical-align:middle}.project-privacy-settings .privacy-project:checked+label{background:#9dce0a;color:#fff}.project-privacy-settings .privacy-project:checked+label svg{width:1.1rem;height:1.1rem;fill:#fff}.project-privacy-settings .privacy-project:checked~input[type=text]{display:block}.admin-roles .general-category{font-size:.9rem}.admin-roles .edit-value{font-size:1rem}.admin-roles .role-name{font-size:2rem;color:#444}.admin-roles .edit-value{color:#b8b8b8;cursor:pointer;margin-left:.5rem;opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-roles .edit-role{background-color:#f5f5f5;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .edit-role .icon-floppy{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .edit-role .icon-floppy:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .any-computable-role{background:red;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category .check{margin-left:.5rem}.admin-roles .general-category .check input{height:40px;width:85px}.admin-submenu-roles .single-role{max-width:175px;display:inline-block}.admin-submenu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.admin-contrib .help .alt-image,.admin-contrib .help code,.admin-contrib .select-input-text .help-copy,.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-body span,.admin-webhooks .history-single-response-header a{font-size:.9rem}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#8fa291;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a.active{background:#a3b2a4;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a span{display:block;max-width:85%}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#050505}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child,.admin-webhooks .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body .response-container,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-webhooks .table-header{border-bottom:1px solid #b8b8b8}.admin-webhooks .table-body .webhook-service{color:#555}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #f5f5f5}.admin-webhooks .webhooks-options{margin-bottom:1rem;text-align:right}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.admin-webhooks .webhook-url{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.admin-webhooks .webhook-url span{max-width:65%;color:#b8b8b8;display:inline-block;vertical-align:middle}.admin-contrib .help code,.admin-third-parties .help code{direction:ltr;line-height:1.4rem;unicode-bidi:embed;white-space:pre}.admin-webhooks .webhook-url a{color:#72a114;margin-left:.5rem}.admin-webhooks .webhook-url a:hover{color:#9dce0a}.admin-webhooks .webhook-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;min-width:100px;text-align:center}.admin-webhooks .webhook-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.admin-webhooks .webhook-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .webhooks-history.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #f5f5f5;margin-left:22%}.admin-webhooks .history-single{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(157,206,10,.1);-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single.history-single-open:hover{background:0 0}.admin-webhooks .history-single.history-single-open .icon-arrow-bottom{-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:-webkit-transform .3s linear;transition:-webkit-transform .3s linear;transition:transform .3s linear;transition:transform .3s linear,-webkit-transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s linear;transition:-webkit-transform .3s linear;transition:transform .3s linear;transition:transform .3s linear,-webkit-transform .3s linear}.admin-webhooks .history-response-icon{background:#555;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#9dce0a}.admin-webhooks .history-response-icon.history-error{background:red}.admin-webhooks .history-single-response{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header a,.admin-webhooks .history-single-response-header span:first-child{color:#b8b8b8}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .history-single-request-header .icon,.admin-webhooks .history-single-response-header .icon{margin-right:.3rem;vertical-align:middle}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-response-body .response-container{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin-bottom:.5rem}.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-response-body span{color:#b8b8b8;-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{border:0;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.admin-contrib h2,.admin-contrib label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-contrib .help h3,.admin-contrib .help ol span{font-family:opensans-semibold}.admin-contrib form{margin:1rem 0;max-width:700px;width:100%}.admin-contrib h2{font-size:1.2rem;margin-bottom:0}.admin-contrib fieldset{border-bottom:1px solid #f5f5f5;margin-bottom:1rem;padding-bottom:1rem}.admin-contrib .contrib-input{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.admin-contrib .contrib-test{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:7.5rem;-ms-flex-preferred-size:7.5rem;flex-basis:7.5rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-left:.5rem;text-align:center}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .contrib-form-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-contrib .select-input-text .help-copy{opacity:0}.admin-contrib .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-contrib .check-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0}.admin-contrib .help{margin-top:2rem}.admin-contrib .help h3{margin-bottom:1rem}.admin-contrib .help ol{padding:0 0 0 2rem}.admin-contrib .help .img{margin-bottom:1rem}.admin-contrib .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-contrib .help .code-info{padding-left:1rem}.admin-contrib .help .code-info li{margin-bottom:.5rem}.admin-contrib .help .code-info span{font-family:opensans-semibold}.default-values fieldset{margin-bottom:1rem}.default-values fieldset:last-child{margin-top:1.5rem}.default-values label,.default-values select{display:inline-block;width:49.7%}.default-values a{color:#fff;display:block;text-align:center}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field .icon{margin-right:.3rem}.project-csv .field-with-options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row .icon,.project-values-settings a{font-size:1.2rem}.admin-third-parties .help .alt-image,.admin-third-parties .help code,.admin-third-parties .select-input-text .help-copy,.backlog-table-body .doom-line span,.backlog-table-body .pop-points,.backlog-table-body .pop-points a,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open a,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-body .pop-role,.backlog-table-body .pop-role a,.backlog-table-body .pop-status,.backlog-table-body .pop-status a,.backlog-table-body .row,.backlog-table-body .tags-block .tag,.backlog-table-header .pop-points,.backlog-table-header .pop-points a,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open a,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom a,.backlog-table-header .pop-role,.backlog-table-header .pop-role a,.backlog-table-header .pop-status,.backlog-table-header .pop-status a,.backlog-table-header .row,.login-form-container .forgot-pass,.register-form-container .register-text{font-size:.9rem}.project-values-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{color:#b8b8b8;opacity:0}.project-values-row .icon:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.project-values-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #f5f5f5}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-header .points,.login-form-container .remember-me+label{cursor:pointer}.project-values-body .project-values-row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.project-values-name{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.project-values-value{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{color:#555;margin-right:.5rem}.project-values-settings a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.project-values-settings a:hover .icon-delete{color:red}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.admin-third-parties .help h3,.admin-third-parties .help ol span{font-family:opensans-semibold}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.admin-third-parties fieldset{margin-bottom:1rem}.admin-third-parties label{display:block;margin-bottom:.2rem}.admin-third-parties textarea{height:10rem}.admin-third-parties .submit-button{color:#fff;display:block;text-align:center}.cancel-account p,.change-email-form p,.change-password-text{color:#444;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-third-parties .help{margin-top:2rem}.cancel-account form,.change-email-form form{margin-top:1rem}.admin-third-parties .help h3{margin-bottom:1rem}.admin-third-parties .help ol{padding:0 0 0 2rem}.admin-third-parties .help .img{margin-bottom:1rem}.admin-third-parties .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-third-parties .help .code-info li,.cancel-account p{margin-bottom:.5rem}.admin-third-parties .help .code-info{padding-left:1rem}.admin-third-parties .help .code-info span{font-family:opensans-semibold}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-email-form p{margin-bottom:.5rem}.change-password-form-container .token-change-password{position:relative}.change-password-form-container input:focus+.get-token{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.change-password-form-container .get-token{font-size:.9rem;color:#b8b8b8;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.change-password-form-container .get-token:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.login-form-container .forgot-pass{color:#555;opacity:1;position:absolute;right:1rem;top:.6rem;-webkit-transition:all .3s linear;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.login-form-container .remember-me{vertical-align:top}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin-bottom:1rem;text-align:center}.backlog-table-header .backlog-table-title{font-size:1rem}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a,.empty-backlog .title{font-size:1.2rem}.backlog-table-body .doom-line span{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.backlog-table-body .pop-points,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-body .user-story-name a,.backlog-table-header .pop-points,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-role,.backlog-table-header .pop-status,.empty-backlog{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.backlog-table-body,.backlog-table-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.backlog-table-body.show-tags .tags-block,.backlog-table-header.show-tags .tags-block{display:block}.backlog-table-body .row,.backlog-table-header .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-subtitle:hover,.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-subtitle:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-subtitle .input,.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-subtitle .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-webkit-flex-basis:25px;-ms-flex-preferred-size:25px;flex-basis:25px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .votes,.backlog-table-body .backlog-table-title .votes,.backlog-table-body .row .votes,.backlog-table-header .backlog-table-subtitle .votes,.backlog-table-header .backlog-table-title .votes,.backlog-table-header .row .votes{color:#555;-webkit-flex-basis:65px;-ms-flex-preferred-size:65px;flex-basis:65px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .backlog-table-subtitle .votes.inactive,.backlog-table-body .backlog-table-title .votes.inactive,.backlog-table-body .row .votes.inactive,.backlog-table-header .backlog-table-subtitle .votes.inactive,.backlog-table-header .backlog-table-title .votes.inactive,.backlog-table-header .row .votes.inactive{color:#b8b8b8}.backlog-table-body .backlog-table-subtitle .votes.is-voted,.backlog-table-body .backlog-table-title .votes.is-voted,.backlog-table-body .row .votes.is-voted,.backlog-table-header .backlog-table-subtitle .votes.is-voted,.backlog-table-header .backlog-table-title .votes.is-voted,.backlog-table-header .row .votes.is-voted{color:#9dce0a}.backlog-table-body .backlog-table-subtitle .user-stories,.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-subtitle .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{overflow:hidden;width:100%}.backlog-table-body .backlog-table-subtitle .status,.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-subtitle .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .points,.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-subtitle .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-webkit-flex-basis:125px;-ms-flex-preferred-size:125px;flex-basis:125px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .points,.backlog-table-body .status,.backlog-table-header .points,.backlog-table-header .status{position:relative;text-align:right}.backlog-table-body .points .popover a,.backlog-table-body .status .popover a,.backlog-table-header .points .popover a,.backlog-table-header .status .popover a{text-align:left;width:100%}.backlog-table-body .points .popover .point,.backlog-table-body .status .popover .point,.backlog-table-header .points .popover .point,.backlog-table-header .status .popover .point,.empty-backlog,.sprints .loading,.sprints .sprint-table .sprint-empty{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{color:#b8b8b8;margin-left:.2rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-status a:last-child,.backlog-table-header .pop-status a:last-child{border:0}.backlog-table-body .pop-status a:hover,.backlog-table-header .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-status a:hover.point,.backlog-table-header .pop-status a:hover.point{color:#fff}.backlog-table-body .pop-status:after,.backlog-table-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-status.fix,.backlog-table-header .pop-status.fix{bottom:0;top:auto}.backlog-table-body .pop-role,.backlog-table-header .pop-role{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-role a:last-child,.backlog-table-header .pop-role a:last-child{border:0}.backlog-table-body .pop-role a:hover,.backlog-table-header .pop-role a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-role a:hover.point,.backlog-table-header .pop-role a:hover.point{color:#fff}.backlog-table-body .pop-role:after,.backlog-table-header .pop-role:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#9dce0a;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{background:#050505;bottom:10px;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px 3rem 10px 10px;position:absolute;width:150px;z-index:99}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points a:last-child,.backlog-table-header .pop-points a:last-child{border:0}.backlog-table-body .pop-points a:hover,.backlog-table-header .pop-points a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points a:hover.point,.backlog-table-header .pop-points a:hover.point{color:#fff}.backlog-table-body .pop-points:after,.backlog-table-header .pop-points:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{border-bottom:1px solid #444;color:#fff;padding:10px 2px}.backlog-table-body .pop-points-open a:last-child,.backlog-table-header .pop-points-open a:last-child{border:0}.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open a:hover.point,.backlog-table-header .pop-points-open a:hover.point{color:#fff}.backlog-table-body .pop-points-open:after,.backlog-table-header .pop-points-open:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{background:#050505;bottom:0;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:auto;width:200px;z-index:99}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open.pop-bottom a:last-child,.backlog-table-header .pop-points-open.pop-bottom a:last-child{border:0}.backlog-table-body .pop-points-open.pop-bottom a:hover,.backlog-table-header .pop-points-open.pop-bottom a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open.pop-bottom a:hover.point,.backlog-table-header .pop-points-open.pop-bottom a:hover.point{color:#fff}.backlog-table-body .pop-points-open.pop-bottom:after,.backlog-table-header .pop-points-open.pop-bottom:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open li,.backlog-table-header .pop-points-open li{display:inline-block;width:23%}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{display:block;text-align:center}.backlog-table-body .user-story-name,.sprints .sprint-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-table-body .pop-points-open a.active,.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a.active,.backlog-table-header .pop-points-open a:hover{background:#9dce0a;color:#fff}.backlog-table-header .backlog-table-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:2px solid #b8b8b8;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:30px}.backlog-table-header .header-points span{color:#b8b8b8}.backlog-table-body .row{border-bottom:1px solid #ebebeb;cursor:move;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag-v,.backlog-table-body .row:hover .us-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .is-checked,.backlog-table-body .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body input:checked{color:#9dce0a;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.backlog-table-body .user-story-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{display:inline-block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.backlog-table-body .user-story-name span{line-height:1.5}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff8282;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:red;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .blocked a{color:#fff!important}.backlog-table-body .blocked .icon,.backlog-table-body .blocked .icon:hover,.backlog-table-body .blocked a:hover{color:#fff}.backlog-table-body .doom-line{background:red;margin:.2rem 0;padding:.6rem 0;position:relative;width:100%}.backlog-table-body .doom-line span{color:#fff;position:absolute;right:.5rem;top:-3px}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;width:30px}.backlog-table-body .icon-drag-v:hover,.backlog-table-body .us-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .us-settings{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 0 0 2rem;opacity:0}.backlog-table-body .icon-drag-v{cursor:move;opacity:0;padding:.1rem .5rem 0 0}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.empty-backlog{padding:2rem}.empty-backlog img{margin-bottom:1rem}.empty-backlog .title{margin-bottom:.5rem}.empty-backlog a{color:#72a114}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint .description{font-size:.75rem}.sprints .filter-closed-sprints,.sprints .sprint-table .column-us,.sprints .us-item-row .user-story-name{font-size:.9rem}.sprints .sprint .number,.sprints .sprint .sprint-date,.sprints .sprint-name a,.sprints-empty .title{font-size:1.2rem}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint-header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#72a114;padding:.25rem .25rem 0;-webkit-transition:background .2s;transition:background .2s}.sprints .add-sprint:hover{background:#9dce0a}.sprints .add-sprint svg{height:1.4rem;max-height:1.4rem;max-width:1.5rem;width:1.5rem}.sprints .add-sprint path{fill:#f5f5f5}.sprints .filter-closed-sprints{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading-spinner{border:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;-webkit-transform-origin:center center;transform-origin:center center}.sprints .sprint-name a{max-width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;margin-right:3px}.sprints .sprint{margin-bottom:2rem;overflow:hidden}.sprints .sprint header{position:relative}.sprints .sprint:hover .icon-edit{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.sprints .sprint .icon{display:inline-block}.sprints .sprint .icon-arrow-up{-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:baseline}.sprints .sprint .icon-arrow-up.active{-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.sprints .sprint .icon-arrow-up:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.sprints .sprint .icon-edit{color:#b8b8b8;opacity:0;position:absolute;right:0;top:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;vertical-align:baseline}.sprints .sprint .icon-edit:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.sprints .sprint .description{line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{color:#b8b8b8;-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1}.sprints .sprint .sprint-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.sprints .sprint ul{margin:0}.sprints .sprint li{display:inline-block}.sprints .sprint li:first-child{margin-right:3px}.sprints .sprint-progress-bar{background:#b8b8b8;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#72a114;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table .sprint-empty{background:#e6e6e6;border:2px dashed #d2d2d2;color:#555;padding:1rem}.sprints .sprint-table .row{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:#d7d7d7;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .row.readonly,.taskboard-table .taskboard-task.readonly{cursor:auto}.sprints .sprint-table .row:last-child{border-bottom:0}.sprints .sprint-table .row.sortable-placeholder{background:#d7d7d7;height:40px}.sprints .sprint-table .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .column-us{-webkit-flex-flow:3;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{max-width:230px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.sprints .sprint-table .us-name.closed{color:#c5c5c5}.sprints .sprint-table .us-name.blocked{color:red}.sprints .sprint-table .column-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#c5c5c5}.sprints .sprint-table .column-points.blocked{color:red}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.sprints .us-item-row .icon-drag-v,.sprints .us-item-row .popover,.sprints .us-item-row .status,.sprints .us-item-row .tags-block,.sprints .us-item-row .us-settings,.sprints .us-item-row input,.taskboard-table-body .column-fold .taskboard-task .icon,.taskboard-table-body .column-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .column-fold .taskboard-task .taskboard-text,.taskboard-table-body .row-fold .taskboard-task .icon,.taskboard-table-body .row-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .row-fold .taskboard-task .taskboard-text{display:none}.sprints .us-item-row .user-story-name{line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#b8b8b8}.sprint-closed .sprint-progress-bar .current-progress{background:#9f9f9f}.sprint-closed .button-gray{background:#b8b8b8}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{margin-bottom:.5rem}.sprints-empty a{color:#72a114}.taskboard-userstory-box .points-value{font-size:.9rem}.taskboard-table-header .task-colum-name,.taskboard-table-header .task-colum-name .icon{font-size:1rem}.taskboard-table-body .column-fold .taskboard-task,.taskboard-table-body .row-fold .taskboard-task{background:0 0;border:0;margin:0;min-height:0}.category-config,.ticket-assigned-to{border-bottom:1px solid #b8b8b8}.category-config:first-child,.ticket-assigned-to{border-top:1px solid #b8b8b8}.taskboard-table-body .column-fold .taskboard-task .taskboard-task-inner,.taskboard-table-body .row-fold .taskboard-task .taskboard-task-inner{padding:.2rem}.taskboard-table-body .column-fold .taskboard-task .avatar,.taskboard-table-body .row-fold .taskboard-task .avatar{height:35px;width:35px}.taskboard-table-body .column-fold .taskboard-task.ui-sortable-helper,.taskboard-table-body .row-fold .taskboard-task.ui-sortable-helper{box-shadow:none}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .row-fold .task-column,.taskboard-table-body .task-column.column-fold,.taskboard-table-body .task-column.row-fold{-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .column-fold .avatar-task-link,.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table,.taskboard-table-header .taskboard-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;overflow:hidden}.taskboard-table{display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;width:100%}.taskboard-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:flex;position:absolute}.taskboard-table-header .task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-header .task-colum-name .icon:hover{color:#72a114}.taskboard-table-header .task-colum-name .icon.hfold,.taskboard-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.taskboard-table-header .task-colum-name.column-fold{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.3rem 0}.taskboard-table-header .task-colum-name.column-fold span{display:none}.taskboard-table-header .task-colum-name.column-fold .hfold,.taskboard-table-header .task-colum-name.column-fold .hunfold{margin:0}.taskboard-table-body{height:100%;overflow:auto;width:100%}.taskboard-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;width:300px}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .column-fold .taskboard-task{max-width:40px;width:40px}.taskboard-table-body .task-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;min-height:10rem;width:100%}.taskboard-table-body .avatar-task-link,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .icon-plus,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .task-row:hover .new-task{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(255,0,0,.6)}.taskboard-table-body .task-row.blocked .points-value,.taskboard-table-body .task-row.blocked .points-value:hover,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a:hover{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(255,0,0,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-table-body .taskboard-userstory-box .icon{color:#b8b8b8;position:absolute;right:.5rem;top:.7rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-body .taskboard-userstory-box .icon:hover{color:#72a114}.taskboard-table-body .taskboard-userstory-box .icon.icon-plus{right:2rem}.taskboard-table-body .taskboard-userstory-box .icon.icon-vfold,.taskboard-table-body .taskboard-userstory-box .icon.icon-vunfold{left:0;right:inherit}.taskboard-table-body .avatar-assigned-to{display:block}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .tag-list{display:none;margin-bottom:1rem}.taskboard-userstory-box .us-title{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{color:#b8b8b8}.taskboard-userstory-box .points-value span{margin-right:.1rem}.points-list a{color:#72a114;margin-left:.5rem}.points-list a:hover span{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.points-list span{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.ticket-assigned-to{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:1rem 0;position:relative}.ticket-assigned-to:hover .assigned-to .icon-delete{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;-webkit-transform-origin:32 32;transform-origin:32 32;margin:1rem auto;max-height:2rem;max-width:2rem}.filters-inner .loading .loading-spinner,.lightbox-generic-loading .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.ticket-assigned-to .user-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;position:relative}.ticket-assigned-to .user-avatar img{width:100%}.ticket-assigned-to .user-avatar.is-iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.ticket-assigned-to .user-avatar .iocaine-symbol{left:-.5rem;position:absolute;top:-.75rem;z-index:9}.ticket-assigned-to .user-avatar .iocaine-symbol svg{background:#444;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.ticket-assigned-to .assigned-to{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-to .assigned-to .assigned-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block;margin:.2rem 0 .25rem}.ticket-assigned-to .assigned-to .assigned-to-options{display:inline-block}.category-config .category-item,.category-config .resume{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.ticket-assigned-to .assigned-to .assign-to-me,.ticket-assigned-to .assigned-to .user-assigned{color:#72a114;cursor:default}.ticket-assigned-to .assigned-to .assign-to-me:hover,.ticket-assigned-to .assigned-to .user-assigned:hover{cursor:pointer}.ticket-assigned-to .assigned-to .assign-to-me .icon,.ticket-assigned-to .assigned-to .user-assigned .icon{vertical-align:middle}.ticket-assigned-to .assigned-to .assign-to-me>span,.ticket-assigned-to .assigned-to .user-assigned>span{max-width:80%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ticket-assigned-to .assigned-to .icon-delete{color:#b8b8b8;opacity:0;position:absolute;right:0;top:2rem}.ticket-assigned-to .assigned-to .icon-delete:hover{color:red}.category-config .resume{-webkit-box-align:space-between;-webkit-align-items:space-between;-ms-flex-align:space-between;align-items:space-between;cursor:pointer;display:flex;padding:1rem;position:relative}.category-config .resume-title{width:280px}.category-config .count{color:#b8b8b8;float:left;padding-right:5px}.category-config .summary-role{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#b8b8b8;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#72a114}.category-config .summary-role .role-summary-single.inactive{background:#555}.category-config .icon{font-size:2rem;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;text-align:right}.category-config .category-items{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden;background-color:#f5f5f5;width:100%}.category-config .category-items.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.colors-table .row,.duty-custom-fields .custom-fields-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #f5f5f5}.colors-table .icon,.colors-table .icon-check-square{font-size:1.2rem}.colors-table .table-header:hover{background:0 0}.colors-table .table-header .row{padding-left:50px}.colors-table form:last-child .row{border:0}.colors-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.colors-table .row.edition .current-color,.duty-custom-fields form label{cursor:pointer}.colors-table .row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.colors-table .row:last-child{border:0}.colors-table .row.edition,.colors-table .row.new-value{padding-left:50px}.colors-table .row.hidden{display:none}.colors-table .row .color-column{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100px;position:relative}.colors-table .row .is-archived-column,.colors-table .row .is-closed-column,.colors-table .row .options-column,.colors-table .row .status-wip-limit{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.colors-table .row .status-name{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px;position:relative}.colors-table .row .status-name span{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.duty-custom-fields .custom-field-value.js-value-view-mode,.lightbox-generic-ask .subtitle{white-space:pre-line}.colors-table .row .status-slug{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px}.colors-table .row .options-column{max-width:100px;opacity:0;text-align:right}.colors-table .row .is-archived-column{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row .is-closed-column{max-width:130px;text-align:center}.colors-table .row .status-wip-limit{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#b8b8b8;border-radius:2px;height:40px;width:40px}.activity-single .activity-user img,.duty-custom-fields form input{width:100%}.colors-table .icon{color:#b8b8b8;margin-right:1rem;opacity:0}.colors-table .icon.icon-check-square,.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.colors-table .icon:hover{color:#72a114;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.colors-table .icon-delete:hover{color:red}.colors-table .icon-check-square{color:#72a114}.duty-custom-fields .custom-field-data .custom-field-description{font-size:.9rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom{font-size:1.2rem;cursor:pointer;-webkit-transform:rotate(-90deg);transform:rotate(-90deg);-webkit-transition:-webkit-transform .2s linear;transition:-webkit-transform .2s linear;transition:transform .2s linear;transition:transform .2s linear,-webkit-transform .2s linear}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields{margin-bottom:2rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom.open{-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .2s linear;transition:-webkit-transform .2s linear;transition:transform .2s linear;transition:transform .2s linear,-webkit-transform .2s linear}.duty-custom-fields .custom-fields-body{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.duty-custom-fields .custom-fields-body.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.duty-custom-fields .custom-field-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;padding:1rem}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-single .custom-field-options{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-custom-fields .custom-field-single .custom-field-options a{color:#b8b8b8}.duty-custom-fields .custom-field-single .custom-field-options a:hover{color:#72a114}.duty-custom-fields .custom-field-data{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px}.duty-custom-fields .custom-field-data .custom-field-name{display:block}.duty-custom-fields .custom-field-data .custom-field-description{display:block;line-height:.9rem}.duty-custom-fields .custom-field-options{margin:0}.duty-custom-fields .custom-field-value{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff8282}.external-reference{font-size:.9rem;color:#b8b8b8;margin-top:.5rem}.external-reference a{border-left:1px solid #b8b8b8;padding:0 .2rem;-webkit-transition:color .3s linear;transition:color .3s linear}.external-reference a:hover{color:#72a114}.external-reference a:first-child{border:0}.activity-single .comment-restore,.activity-single .date,.activity-single .deleted-comment,.activity-single.deleted-comment,.change-entry .activity-fromto,.more-activity,.more-comments,.show-more-comments{font-size:.9rem}.activity-single .deleted-comment .comment-body p,.activity-single.deleted-comment .comment-body p{font-size:1rem}.history-tabs{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.change-entry .activity-changed{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.history{margin-bottom:1rem}.changes-title{display:block;padding:.5rem}.changes-title:hover .icon{color:#72a114;-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.changes-title .icon{color:#444;float:right;-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:all .2s linear;transition:all .2s linear}.main-nav a:hover .helper::after,.related-tasks-body .pop-status:after{-webkit-transform:rotate(45deg);content:''}.change-entry{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.change-entry:last-child{border-bottom:0}.change-entry .activity-changed,.change-entry .activity-fromto{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.history-tabs{border-bottom:3px solid #b8b8b8;margin-bottom:0;padding:.5rem 0}.history-tabs li{font-size:1.2rem;display:inline-block}.history-tabs li:first-child{border-right:1px solid #b8b8b8}.history-tabs a{padding:0 2rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs a.active{color:#444}.history-tabs a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs .icon{margin-right:.5rem}.add-comment .in-progress{cursor:progress}.add-comment:after{clear:both;content:'';display:table}.add-comment.active .button-green{display:block;margin-top:.5rem}.add-comment.active textarea{height:6rem;-webkit-transition:height .3s ease-in;transition:height .3s ease-in}.add-comment.active .help-markdown{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.add-comment.active .preview-icon{opacity:1;position:absolute;right:1rem}.add-comment .help-markdown,.add-comment .preview-icon,.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave.ng-leave-active:last-child{opacity:0}.add-comment textarea{background:#fff;height:5rem;min-height:41px}.add-comment .save-comment{color:#fff;float:right}.add-comment .button-green{display:none}.more-comments,.show-more-comments{color:#b8b8b8;display:block;border-bottom:1px solid #b8b8b8}.add-comment .edit,.add-comment .preview-icon{position:absolute;right:1rem}.show-more-comments{border-top:1px solid #b8b8b8;padding:1rem 0 1rem 1rem}.show-more-comments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.more-comments{padding:1rem}.more-comments .prev-comments-num{color:#72a114;margin-left:.5rem}.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{-webkit-transition:all .3s ease-in;transition:all .3s ease-in}.comment-list.activeanimation .comment-single.ng-enter.ng-enter-active:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{opacity:1}.activity-single{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:2rem 0;position:relative}.activity-single:hover .comment-delete,.activity-single:hover .comment-restore{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.activity-single:first-child{margin-top:0}.activity-single:last-child{border-bottom:0}.activity-single .deleted-comment,.activity-single.deleted-comment{color:#b8b8b8;padding:.5rem}.activity-single .deleted-comment a,.activity-single.deleted-comment a{color:#b8b8b8;margin-left:.3rem}.activity-single .deleted-comment a:hover,.activity-single.deleted-comment a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .deleted-comment img,.activity-single.deleted-comment img{-webkit-filter:grayscale(100%);filter:grayscale(100%);opacity:.5}.activity-single .deleted-comment .comment-body,.activity-single.deleted-comment .comment-body{display:none;margin:.2rem 0 .5rem}.activity-single .activity-username,.activity-single .username{margin-bottom:.5rem;color:#72a114}.activity-single .comment-restore{color:#b8b8b8;position:absolute;right:0;top:.4rem}.activity-single .comment-restore .icon{vertical-align:baseline}.activity-single .comment-restore:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .activity-user{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.activity-single .activity-content{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:calc(100% - 80px)}.activity-single .changes{background:#f5f5f5}.activity-single .changes .change-entry{display:none}.activity-single .changes .change-entry.active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.activity-single .date{color:#b8b8b8;margin-left:1rem}.activity-single .wysiwyg{margin-bottom:0}.activity-single .comment-delete{color:red;opacity:0;position:absolute;right:0;top:2rem;-webkit-transition:all .2s linear;transition:all .2s linear}.activity-single .comment-delete:hover{color:#ff8282;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single.activity .change-entry{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.more-activity{border-bottom:1px solid #b8b8b8;color:#b8b8b8;display:block;padding:1rem}.more-activity .prev-activity-num{color:#72a114;margin-left:.5rem}.lightbox{background:rgba(255,255,255,.98);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox-generic-form label{font-size:.75rem}.lightbox-add-member .help-text,.lightbox-delete-account .newsletter input+label,.lightbox-sprint-add-edit .delete-sprint,.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem}.lightbox-select-user .more-watchers{font-size:1rem}.lightbox-add-member .add-member-wrapper .icon-delete,.lightbox-add-member .icon,.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-size:1.2rem}.lightbox h2{font-size:1.6rem}.lightbox .close,.lightbox-add-member .icon-delete{font-size:2rem}.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress,.lightbox-select-user .more-watchers{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.lightbox h2,.lightbox-delete-account .newsletter input+label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox .close{color:#555;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.lightbox-add-member .add-member-wrapper fieldset,.lightbox-generic-form fieldset{position:relative}.lightbox-add-member .checksley-error-list,.lightbox-generic-form .attachment-delete{right:.5rem}.lightbox .close:hover{color:#72a114}.open.lightbox{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.lightbox{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox-generic-loading .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32}.lightbox-generic-form form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form textarea{min-height:4.5rem;resize:vertical}.lightbox-generic-form label{background:#f5f5f5;border:1px solid #b8b8b8;color:#444;cursor:pointer;display:block;padding:7px 30px;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#444;vertical-align:middle}.lightbox-generic-form .settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-add-member .button,.lightbox-add-member .extra-text{margin-top:1rem}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#9dce0a;border:1px solid #72a114}.lightbox-generic-form .settings .blocked:hover{background:#ff8282;border:1px solid red}.lightbox-generic-form .settings .client-requirement input:checked+label,.lightbox-generic-form .settings .iocaine-flag input:checked+label,.lightbox-generic-form .settings .team-requirement input:checked+label{background:#72a114;border:1px solid #72a114;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:red;border:1px solid red;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-form .attachments{margin-bottom:0}.lightbox-generic-form .attachment-body{max-height:7.5rem;overflow-y:auto}.lightbox-generic-form .attachment-delete svg{fill:#b8b8b8;height:1.25rem;width:1.25rem}.lightbox-generic-form .attachment-delete:hover svg{fill:red}.lightbox-generic-bulk form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-search form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-search fieldset{margin-bottom:1rem}.lightbox-add-member .add-member-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.lightbox-add-member .add-member-wrapper:last-child,.lightbox-add-member fieldset{margin-bottom:0}.lightbox-add-member .add-member-wrapper fieldset:first-child{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.lightbox-add-member .add-member-wrapper fieldset:last-child{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.lightbox-add-member select{width:80%}.lightbox-add-member .icon{margin-left:.5rem}.lightbox-add-member .icon-delete:hover{color:red}.lightbox-add-member .help-text{padding:.5rem 1rem}.lightbox-add-member .checksley-error-list li{display:none}.lightbox-add-member .checksley-error-list li:first-child{display:block}.lightbox-sprint-add-edit form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{color:#555;opacity:1;position:absolute;right:1rem;top:.7rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.main-nav .active svg path,.main-nav svg path{opacity:1}.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-sprint-add-edit .dates div{float:left;margin-right:1%;position:relative;width:49%}.lightbox-sprint-add-edit .dates div:last-child{margin:0;width:50%}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint{color:#444;display:block;margin-top:1rem;text-align:right}.lightbox-sprint-add-edit .delete-sprint a{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-sprint-add-edit .delete-sprint a:hover{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-generic-ask form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:420px}.lightbox-generic-ask .message,.lightbox-generic-ask .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-generic-ask .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-generic-ask .options a{padding:8px 0;text-align:center;width:100%}.lightbox-ask-choice{text-align:center}.lightbox-ask-choice form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.lightbox-ask-choice .question,.lightbox-ask-choice .subtitle{display:block;line-height:1.5rem;text-align:center}.lightbox-ask-choice .replacement,.lightbox-ask-choice .replacement span{display:block}.lightbox-ask-choice .choices{margin-bottom:2rem}.lightbox-ask-choice .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-account form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-account .question,.lightbox-delete-account .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-account .newsletter{margin:1rem 0;text-align:center}.lightbox-delete-account .newsletter input,.lightbox-delete-account .options a:first-child,.lightbox-delete-project .options a:first-child{margin-right:.5rem}.lightbox-delete-account .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-project .question,.lightbox-delete-project .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-project .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-delete-project .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-generic-error section,.lightbox-generic-loading section,.lightbox-generic-success section{-webkit-flex-basis:500px;-ms-flex-preferred-size:500px;flex-basis:500px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:500px}.lightbox-generic-error h2,.lightbox-generic-loading h2,.lightbox-generic-success h2{line-height:2rem}.lightbox-generic-error p,.lightbox-generic-loading p,.lightbox-generic-success p{text-align:center}.lightbox-generic-loading .spin{margin:1rem auto;width:5rem}.lightbox-generic-loading .spin img{max-height:100%;max-width:100%;width:100%}.lightbox-generic-loading .progress-bar-wrapper{background:#e8e8e8;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#9dce0a;height:24px;position:absolute;-webkit-transition:width .1s linear;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#e8e8e8;bottom:35px;color:#555;padding:.3rem;position:absolute;-webkit-transition:left .1s linear;transition:left .1s linear}.lightbox-create-issue form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row fieldset{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem;width:30%}.lightbox-create-issue .fieldset-row fieldset:last-child{margin:0}.lightbox-block textarea,.lightbox-create-issue textarea{margin-bottom:1rem;max-height:12rem;min-height:8rem}.lightbox-block .form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-select-user .form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single.selected,.lightbox-select-user .user-list-single:hover{background:#f3fbe1;cursor:pointer}.lightbox-select-user .user-list-single:hover{-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.lightbox-select-user .more-watchers{padding:.5rem;text-align:center}.lb-create-edit-userstory .points-per-role{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0}.featured-project .project-card-inner,.highlighted .highlighted-projects-container,.highlighted .most-active,.highlighted .most-liked,.kanban-table,.wiki-summary .wiki-user-modification{-webkit-box-orient:vertical;-webkit-box-direction:normal}.lb-create-edit-userstory .ticket-role-points{margin:.1rem;min-width:20%}.lb-create-edit-userstory .ticket-role-points:first-child{margin-left:0}.lb-create-edit-userstory .ticket-role-points:nth-child(4n+4){margin-right:0}.lb-create-edit-userstory .ticket-role-points:last-child{margin:.1rem 0;min-width:100%}.main-nav a:hover .helper{font-size:.9rem}.main-nav .item{font-size:1.2rem}tg-project-menu{background-position:0 -300px;display:inline-block;min-height:95%;min-width:50px;padding:1rem 0;position:relative;z-index:9}.main-nav a,.main-nav span{display:block}tg-project-menu .menu.menu-fixed{position:fixed;top:1rem}.main-nav{list-style:none;padding:0;position:relative;text-align:center}.related-tasks-body .row,.related-tasks-body .status{text-align:left;position:relative}.main-nav a{color:#fff;padding:.75rem .8rem;position:relative}.main-nav a:hover{background:rgba(0,0,0,.2);color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.main-nav a:hover .helper{-webkit-animation:slideLeft .2s ease-in-out both;animation:slideLeft .2s ease-in-out both;background:-webkit-linear-gradient(left,#000 0,rgba(0,0,0,.8) 100%);background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;padding:.4rem 1rem;position:absolute;top:calc(50% - 1rem);-webkit-transition:all .2s;transition:all .2s;white-space:nowrap;z-index:99}.main-nav a:hover .helper::after{background:#050505;height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);transform:rotate(45deg);width:12px;z-index:98}.main-nav svg{height:1.5rem;width:1.5rem}.main-nav .helper{display:none}.main-nav .icon{font-size:1.5rem;line-height:2.2rem}.main-nav .active{color:#9dce0a}@-webkit-keyframes slideLeft{0%{opacity:0}100%{opacity:1}}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.related-tasks-body .pop-status,.related-tasks-body .pop-status a,.related-tasks-body .row{font-size:.9rem}.related-tasks-body .task-name input,.related-tasks-header .related-tasks-title{font-size:1rem}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine,.related-tasks-body .task-settings a{font-size:1.2rem}.related-tasks-body .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.related-tasks-header .related-tasks-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-tasks{margin-bottom:2rem;position:relative}.related-tasks-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-tasks-header .add-button{background:#444;border:0;display:inline-block;padding:.5rem;-webkit-transition:background .25s;transition:background .25s}.related-tasks-header .add-button.is-active,.related-tasks-header .add-button:hover{background:#9dce0a}.related-tasks-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-tasks-body{width:100%}.related-tasks-body .row{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.5rem 0 .5rem .5rem;width:100%}.related-tasks-body .row:hover{background:0 0}.related-tasks-body .row:hover .task-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .row:last-child{border:0}.related-tasks-body .row .tasks{overflow:hidden;width:100%}.related-tasks-body .row .status{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100px}.related-tasks-body .row .assigned-to{cursor:pointer;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.related-tasks-body .related-task-create-form{padding:0}.related-tasks-body .related-task-create-form.active{padding:.5rem 0 .5rem .5rem}.related-tasks-body .status:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.related-tasks-body .status .not-clickable:hover{color:#444}.related-tasks-body .status .popover a{text-align:left;width:100%}.related-tasks-body .status .popover .point{text-align:center}.related-tasks-body .status .icon{color:#b8b8b8;margin-left:.2rem;opacity:0}.related-tasks-body .pop-status{background:#050505;color:#fff;display:none;left:40%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.related-tasks-body .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.related-tasks-body .avatar,.related-tasks-body .task-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.related-tasks-body .blocked .icon,.related-tasks-body .blocked .icon:hover,.related-tasks-body .blocked a,.related-tasks-body .blocked a:hover,.related-tasks-body .blocked:hover .icon,.related-tasks-body .blocked:hover .icon:hover,.related-tasks-body .blocked:hover a,.related-tasks-body .blocked:hover a:hover,.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#050505;height:15px;position:absolute;transform:rotate(45deg);width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .task-name{display:flex;position:relative}.related-tasks-body .task-name a{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-name input{margin-right:1rem;padding:3px;width:85%}.related-tasks-body .task-name.loading{margin:0;padding:8px;text-align:center;width:100%}.related-tasks-body .task-name.loading span{-webkit-animation:loading .5s linear,spin 1s linear infinite;animation:loading .5s linear,spin 1s linear infinite}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:#ff8282;color:#fff}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .iocaine,.related-tasks-body .iocaine:hover{background:rgba(157,206,10,.3)}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine{display:inline-block;margin-right:.5rem;vertical-align:top}.related-tasks-body .task-settings{margin:0 0 0 2rem;opacity:0;position:absolute;right:0;top:0;width:10%}.related-tasks-body .task-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .task-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .assigned-to{position:relative;text-align:left}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .task-assignedto figcaption{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-assignedto .icon{opacity:0;position:absolute;right:.5rem;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex}.related-tasks-body .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-data-container,.ticket-header .detail-status,.ticket-header .pop-status,.ticket-header .pop-status a,.ticket-status .priority-data .pop-priority,.ticket-status .priority-data .pop-priority a,.ticket-status .severity-data .pop-severity,.ticket-status .severity-data .pop-severity a,.ticket-status .type-data .pop-type,.ticket-status .type-data .pop-type a,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-size:.9rem}.ticket-header .ticket-title{font-size:1.6rem;vertical-align:sub}.ticket-header .pop-status,.ticket-header .ticket-title,.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .type-data .pop-type,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-header{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1.5rem 0 2rem;position:relative}.ticket-header .detail-status{display:inline-block;margin-left:.25rem;position:relative}.ticket-header .detail-status .icon-arrow-bottom{margin-left:.25rem}.ticket-header .detail-status-inner{color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.15rem .25rem}.ticket-header .pop-status{background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;position:absolute;top:1.25rem;width:150px;z-index:99;padding:0;text-transform:none}.ticket-header .pop-status a{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #444;color:#fff;display:block;padding:.5rem 1rem}.ticket-header .pop-status a:last-child{border:0}.ticket-header .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-header .pop-status a:hover.point{color:#fff}.ticket-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-header .pop-status a:hover{background:rgba(157,206,10,.2)}.ticket-data-container{margin-bottom:1rem}.ticket-data-container .icon{margin-left:.25rem}.ticket-status:last-child{margin:0}.ticket-status .level{display:inline-block;margin-right:.5rem;vertical-align:top}.filters h1,.filters h1 a{vertical-align:baseline}.ticket-status .level-name{color:#c2c2c2;float:right;text-transform:lowercase}.ticket-status .clickable:hover{background:#dcdcdc;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .type-data{background:#e8e8e8;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .type-data .pop-type{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .type-data .pop-type a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .type-data .pop-type a:last-child{border:0}.ticket-status .type-data .pop-type a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-status .severity-data{background:#e8e8e8;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .severity-data .pop-severity{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .severity-data .pop-severity a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .severity-data .pop-severity a:last-child{border:0}.ticket-status .severity-data .pop-severity a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-status .priority-data{background:#e8e8e8;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .priority-data .pop-priority{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .priority-data .pop-priority a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .priority-data .pop-priority a:last-child{border:0}.ticket-status .priority-data .pop-priority a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-detail-settings img,.ticket-detail-settings svg{max-height:1.25rem;max-width:1.25rem;width:100%}.ticket-watch-buttons{margin-bottom:1rem}.ticket-watch .ticket-watch-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.ticket-watch .ticket-watch-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ticket-watch .track-icon{position:relative;top:2px}.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{background:#b8b8b8;color:#fff;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:.25rem;text-align:center;text-transform:uppercase;-webkit-transition:background .25s;transition:background .25s}.ticket-watch .add-watcher path,.ticket-watch .ticket-watch-button path{fill:#fff}.ticket-watch .add-watcher:hover,.ticket-watch .ticket-watch-button:hover{background:#9dce0a}.ticket-watch .add-watcher.is-hover,.ticket-watch .ticket-watch-button.is-hover{background:red;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.ticket-watch .add-watcher.is-hover svg,.ticket-watch .ticket-watch-button.is-hover svg{fill:#ff8282}.ticket-watch .add-watcher.active,.ticket-watch .ticket-watch-button.active{background:#9dce0a}.ticket-watch .add-watcher.active:hover,.ticket-watch .ticket-watch-button.active:hover{background:#ff8282}.ticket-watch .add-watcher.active svg,.ticket-watch .ticket-watch-button.active svg{fill:#fff}.ticket-watch .ticket-watch-button{margin-right:.25rem}.wizard-create-project .create-step1 fieldset:first-child,.wizard-create-project .wizard-action a:first-child{margin-right:.5rem}.ticket-detail-settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-top:2rem}.ticket-detail-settings .button-delete,.ticket-detail-settings .item-block,.ticket-detail-settings .item-unblock,.ticket-detail-settings .promote-button,.ticket-detail-settings label{background:#b8b8b8;display:inline-block;margin-right:.5rem;padding:1rem;-webkit-transition:background .2s linear;transition:background .2s linear;-webkit-transition-delay:.1s;transition-delay:.1s}.ticket-detail-settings .button-delete:hover,.ticket-detail-settings .item-block:hover,.ticket-detail-settings .item-unblock:hover,.ticket-detail-settings .promote-button:hover,.ticket-detail-settings label:hover{background:#555}.ticket-detail-settings .button-delete.editable,.ticket-detail-settings .item-block.editable,.ticket-detail-settings .item-unblock.editable,.ticket-detail-settings .promote-button.editable,.ticket-detail-settings label.editable{cursor:pointer}.ticket-detail-settings .button-delete+input,.ticket-detail-settings .item-block,.ticket-detail-settings .item-block+input,.ticket-detail-settings .item-unblock,.ticket-detail-settings .item-unblock+input,.ticket-detail-settings .promote-button+input,.ticket-detail-settings label+input{display:none}.ticket-detail-settings .item-block.is-active,.ticket-detail-settings .item-unblock.is-active{display:inline-block}.ticket-detail-settings .item-unblock{background:#ff8282}.ticket-detail-settings .item-unblock:hover{background:red}.ticket-detail-settings .button-delete{background:#ff8282}.ticket-detail-settings .button-delete:hover{background:red}.ticket-detail-settings svg{fill:#fff;height:100%}.single-project .track-container .icon path,.single-project .track-container .list-itemtype-track-likers.active path,.single-project .track-container .list-itemtype-track-watchers.active path{fill:currentcolor}.wizard-create-project{background:url(../images/invitation_bg.jpg) center center no-repeat;bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910;background-size:cover;color:#fff;text-align:center}.wizard-create-project p{font-size:.9rem}.wizard-create-project .close{font-size:2rem;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.open.wizard-create-project{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.wizard-create-project{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.wizard-create-project fieldset{margin-bottom:1rem}.wizard-create-project .button-gray,.wizard-create-project .button-green{display:block;padding:12px;text-align:center}.wizard-create-project form{width:500px}.wizard-create-project .title{text-align:center;width:100%}.wizard-create-project h1,.wizard-create-project p{color:#fff}.wizard-create-project h1{line-height:1.5rem}.wizard-create-project p{opacity:.8}.wizard-create-project input,.wizard-create-project select,.wizard-create-project textarea{background:rgba(255,255,255,.7)}.wizard-create-project input::-webkit-input-placeholder,.wizard-create-project select::-webkit-input-placeholder,.wizard-create-project textarea::-webkit-input-placeholder{color:#444}.wizard-create-project input::-moz-placeholder,.wizard-create-project select::-moz-placeholder,.wizard-create-project textarea::-moz-placeholder{color:#444}.wizard-create-project input:-moz-placeholder,.wizard-create-project select:-moz-placeholder,.wizard-create-project textarea:-moz-placeholder{color:#444}.wizard-create-project input:-ms-input-placeholder,.wizard-create-project select:-ms-input-placeholder,.wizard-create-project textarea:-ms-input-placeholder{color:#444}.wizard-create-project .close{color:#fff}.wizard-create-project .close:hover{color:#ff8282}.wizard-create-project .wizard-step{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out;-webkit-animation-direction:alternate-reverse;animation-direction:alternate-reverse;display:none}.wizard-create-project .wizard-step.active{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out}.wizard-create-project .wizard-step.active.create-step1,.wizard-create-project .wizard-step.active.create-step2,.wizard-create-project .wizard-step.active.create-step3{display:block}.wizard-create-project .wizard-action div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .wizard-action a{color:#fff;display:inline-block;-webkit-flex-basis:40%;-ms-flex-preferred-size:40%;flex-basis:40%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 .template-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .create-step1 fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 input{display:none}.wizard-create-project .create-step1 input:checked+label{background:rgba(157,206,10,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label{background:rgba(245,245,245,.7);cursor:pointer;display:block;margin-bottom:1rem;padding:1rem;text-align:center;-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label:hover{background:rgba(114,161,20,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label .icon{font-size:3rem;color:#fff}.wizard-create-project .create-step1 h2{color:#fff;margin:.5rem 0 0;text-transform:uppercase}.wizard-create-project .create-step1 p{text-align:center}.wizard-create-project .progress-bar{bottom:0;height:.5rem;left:0;position:absolute;width:100%}.wizard-create-project .step1 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:25%}.wizard-create-project .step1 .progress-state span:nth-child(1){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .step2 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:75%}.wizard-create-project .step2 .progress-state span:nth-child(1),.wizard-create-project .step2 .progress-state span:nth-child(2){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .progress-state{position:absolute;width:100%}.wizard-create-project .progress-state span{color:rgba(255,255,255,.5);display:inline-block;margin-left:-100px;position:absolute;text-align:center;top:-2rem;-webkit-transition:all 1s ease-in;transition:all 1s ease-in;width:200px}.wizard-create-project .progress-state span:nth-child(1){left:25%}.wizard-create-project .progress-state span:nth-child(2){left:75%}.wizard-create-project .progress-bar-wrapper{background:rgba(255,255,255,.3);height:.5rem}.wizard-create-project .bar{background:rgba(157,206,10,.9);height:.5rem;left:0;position:absolute;top:0;width:0}.create-project{background:url(https://farm9.staticflickr.com/8449/7893171238_a201af22bc_k_d.jpg) center center no-repeat;background-size:cover;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;bottom:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.create-project .tagline{font-size:2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#fff;line-height:2rem;text-transform:uppercase}.create-project fieldset{margin-bottom:1rem}.create-project .create-project-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.create-project h1{color:#fff;text-align:center}.create-project .logo,.create-project .tagline{margin-bottom:1rem;text-align:center}.create-project form{margin-bottom:2rem}.create-project input{background:#fff}.create-project input::-webkit-input-placeholder{color:#757575}.create-project input::-moz-placeholder{color:#757575}.create-project input:-moz-placeholder{color:#757575}.create-project input:-ms-input-placeholder{color:#757575}.create-project .button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.create-project .button:hover{background:#212121}.create-project a:hover{color:#fff}.filters h2 .icon-arrow-right{font-size:1rem}.filters-inner .loading .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32;max-height:1rem;max-width:1rem}.profile .timeline-wrapper .spin img,.user-profile .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.filters h1 .icon{margin:0}.filters h2 .icon-arrow-right,.issues-table .subject span,.single-project h1{vertical-align:middle}.filters h2{font-size:1.2rem;margin-top:1rem}.filters input{background:#444;color:#fff}.filters input::-webkit-input-placeholder{color:#b8b8b8}.filters input::-moz-placeholder{color:#b8b8b8}.filters input:-moz-placeholder{color:#b8b8b8}.filters input:-ms-input-placeholder{color:#b8b8b8}.filters .icon-search{color:#b8b8b8;position:absolute;right:.7rem;top:.7rem}.filters-inner{opacity:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}.filters-inner .loading{margin:0;padding:8px;text-align:center;width:100%}.filters-applied{margin-top:.5rem}.filters-step-cat .save-filters{color:#fff;display:block;text-align:center}.filters-step-cat .my-filter-name{background:#444;color:#f5f5f5;width:100%}.filters-step-cat .my-filter-name::-webkit-input-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name::-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-ms-input-placeholder{color:#b8b8b8}.filters-cats{margin-top:2rem}.filters-cats li{border-bottom:1px solid #b8b8b8;text-transform:uppercase}.filters-cats .custom-filters .title{color:#72a114}.filters-cats a{color:#444;display:block;padding:.5rem 0 .5rem .5rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.filters-cats .icon{color:#444;float:right;opacity:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0}.introjs-overlay{background:-webkit-radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background-color:#f5f5f5}.introjs-helperLayer{border:1px solid rgba(157,206,10,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(68,68,68,.2)}.introjs-bullets ul li a.active{background:#9dce0a}.introjs-button{background-color:#72a114;background-image:none;border:0;border-radius:0;color:#fff;margin-top:10px;padding:.3rem .8rem;text-shadow:none}.introjs-button:focus,.introjs-button:hover{background:#9dce0a;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .description,.single-project .looking-for-people p{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.single-project .title{font-weight:800}.single-project .looking-for-people h3,.single-project .looking-for-people p,.single-project .track-container .list-itemtype-track{font-size:.9rem}.single-project .description,.single-project .title{font-size:1rem}.single-project .single-project-intro{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.single-project .project-logo{margin-right:1rem;width:6rem}.single-project .project-logo img{width:100%}.single-project .single-project-title-wrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.single-project .intro-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem}.single-project .intro-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project h1{color:#000;display:inline-block;line-height:1.2;margin-bottom:0}.single-project .like-watch-container{margin-left:auto}.single-project .track-buttons-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{color:#757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.single-project .track-container .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.single-project .track-container .list-itemtype-track-likers,.single-project .track-container .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .track-container .list-itemtype-track-likers .icon,.single-project .track-container .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.single-project .project-data,.single-project .title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#000}.single-project .track-container .icon svg{height:1rem;width:1rem}.single-project .description{margin:0}.single-project .project-data{display:flex}.single-project .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#757575;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem}.single-project .single-project-tags{margin-bottom:1rem;margin-top:1rem}.single-project .timeline{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-shrink:3;-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;max-width:960px;width:0}.single-project .looking-for-people img{width:100%}.single-project .involved-data{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-organization,.single-project .involved-team{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-organization li,.single-project .involved-team li{-webkit-flex-basis:24%;-ms-flex-preferred-size:24%;flex-basis:24%;margin-right:.14rem}.single-project .involved-organization li:nth-child(4n),.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-organization a,.single-project .involved-team a{display:block}.single-project .involved-organization img,.single-project .involved-team img{border-radius:.2rem;width:100%}.issues-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table .pop-status,.issues-table .pop-status a,.issues-table .table-main{font-size:.9rem}.issues-table .title{font-size:1rem}.empty-issues .title{font-size:1.2rem;text-transform:uppercase}.empty-issues p,.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.issues-table .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8}.issues-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .avatar,.kanban-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.issues-table .row.is-blocked{background:#ffe8e8}.issues-table .row.is-blocked .blocked-text{color:red;margin-right:.5rem}.issues-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#555}.issues-table .table-main{border-bottom:1px solid #ebebeb}.issues-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-webkit-flex-basis:60%;-ms-flex-preferred-size:60%;flex-basis:60%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes{color:#555;-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes.inactive{color:#b8b8b8}.issues-table .votes.is-voted{color:#9dce0a}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field{-webkit-box-flex:0;-webkit-flex:0 0 160px;-ms-flex:0 0 160px;flex:0 0 160px;max-width:160px}.issues-table .issue-assignedto{cursor:pointer;position:relative}.issues-table .issue-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .issue-assignedto figcaption{max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.issues-table .issue-assignedto .icon{opacity:0;position:absolute;right:0;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .pop-status{background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99}.issues-table .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.search-filter,.search-result-table{border-top:1px solid #f5f5f5}.issues-table .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.issues-table .pop-status.fix{bottom:0;top:auto}@media (max-width:1280px){.issues-table .created-field,.issues-table .level-field{display:none}}.empty-issues{margin-top:4rem;text-align:center}.empty-issues img{margin-bottom:1rem}.empty-issues p,.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem}.kanban-table-body,.kanban-table-header .task-colum-name,.kanban-table-header .task-colum-name .icon{font-size:1rem}.kanban-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table .vfold.task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold .kanban-task,.kanban-table .vfold.task-colum-name .icon-bulk,.kanban-table .vfold.task-colum-name .icon-closed-eye,.kanban-table .vfold.task-colum-name .icon-open-eye,.kanban-table .vfold.task-colum-name .icon-plus,.kanban-table .vfold.task-colum-name .icon-vfold,.kanban-table .vfold.task-colum-name .icon-vunfold,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1;max-width:30px;min-height:2.5rem;min-width:30px;width:30px}.kanban-table .readonly{cursor:auto}.kanban-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.kanban-table-header .kanban-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.kanban-table-header .task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem .5rem .5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name span{max-width:65%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kanban-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.kanban-table-header .task-colum-name .icon.hfold,.kanban-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.kanban-table-header .icon-closed-eye,.kanban-table-header .icon-open-eye{display:inline-block}.kanban-table-header .icon-closed-eye svg,.kanban-table-header .icon-open-eye svg{fill:#b8b8b8;height:1.1rem;margin-top:.25rem;width:1.1rem}.kanban-table-header .icon-closed-eye:hover svg,.kanban-table-header .icon-open-eye:hover svg{fill:#72a114}.kanban-table-header .icon-open-eye .svg-eye-closed{display:none}.kanban-table-header .icon-closed-eye .svg-eye-closed,.kanban-table-header .icon-open-eye .svg-eye-open{display:block}.kanban-table-header .icon-closed-eye .svg-eye-open{display:none}.kanban-table-body,.kanban-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.kanban-table-body{display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;overflow-y:auto;widows:300px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#b8b8b8;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#050505}.kanban-table-body .task-column .kanban-wip-limit{background:red;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-inner{display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.search-filter{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:0;z-index:9}.search-filter a{background:#fff;color:#b8b8b8;display:inline-block;margin-right:1rem;padding:1rem 1.25rem}.search-filter .icon,.search-filter a:hover .icon{margin-right:.4rem}.search-filter .name,.search-filter a:hover .name{padding-left:5px}.search-filter a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.search-filter a.active{border-left:1px solid #f5f5f5;border-right:1px solid #f5f5f5;color:#444;position:relative;top:1px}.search-filter a.active .icon{color:#9dce0a}.search-in input{background:#444;color:#fff}.search-in input::-webkit-input-placeholder{color:#b8b8b8}.search-in input::-moz-placeholder{color:#b8b8b8}.search-in input:-moz-placeholder{color:#b8b8b8}.search-in input:-ms-input-placeholder{color:#b8b8b8}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{color:#b8b8b8}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #f5f5f5}.search-result-table .user-story-name .icon{font-size:1rem;color:#b8b8b8}.empty-search-results .title{font-size:1.2rem;text-transform:uppercase}.empty-search-results p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.search-result-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.search-result-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row .ref{-webkit-flex-basis:30px;-ms-flex-preferred-size:30px;flex-basis:30px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .status{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.search-result-table .user-story-name span{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-table .user-story-name .icon:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.search-result-table .points,.search-result-table .status{position:relative}.search-result-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.search-result-table .avatar img{width:35px}.search-result-table .avatar .avatar-caption{display:block;margin-left:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:80px}.empty-search-results{margin-top:4rem;text-align:center}.empty-search-results img{margin-bottom:1rem}.empty-search-results p{margin:0}.team-filters nav li{font-size:1.6rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.table-team .team-header,.team-filters nav li:last-child{border-bottom:0}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters nav a{display:block;padding:1rem 0 1rem 1rem}.team-filters nav a.active,.team-filters nav a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.team-filters nav .active,.team-filters nav a.active.icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.team-filters nav .icon{color:#050505;float:right;opacity:0}.table-team .leave-project,.table-team .popover,.table-team .popover a{font-size:.9rem}.table-team .attribute .points{font-size:1.6rem}.table-team .attribute,.table-team .attribute .points,.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.policy-table .policy-table-header,.table-team .avatar .name,.table-team .team-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.table-team .row{padding:.5rem}.table-team .username{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:6;-webkit-flex:6;-ms-flex:6;flex:6;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{color:#050505;font-size:1.8rem}.table-team .attribute .points{color:#444}.table-team .attribute .top{color:#9dce0a;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{color:#b8b8b8;display:block}.table-team .leave-project .icon{margin-right:.2rem}.table-team .leave-project:hover .icon{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .hero{width:100%}.table-team .hero .row{background:#f5f5f5;border-bottom:0;margin:1rem 0}.table-team .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.table-team .avatar img{-webkit-flex-basis:66px;-ms-flex-preferred-size:66px;flex-basis:66px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:66px}.table-team .avatar figcaption{margin-left:1rem;width:65%}.table-team .avatar figcaption span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.table-team .avatar .name,.table-team .avatar .position{display:block;width:100%}.table-team .popover{background:#050505;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99}.table-team .popover a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#050505;bottom:-5px;content:'';height:15px;left:50%;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:15px}.policy-table .policy-table-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{border-bottom:2px solid #b8b8b8}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none,.policy-table .policy-table-project{padding:1rem}.policy-table .policy-table-project{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#72a114;-webkit-transition:background .3s linear;transition:background .3s linear}.policy-table label{background:#b8b8b8;border-radius:5px;display:block;padding:.5rem}.policy-table label:hover{background:#9dce0a;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear}.user-change-password fieldset{margin-bottom:1rem;width:50%}.user-change-password fieldset:last-child{margin-top:2rem}.user-change-password label{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;display:block;margin-bottom:.5rem}.user-change-password .button-green{color:#fff;display:block;padding:12px;text-align:center}.user-profile .image-help,.user-profile .use-default-image{font-size:.75rem}.user-profile .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;border:0;-webkit-transform-origin:center center;transform-origin:center center}.user-profile{max-width:780px}.user-profile form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.user-profile fieldset{margin-bottom:1rem}.user-profile label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.user-profile .project-details-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.user-profile .project-details-image .image,.user-profile .submit-button,.wiki-nav li .loading{width:100%}.user-profile .image-container{position:relative;margin-bottom:0}.user-profile .loading-overlay{display:none}.user-profile .loading-overlay.active{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.user-profile .image-help{line-height:1rem;margin-bottom:.5rem;text-align:center}.user-profile .use-default-image{text-align:center}.user-profile .use-default-image:hover{color:red}.user-profile .project-details-form-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.user-profile form{display:block}}.user-profile .delete-account{font-size:.9rem;display:block;margin-top:1rem}.wiki-nav li input{font-size:1rem}.attachment-list .attachment-settings .editable-settings,.attachment-list .attachment-settings .settings,.attachment-list .icon-delete,.wiki-nav li{font-size:1.2rem}.wiki-nav li{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.wiki-nav li:hover .icon{opacity:1;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li a{display:block;padding:1rem 0 1rem 1rem}.wiki-nav li a span{cursor:pointer}.wiki-nav li .icon{color:#050505;float:right;opacity:0;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li input{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background:#444;color:#f5f5f5}.wiki-nav li input::-webkit-input-placeholder{color:#b8b8b8}.wiki-nav li input::-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-ms-input-placeholder{color:#b8b8b8}.wiki-nav li .loading{margin:0;padding:8px;text-align:center}.wiki-nav .add-button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.wiki-summary .wiki-user-modification,.wiki-summary div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.wiki-summary .username{font-size:1.2rem;color:#9dce0a;white-space:nowrap}.wiki-summary{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary div{display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:1rem}.wiki-summary .number{line-height:2rem;top:0}.wiki-summary .wiki-user-modification{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary figure{margin-right:.3rem;width:32px}.attachment-gallery{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.attachment-gallery .single-attachment{margin-bottom:.5rem;margin-right:.5rem;max-width:200px}.attachment-gallery .single-attachment:hover .icon-delete{opacity:1}.attachment-gallery .single-attachment .attachment-image{display:inline-block}.attachment-gallery .single-attachment img{height:150px;margin-bottom:.2rem;width:200px}.attachment-gallery .single-attachment img:hover{-webkit-filter:saturate(150%) hue-rotate(60deg);filter:saturate(150%) hue-rotate(60deg);-webkit-transition:all .3s cubic-bezier(.01,.7,1,1);transition:all .3s cubic-bezier(.01,.7,1,1)}.attachment-gallery .single-attachment.deprecated img{opacity:.5}.attachment-gallery .single-attachment.deprecated .attachment-name{color:#757575}.attachment-gallery .single-attachment .attachment-data{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.attachment-gallery .single-attachment .attachment-name{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;max-width:175px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block}.attachment-gallery .single-attachment .icon-delete{color:#ff0062;margin-left:auto;opacity:0;-webkit-transition:opacity .3s ease-in;transition:opacity .3s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.attachment-gallery .single-attachment .icon-delete:hover{color:#ff2400}.attachment-list .attachment-comments span,.attachment-list .attachment-settings .editable-settings,.attachment-list .attachment-settings .settings,.attachment-list .editable-attachment-comment span,.attachment-list .single-attachment.deprecated,.attachment-list .single-attachment.deprecated .attachment-name a{color:#757575}.attachment-gallery .single-attachment .loading-container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:150px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0 .5rem .5rem 0;width:200px}.attachment-gallery .single-attachment .loading-spinner{margin:0 auto;max-height:3rem;max-width:3rem}.attachment-list .single-attachment{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;position:relative}.attachment-list .single-attachment:hover .settings{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.attachment-list .attachment-name{max-width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding-right:1rem}.attachment-list .attachment-comments,.attachment-list .editable-attachment-comment{-webkit-box-flex:2;-webkit-flex:2;-ms-flex:2;flex:2;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;margin-right:.5rem}.attachment-list .attachment-size{-webkit-flex-basis:125px;-ms-flex-preferred-size:125px;flex-basis:125px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.attachment-list .attachment-settings{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:10%;-ms-flex-preferred-size:10%;flex-basis:10%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin-left:auto}.attachment-list .attachment-settings .editable-settings:hover,.attachment-list .attachment-settings .settings:hover{color:#000}.attachment-list .attachment-settings .settings{opacity:0}.attachment-list .attachment-settings .editable-settings{opacity:1}.attachment-list .attachment-settings .icon-delete:hover{color:#ff2400}.attachment-list .attachment-settings .icon-drag-v{cursor:move}.attachment-list .icon-delete{color:#757575}.attachment-list .icon-delete:hover{color:#ff2400}.attachment-list .editable-attachment-deprecated{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:1rem}.attachment-list .editable-attachment-deprecated span{color:#757575}.attachment-list .editable-attachment-deprecated input{margin-right:.2rem;vertical-align:middle}.attachment-list .editable-attachment-deprecated input:checked+span{color:#212121}.attachment-list .percentage{background:rgba(0,0,0,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.attachments-empty,.attachments-header .attachments-title,.single-attachment .attachment-name{font-weight:800;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.more-attachments,.single-attachment{font-size:.9rem}.attachments-header .attachments-title{font-size:1rem;color:#212121;padding:0 1rem}.attachments{margin-bottom:2rem}.attachments-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.attachments-header .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.attachments-header label{cursor:pointer;margin-left:1rem}.attachments-header label.add-attachment-button{background:#757575;border:0;display:inline-block;padding:.5rem;-webkit-transition:background .25s;transition:background .25s}.attachments-header label.add-attachment-button:hover{background:#212121}.attachments-header label svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.attachments-header button{background:0 0;margin-right:.2rem}.attachments-header button.is-active svg,.attachments-header button:hover svg{fill:#212121}.attachments-header button svg{fill:#757575;height:1.6rem;margin-bottom:-.2rem;width:1.6rem}.attachments-header input{display:none}.attachments-empty{font-size:1.2rem;border:3px dashed #757575;color:#757575;margin-top:.5rem;padding:1rem;text-align:center}.single-attachment.ui-sortable-helper{background:#999;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.single-attachment.sortable-placeholder{background:#757575;height:40px}.single-attachment .attachment-name{padding-right:1rem}.single-attachment .attachment-name .icon{margin-right:.25rem}.single-attachment .attachment-name svg{height:1.2rem;width:1.2rem}.single-attachment .attachment-size{color:#757575}.more-attachments{border-bottom:1px solid #757575;display:block;padding:1rem 0 1rem 1rem}.live-announcement,.live-announcement-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.more-attachments .more-attachments-num{color:#000;margin-left:.5rem}.more-attachments:hover{background:#999;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.attachment-preview img{max-height:80vh;max-width:80vw}.live-announcement-inner .title{font-size:1.6rem;color:#107a8a;margin-bottom:.5rem}.live-announcement-inner .title,.live-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.live-announcement{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#98e0eb;display:flex;height:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;-webkit-transition:width .5s,height .5s;transition:width .5s,height .5s;-webkit-transition-delay:.5s;transition-delay:.5s;width:0;z-index:99}.live-announcement .live-announcement-inner{opacity:0;-webkit-transition:opacity .5s;transition:opacity .5s;width:100%}.live-announcement.visible{height:146px;pointer-events:auto;-webkit-transition-delay:0s;transition-delay:0s;width:100%}.live-announcement.visible .live-announcement-inner{opacity:1;-webkit-transition:opacity .5s .5s;transition:opacity .5s .5s}.live-announcement-inner{display:flex;max-width:1200px}.live-announcement-inner .announcement-decoration{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin-right:1rem}.live-announcement-inner .text{padding:1.25rem 3rem 1.25rem 2rem;position:relative;width:100%}.live-announcement-inner .warning,.live-announcement-inner .warning a{color:#107a8a}.live-announcement-inner .close{height:2.5rem;position:absolute;right:0;top:1rem;width:2.5rem}.live-announcement-inner .close svg{fill:#18b7cf;-webkit-transition:fill .2s;transition:fill .2s}.live-announcement-inner .close svg:hover{fill:#107a8a}.discover-header .project-number{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#72a114}.discover-header{background:url(../images/discover.png) bottom left repeat-x #f5f5f5;margin-bottom:2.5rem;padding:1rem 1rem 2rem;text-align:center}.discover-header .discover-header-inner{max-width:1200px;min-width:768px;margin:0 auto}.discover-header .title{font-size:3rem;margin-bottom:0}.discover-header form{margin:0 30%;position:relative}@media (max-width:767px){.discover-header .discover-header-inner{width:90%;min-width:0}.discover-header form{margin:0 .5rem}}.discover-header input[type=text]{background:#fff;border:0;padding:1rem;width:100%}.discover-header input[type=text]:focus{outline-color:#9dce0a}.discover-header input[type=text]:-webkit-autofill{background:rgba(135,155,137,.5)}.discover-header .search-button{position:absolute;right:1rem;top:1rem}.discover-header .search-button:hover svg{fill:#72a114}.discover-header svg{fill:#b8b8b8;height:1.5rem;-webkit-transition:all .2;transition:all .2;width:1.5rem}.discover-search-subfilter .results{font-size:.9rem}.discover-results-header .title{font-size:1.6rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;text-transform:uppercase}.discover-results-header .discover-results-header-inner{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.discover-results-header svg{width:1.1rem;height:1.1rem;fill:#b8b8b8}.discover-results-header h2{display:inline-block}.filter-discover-search .discover-search-filter{margin-right:1rem}.filter-discover-search .discover-search-filter.active{color:#72a114}.discover-search-subfilter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:relative}.discover-search-subfilter:after,.discover-search-subfilter:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.discover-search-subfilter:after{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:8px;margin-left:-8px}.discover-search-subfilter:before{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.discover-search-subfilter.most-liked-subfilter::after,.discover-search-subfilter.most-liked-subfilter::before{left:85%}.discover-search-subfilter.most-active-subfilter::after,.discover-search-subfilter.most-active-subfilter::before{left:95%}.discover-search-subfilter.ng-enter{-webkit-animation:dropdownFade .2s;animation:dropdownFade .2s}.discover-search-subfilter .results{color:#ff8282;display:block;padding:.5rem 1rem;-webkit-transition:all .2s;transition:all .2s}.discover-search-subfilter .results:hover{color:red}.discover-search-subfilter .filter-list{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 0 0 auto}.discover-search-subfilter .filter-list a{display:block;padding:.5rem 1rem;-webkit-transition:all .2s;transition:all .2s}.featured-project,.featured-projects-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.discover-search-subfilter .filter-list a:hover{background:#b8b8b8;color:currentColor}.discover-search-subfilter .filter-list a.active{background:#9dce0a;color:#f5f5f5}.featured-project .project-card-description,.featured-project .statistic{font-size:.9rem}.featured-project .project-card-name a{font-size:1.2rem}.featured-project .project-card-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.featured-projects .title{font-size:1.6rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#444;text-align:center}.featured-projects{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.featured-projects{width:90%;min-width:0}}.featured-projects-inner{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.featured-project{background:#fff;border:1px solid #f5f5f5;margin:.5rem;display:flex;-webkit-flex-basis:23%;-ms-flex-preferred-size:23%;flex-basis:23%;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:23%}.featured-project .tags-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.3rem}.featured-project .project-tag{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.featured-project .project-card-inner{padding:1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.featured-project .project-card-description{color:#555}.featured-project .project-card-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:auto}.featured-project .project-card-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.featured-project .project-card-statistics .svg-eye-closed{display:none}.featured-project .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.featured-project .project-card-name a,.featured-project .statistic.active{color:#72a114}.featured-project .statistic.active svg{fill:#72a114}.featured-project .project-card-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.featured-project .project-card-logo{display:inline-block;-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;width:50px;height:50px;margin-right:.5rem}.featured-project .project-card-logo img{width:100%}.featured-project .project-card-name{line-height:.9}.featured-project .project-card-name a:hover{color:#9dce0a}.featured-project .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8;margin:0 .5rem}@media (max-width:767px){.featured-project{-webkit-flex-basis:45%;-ms-flex-preferred-size:45%;flex-basis:45%}}@media (max-width:480px){.featured-project{-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%}}.filter-highlighted li,.highlighted-project .project-description,.highlighted-project .statistic{font-size:.9rem}.highlighted-project .project-title{font-size:1.2rem}.highlighted .title{font-size:1.6rem}.highlighted .empty-highlighted-project span{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted-project .project-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.highlighted{margin:1rem auto 4rem;max-width:1200px;min-width:768px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}@media (max-width:767px){.highlighted{width:90%;min-width:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.highlighted tg-most-active{margin-top:4rem}}.highlighted tg-most-active,.highlighted tg-most-liked{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.highlighted tg-most-liked{margin-right:8%}@media (max-width:767px){.highlighted tg-most-liked{margin-right:0}}.highlighted .most-active,.highlighted .most-liked{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.highlighted .header{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.highlighted .header svg{width:1.5rem;height:1.5rem;fill:#b8b8b8;margin:.5rem}.highlighted .title-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.highlighted .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#444;display:inline-block;margin:0}.empty-discover-results .title,.home-project .project-card-description,.home-wrapper .title-bar,.projects-empty p,.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted .highlighted-projects-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.highlighted .loading-container{margin-top:calc(50% - 1rem)}.highlighted .loading-spinner{display:block;margin:2rem auto;max-height:3rem;max-width:3rem}.highlighted .view-more-projects{margin-top:auto;width:100%}.highlighted .empty-highlighted-project{border:2px dashed #f5f5f5;padding:2rem;text-align:center}.highlighted .empty-highlighted-project svg{width:2rem;height:2rem;display:block;fill:#b8b8b8;margin:1rem auto}.highlighted .empty-highlighted-project span{color:#555;display:block}.filter-highlighted{position:relative}.filter-highlighted .current-filter{padding:1rem}.filter-highlighted .current-filter span{margin-left:.2rem;position:relative;top:.2rem}.filter-highlighted .filter-list{background:#000;position:absolute;right:0;top:1.5rem}.filter-highlighted .filter-list.ng-enter{-webkit-animation:dropdownFade .2s ease-in;animation:dropdownFade .2s ease-in}.filter-highlighted .filter-list.ng-leave{-webkit-animation:dropdownFade .2s ease-in;animation:dropdownFade .2s ease-in;-webkit-animation-direction:reverse;animation-direction:reverse}.filter-highlighted li{color:#fff;cursor:pointer;min-width:8rem;padding:.25rem .5rem}.filter-highlighted li:hover{background:rgba(157,206,10,.4)}.highlighted-project{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:9rem;-ms-flex-preferred-size:9rem;flex-basis:9rem;min-height:9rem;padding:1.5rem 0}.highlighted-project:nth-last-child(-n+2){border-bottom:0}.highlighted-project .project-logo{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;height:auto;margin-right:1rem;width:3rem}.highlighted-project .project-logo img{width:100%}.highlighted-project .project-data-container{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.highlighted-project .single-project-header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.highlighted-project .project-title{display:inline-block;margin-bottom:.5rem}.highlighted-project .project-title a{color:#72a114}.highlighted-project .project-title a:hover{color:#9dce0a}.highlighted-project .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8;margin-left:.5rem}.highlighted-project .project-description{color:#555;margin-bottom:0}.highlighted-project .project-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.highlighted-project .project-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.highlighted-project .project-statistics .svg-eye-closed{display:none}.highlighted-project .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.highlighted-project .statistic.active{color:#72a114}.highlighted-project .statistic.active svg{fill:#72a114}.discover-results .statistic{font-size:.9rem}.discover-search .discover-header form{margin:0 8rem;position:relative}.discover-search .discover-header .search-button{left:1rem;right:auto}.discover-search .discover-header .searchbox input{padding-left:3.5rem;padding-right:23rem}.discover-search .searchbox-filters{position:absolute;right:1rem;top:.7rem;width:auto}.discover-search .searchbox-filters input{display:none}.discover-search .searchbox-filters label{border-radius:4px;color:#b8b8b8;cursor:pointer;display:inline-block;padding:.4rem .75rem;-webkit-transition:all .2s;transition:all .2s;-webkit-transition-delay:.2s;transition-delay:.2s}.discover-search .searchbox-filters label.active{background:#9dce0a;color:#fff}.discover-search .searchbox-filters label:hover{background:#f5f5f5;color:#555}.discover-results{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.discover-results{width:90%;min-width:0}}.discover-results .discover-results-inner .spin{margin-top:4rem}.discover-results .list-itemtype-project{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:1rem 0}.discover-results .list-itemtype-project:last-child{border-bottom:0}.discover-results .list-itemtype-project-left{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%}.discover-results .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.discover-results .list-itemtype-project-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;vertical-align:middle}.discover-results .look-for-people{margin-left:.5rem}.discover-results .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8}.discover-results .project-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.discover-results .project-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.discover-results .project-statistics .svg-eye-closed{display:none}.discover-results .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.discover-results .statistic.active{color:#72a114}.discover-results .statistic.active svg{fill:#72a114}.discover-results .more-results{display:block;margin:0 20rem;-webkit-transition:inherit;transition:inherit}.discover-results div[tg-loading] img{display:block;margin:0 auto}.empty-discover-results{margin:4rem auto 1rem;max-width:1200px;min-width:768px;text-align:center}@media (max-width:767px){.empty-discover-results{width:90%;min-width:0}}.empty-discover-results img{margin-bottom:1rem}.empty-discover-results .title{font-size:1.2rem;margin:0;text-transform:uppercase}.external-app-wrapper .app-card a,.external-app-wrapper .app-card p,.external-app-wrapper .user-card a{font-size:.75rem}.external-app-wrapper .cancel{font-size:.9rem}.external-app-wrapper .app-card h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:6rem;margin:0 auto;width:6rem}.external-app-wrapper h1{margin-bottom:0}.external-app-wrapper .app-card,.external-app-wrapper .user-card{line-height:1.4;margin-bottom:2rem;text-align:left}.external-app-wrapper .app-card .card-inner,.external-app-wrapper .user-card .card-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.external-app-wrapper .app-card a,.external-app-wrapper .button-green,.external-app-wrapper .user-card a{display:block}.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.external-app-wrapper .app-card h3,.external-app-wrapper .app-card p,.external-app-wrapper .user-card h3,.external-app-wrapper .user-card p{margin:0}.external-app-wrapper .app-card a,.external-app-wrapper .user-card .card-inner{margin-bottom:.5rem}.external-app-wrapper .app-card .app-image{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.external-app-wrapper .user-card{background:#F0EFD1;border:1px solid #000;padding:1rem}.external-app-wrapper .user-card .user-image{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .cancel{display:block;margin-top:.5rem;text-align:left}@media (max-width:480px){.external-app-wrapper{margin:0;min-width:100%;padding:2rem 1rem;text-align:center;width:100%}}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #f5f5f5;cursor:pointer;-webkit-transition:background .2s;transition:background .2s;-webkit-transition-delay:.2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(157,206,10,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single>a,.working-on .duty-single>a{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.empty-ticket .data,.home-project .project-card-inner{-webkit-box-orient:vertical;-webkit-box-direction:normal}.watching .duty-single>a.blocked,.working-on .duty-single>a.blocked{background:rgba(255,130,130,.2);color:red}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper,.home-wrapper .title-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-wrapper{display:flex}.home-wrapper .duty-summary{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .project-list{width:250px}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-weight:100;font-size:1.6rem;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#757575;display:flex;margin:0 0 .5rem;padding:.9rem 1rem}.home-project .project-card-description,.home-project .statistic,.projects-empty p{font-size:.9rem}.home-project{background:#fff;border:1px solid #f5f5f5;margin:.5rem .5rem 1rem;cursor:pointer;-webkit-transition:.2s;transition:.2s;-webkit-transition-delay:.1s;transition-delay:.1s}.home-project .tags-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.3rem}.home-project .project-tag{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.home-project .project-card-inner{padding:1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home-project .project-card-description{color:#555}.home-project .project-card-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:auto}.home-project .project-card-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.home-project .project-card-statistics .svg-eye-closed{display:none}.home-project .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.empty-ticket,.home-project .project-card-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-project .statistic.active{color:#72a114}.home-project .statistic.active svg{fill:#72a114}.home-project .project-card-header{display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.home-project .project-card-logo{display:inline-block;-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;width:50px;height:50px;margin-right:.5rem}.home-project .project-card-logo img{width:100%}.home-project .project-card-name{line-height:.9}.home-project .project-card-name a{font-size:1.2rem;color:#72a114}.home-project .project-card-name a:hover{color:#9dce0a}.home-project .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8;margin:0 .5rem}.home-project:hover{border:1px solid #9dce0a}.projects-empty{text-align:center}.projects-empty svg{height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty svg path{fill:#f5f5f5}.navbar .nav-left>a path,.navbar a:hover svg path{fill:#fff}.projects-empty .create-project-button{display:block;margin-bottom:.25rem}.projects-empty .import-project-button{display:block}.watching-empty,.working-on-empty{margin-bottom:4rem}.watching-empty p,.working-on-empty p{margin:2rem 9rem 1rem;text-align:center}.empty-ticket{display:flex}.empty-ticket .data,.navbar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.empty-ticket:not(:last-child){border-bottom:1px solid #f5f5f5;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#e8e8e8;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:40vw}.empty-ticket .line:last-child{margin:0;width:20vw}.navbar{display:flex;height:40px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:relative}.navbar::after{background-size:200%;bottom:0;content:'';height:100%;left:0;position:absolute;right:0;top:0;z-index:-1}.navbar .nav-left,.navbar .nav-right{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.navbar .nav-left>a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left>a.logo{background:rgba(0,0,0,.2);padding:.4rem .75rem}.navbar .nav-left>a svg{height:1.6rem;max-height:1.6rem;max-width:2rem;width:1.6rem}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar a{color:#fff;display:inline-block;-webkit-transition:all .2s linear;transition:all .2s linear}.navbar a:hover{background:rgba(0,0,0,.2);color:#212121}.navbar a.user-avatar{min-width:200px;padding:0 0 0 2rem;text-align:right}.navbar a.user-avatar span{padding-right:1rem}.navbar img{height:2.5rem;padding-left:.5rem;vertical-align:middle}.navbar svg{height:1.2rem;max-height:1.2rem;max-width:1.2rem;width:1.2rem}.navbar svg path{fill:#fff;-webkit-transition:all .2s;transition:all .2s}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;display:block}.navbar .navbar-dropdown a{padding:.8rem .5rem}.navbar .navbar-dropdown{border-radius:2px;display:none;left:calc(50% - 350px/2);min-width:350px;position:absolute;top:2.4rem;z-index:999}.navbar-dropdown{background:#212121;border:1px solid #000;padding:.3rem}.navbar-dropdown.dropdown-user{left:calc(50% - 200px/2);min-width:200px}.navbar-dropdown.dropdown-user ul{margin-bottom:0}.navbar-dropdown ul{margin:0 0 .5rem;padding:0}.navbar-dropdown ul:after,.navbar-dropdown ul:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:rgba(33,33,33,0);border-bottom-color:#212121}.navbar-dropdown ul:after{border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown a{color:#757575;display:block;padding:.8rem .5rem}.navbar-dropdown .create-options,.profile-filter{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.navbar-dropdown a:hover{background:rgba(255,255,255,.1);color:#212121}.navbar-dropdown a.create-organization-btn,.navbar-dropdown a.create-project-btn,.navbar-dropdown a.see-more-projects-btn{color:#fff;text-align:center}.navbar-dropdown a.create-organization-btn:hover,.navbar-dropdown a.create-project-btn:hover,.navbar-dropdown a.see-more-projects-btn:hover{color:#fff}.navbar-dropdown a.see-more-projects-btn{margin-bottom:.3rem}.navbar-dropdown a.create-project-btn{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.navbar-dropdown a.import-project-button{padding-left:.75rem;padding-right:.75rem}.navbar-dropdown .create-options{display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #f5f5f5}.profile-filter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile,.profile-filter .searchbox{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.profile-filter .searchbox{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{color:grayer;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs,.profile-projects,.profile-timeline{border-top:1px solid #f5f5f5}.profile-filter .searchbox input:focus{border-bottom:1px solid #b8b8b8;outline:0;-webkit-transition:border-bottom .3s ease-in;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#b8b8b8;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#050505}.profile .timeline-wrapper .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile{display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{background:#8f8f8f;margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;-webkit-transition:all .3s cubic-bezier(.09,.43,.35,.95);transition:all .3s cubic-bezier(.09,.43,.35,.95)}.profile .timeline-wrapper>div.ng-hide{opacity:0;padding-top:.5vh}.profile .timeline-wrapper .spin{margin:10% auto;width:3rem}.profile .profile-sidebar{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.profile .profile-sidebar .button-gray{display:block;margin-bottom:2rem;padding-left:2rem;padding-right:2rem}.profile .empty-tab{padding:5vh;text-align:center}.profile .empty-tab svg{margin:2rem auto;max-width:160px;text-align:center}.profile .empty-tab p{font-size:.9rem}.profile-bar .profile-stats .stat-name{font-size:.9rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username{font-size:1.2rem}.profile-bar h2{font-size:1.6rem}.profile-bar .profile-stats .stat-number,.profile-bar h1{font-size:2rem}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar .profile-organizations h3,.profile-bar .profile-stats .stat-number,.profile-bar h1{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-bar .profile-image-wrapper{height:200px;margin-bottom:1rem;overflow:hidden;position:relative}.profile-bar .profile-image-wrapper.is-current-user:hover img{-webkit-filter:brightness(40%) saturate(150%) hue-rotate(60deg);filter:brightness(40%) saturate(150%) hue-rotate(60deg);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1);-webkit-transition-delay:.3s;transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;-webkit-transform:translateY(100%);transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);-webkit-transition:all .3s cubic-bezier(.01,.7,1,1);transition:all .3s cubic-bezier(.01,.7,1,1)}.profile-bar .button-green{display:block;margin-bottom:1rem}.profile-bar .profile-data{position:relative}.profile-bar .flag{position:absolute;right:0;top:0;width:12px}.profile-bar .flag path{fill:#b8b8b8;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar .flag:hover path{fill:red;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar h1{line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar h2{color:#555;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#b8b8b8;margin-bottom:1rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#b8b8b8}.main-nav svg path,.navbar a svg path{fill:#fff}.profile-bar .profile-stats{border-bottom:1px solid #f5f5f5;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1.25rem;padding:1rem .5rem}.profile-bar .profile-stats .stat{padding:0 .2rem;text-align:center}.profile-bar .profile-stats .stat-number{display:block;line-height:1}.profile-bar .profile-stats .stat-name{display:block}.profile-bar .profile-organizations{border-bottom:1px solid #f5f5f5;border-top:1px solid #f5f5f5;margin-bottom:1rem;padding:1rem 0}.profile-bar .profile-organizations h3{margin-bottom:.5rem}.profile-bar .profile-organizations .profile-organizations-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.profile-bar .profile-organizations .organization{background:#b8b8b8;border-radius:5px;height:45px;margin-right:.2rem;width:45px}.profile-bar .profile-quote{background:url(../images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contact-single .profile-contact-data h1 span{font-size:.9rem}.profile-contact-single .profile-contact-data .extra-info{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-contact-single .profile-contact-data h1,.profile-contact-single .profile-contact-data h1 span{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.profile-contacts{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.profile-contact-filters{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.profile-contact-filters a{border-bottom:2px solid #fff;color:#b8b8b8;display:inline-block;padding:1rem 1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-contact-filters a.active,.profile-contact-filters a:hover{border-bottom:2px solid #b8b8b8;color:#72a114}.profile-contact-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.8rem 1rem}.profile-contact-single .profile-contact-picture{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:1rem;max-width:54px}.profile-contact-single .profile-contact-picture img{border-radius:.2rem;width:100%}.profile-contact-single .profile-contact-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-contact-single .profile-contact-data h1{font-size:1.2rem;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;line-height:1.6;margin-bottom:0;text-transform:none}.profile-contact-single .profile-contact-data h1 span{background:#f5f5f5;color:#555;margin-left:1rem;padding:.1rem .3rem}.profile-contact-single .profile-contact-data p{color:#555;margin-bottom:0}.profile-contact-single .profile-contact-data .extra-info{color:#555}.profile-contact-single .profile-contact-data .position{margin-right:.3rem}.profile-contact-single .profile-project-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-left:auto;width:100px}.profile-contact-single .profile-project-stats div{color:#b8b8b8;margin-right:.5rem}.profile-contact-single .profile-project-stats div .icon{margin-right:.2rem;vertical-align:center}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{display:inline-block;padding:1rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#444;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #f5f5f5;border-right:1px solid #f5f5f5;position:relative;top:1px;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .icon{margin-right:.4rem}.profile-sidebar p{font-size:.9rem}.profile-sidebar h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin-bottom:.5rem;padding:.5rem}.profile-sidebar h4 .icon{color:#b8b8b8;margin-right:.3rem;vertical-align:text-bottom}.profile-sidebar a{color:#72a114}.profile-sidebar .trans-button{margin-bottom:1rem}.profile-projects .list-itemtype-project{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:10rem}.profile-projects .list-itemtype-project .project-list-single-title-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.profile-projects .list-itemtype-project .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:200px}.project-list-wrapper .help-area{font-size:.9rem;color:#b8b8b8;width:200px}.project-list-wrapper .drag{font-size:1.2rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:2rem 0 1rem;padding:.9rem 1rem}.project-list-wrapper .project-list-title h1{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.project-list-wrapper .create-options a.create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .create-options a.import-project-button{padding:.53rem .8rem}.project-list-wrapper .create-options a.import-project-button:hover{background:#444}.project-list-wrapper .create-options a.import-project-button .icon-upload{margin:0}.project-list-wrapper .project-list-section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .placeholder{background-color:#fdfdfd;height:5rem}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:#fcfef8;cursor:move;-webkit-transition:background .3s;transition:background .3s}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .list-itemtype-project .list-itemtype-project-data-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-list-wrapper .list-itemtype-project .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.project-list-wrapper .drag{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;color:#b8b8b8;opacity:0;-webkit-transition:opacity .2s;transition:opacity .2s}.profile-timeline .single-attachment span{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child,.profile-timeline .activity-member-view a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-timeline .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32}.profile-timeline .activity-item{border-bottom:1px solid #f5f5f5;padding:1rem .5rem 1rem 0;position:relative}.profile-timeline .activity-item p{margin-bottom:0}.profile-timeline .activity-item .username,.profile-timeline .activity-item a{color:#72a114}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{color:#555}.profile-timeline .activity-item a:hover{color:#9dce0a}.profile-timeline .activity-item blockquote{line-height:1.4rem;margin-bottom:0;margin-left:calc(35px + 1rem);margin-top:.5rem;overflow-x:auto;overflow-y:hidden;white-space:pre-line}.profile-timeline .activity-item img{max-height:640px;max-width:640px}.profile-timeline .activity-item .activity-info{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#b8b8b8;font-size:.75rem;position:absolute;right:.5rem;top:1.2rem}.profile-timeline .activity-item .profile-contact-picture,.profile-timeline .activity-item .profile-member-picture{border-radius:.1rem;-webkit-flex-basis:2rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;vertical-align:center;width:2rem}.profile-timeline .activity-item .profile-contact-picture img,.profile-timeline .activity-item .profile-member-picture img{width:100%}.profile-timeline .activity-member-view{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-timeline .activity-member-view p{color:#b8b8b8}a:hover,h1 .date,h2 .date,h3 .date,h4 .date,h5 .date,h6 .date{color:#000}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.profile-timeline .single-attachment .icon{margin-right:.3rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{max-height:3rem;max-width:3rem}.markItUpEditor{font-size:.9rem;line-height:1.5;font-family:monospace}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}.checksley-error-list{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}body{background:#fff}.extrabar,.master,.menu-secondary,.menu-tertiary{background:#fff;border-left:1px solid #000;border-right:1px solid #000}.master,.menu-secondary{background:#fff}.menu-tertiary{background-color:#fff}.extrabar{background:#fff}h1,h2,h3,h4,h5,h6{font-family:Arial,Helvetica,sans-serif}a{color:#212121}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{background:#fff;border-color:#000;color:#000}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#000}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#000}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#000}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#000}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{border:1px solid #ff2400}.checksley-error-list{background:rgba(255,36,0,.7);color:#fff}blockquote{border-left:5px solid #757575}blockquote,blockquote p,cite{color:#000}.navbar a :hover,.summary{color:#fff}.button-gray{background:#000}.tag{background:#fff;border:1px solid #000}.summary{background:#212121}.navbar{background:#000}.navbar::after{background:url(../images/menu-vert.png) top left}.activity-item p,.duty-custom-fields .custom-field-data .custom-field-description,.kanban-table-header .task-colum-name .icon,.points-per-role>li,.private path,.table-team .avatar .position,.taskboard-table-header .task-colum-name .icon,.us-created-by .created-by .created-date,.us-created-by .created-by .created-title,.watching .duty-id,.working-on .duty-id{color:#000}tg-project-menu{background-color:#000;background-image:none}.main-nav .active{background:#fff}.main-nav .active svg path{fill:#000}.taskboard-table-header .task-colum-name{background:#fff;border-top:3px solid #000}.taskboard-table-body .taskboard-tasks-box{background:#fff;border:1px solid #000}.kanban-table-header .task-colum-name{background:#fff;border-top:3px solid #000}.kanban-table-body .kanban-uses-box{background:#757575}.points-per-role>li:first-child{background:#000}.us-detail-settings .button-gray{background:0 0;border:1px solid #000;color:#000}.us-detail-settings .button-gray.active,.us-detail-settings .button-gray:hover{color:#fff}.history-tabs a,.more-attachments span,.us-detail-settings .button-gray span{color:#000}.login-main,.login-main a{color:#fff}.home-project-list li{border:1px solid #000}.home-project-list p{color:#000}.profile-content-tabs .tab,.profile-sidebar p{color:#212121}.settings-nav .active{background:#000;color:#fff}.admin-submenu ul a{color:#000}.policy-table input:checked+label{color:#fff}.policy-table label{color:#000}.policy-table label:hover{color:#fff}.admin-common .admin-subtitle,.admin-membership-table .avatar .email,.admin-membership-table .delete{color:#000}.admin-functionalities .functionality.active{background:#fff;border:1px solid #000}.home-wrapper .title-bar{color:#fff} \ No newline at end of file diff --git a/dist/v-1454172424320/styles/theme-material-design.css b/dist/v-1454172424320/styles/theme-material-design.css deleted file mode 100644 index 234bc56..0000000 --- a/dist/v-1454172424320/styles/theme-material-design.css +++ /dev/null @@ -1,4 +0,0 @@ -@charset "UTF-8";.introjs-arrow,blockquote::after,blockquote::before,q::after,q::before{content:''}.pika-table,table{border-collapse:collapse;border-spacing:0}.kanban-task-minimized .task-name,h1 .date,h1 span{text-overflow:ellipsis;white-space:nowrap}.lightbox textarea,.wizard-create-project textarea,textarea{resize:vertical}.change-entry .activity-fromto,.kanban-task-maximized .task-name,.profile-bar .not-full-name,.profile-bar h1{word-wrap:break-word}.codehilite .hll{background-color:#49483e}.codehilite .c{color:#75715e}.codehilite .err{color:#960050;background-color:#1e0010}.codehilite .k{color:#66d9ef}.codehilite .l{color:#ae81ff}.codehilite .n{color:#f8f8f2}.codehilite .o{color:#f92672}.codehilite .p{color:#f8f8f2}.codehilite .c1,.codehilite .cm,.codehilite .cp,.codehilite .cs{color:#75715e}.codehilite .ge{font-style:italic}.codehilite .gs{font-weight:700}.codehilite .kc,.codehilite .kd{color:#66d9ef}.codehilite .kn{color:#f92672}.codehilite .kp,.codehilite .kr,.codehilite .kt{color:#66d9ef}.codehilite .ld{color:#e6db74}.codehilite .m{color:#ae81ff}.codehilite .s{color:#e6db74}.codehilite .na{color:#a6e22e}.codehilite .nb{color:#f8f8f2}.codehilite .nc{color:#a6e22e}.codehilite .no{color:#66d9ef}.codehilite .nd{color:#a6e22e}.codehilite .ni{color:#f8f8f2}.codehilite .ne,.codehilite .nf{color:#a6e22e}.codehilite .nl,.codehilite .nn{color:#f8f8f2}.codehilite .nx{color:#a6e22e}.codehilite .py{color:#f8f8f2}.codehilite .nt{color:#f92672}.codehilite .nv{color:#f8f8f2}.codehilite .ow{color:#f92672}.codehilite .w{color:#f8f8f2}.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#ae81ff}.codehilite .s2,.codehilite .sb,.codehilite .sc,.codehilite .sd{color:#e6db74}.codehilite .se{color:#ae81ff}.codehilite .s1,.codehilite .sh,.codehilite .si,.codehilite .sr,.codehilite .ss,.codehilite .sx{color:#e6db74}.codehilite .bp,.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#f8f8f2}.codehilite .il{color:#ae81ff}.codehilite .gu{color:#75715e}.codehilite .gd{color:#f92672}.codehilite .gi{color:#a6e22e}.mCustomScrollbar{-ms-touch-action:none;touch-action:none}.mCustomScrollbar.mCS_no_scrollbar{-ms-touch-action:auto;touch-action:auto}.mCustomScrollBox{position:relative;overflow:hidden;height:100%;max-width:100%;outline:0;direction:ltr}.mCSB_container{overflow:hidden;width:auto;height:auto}.mCSB_inside>.mCSB_container{margin-right:30px}.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container{margin-right:0;margin-left:30px}.mCS-dir-rtl>.mCSB_inside>.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-left:0}.mCSB_scrollTools{position:absolute;width:16px;height:auto;left:auto;top:0;right:0;bottom:0;opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_outside+.mCSB_scrollTools{right:-26px}.mCS-dir-rtl>.mCSB_inside>.mCSB_scrollTools,.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{right:auto;left:0}.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{left:-26px}.mCSB_scrollTools .mCSB_draggerContainer{position:absolute;top:0;left:0;bottom:0;right:0;height:auto}.mCSB_scrollTools a+.mCSB_draggerContainer{margin:20px 0}.mCSB_scrollTools .mCSB_draggerRail{width:2px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCSB_scrollTools .mCSB_dragger{cursor:pointer;width:100%;height:30px;z-index:1}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{position:relative;width:4px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px;text-align:center}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:12px}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:8px}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonUp{display:block;position:absolute;height:20px;width:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools .mCSB_buttonDown{bottom:0}.mCSB_horizontal.mCSB_inside>.mCSB_container{margin-right:0;margin-bottom:30px}.mCSB_horizontal.mCSB_outside>.mCSB_container{min-height:100%}.mCSB_horizontal>.mCSB_container.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal{width:auto;height:16px;top:auto;right:0;bottom:0;left:0}.mCustomScrollBox+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:-26px}.mCSB_scrollTools.mCSB_scrollTools_horizontal a+.mCSB_draggerContainer{margin:0 20px}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:2px;margin:7px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger{width:30px;height:100%;left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:4px;margin:6px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:12px;margin:2px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:8px;margin:4px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{display:block;position:absolute;width:20px;height:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft{left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{right:0}.mCSB_container_wrapper{position:absolute;height:auto;width:auto;overflow:hidden;top:0;left:0;right:0;bottom:0;margin-right:30px;margin-bottom:30px}.mCSB_container_wrapper>.mCSB_container{padding-right:30px;padding-bottom:30px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:20px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:20px}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden+.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:20px}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container_wrapper{margin-right:0;margin-left:30px}.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden>.mCSB_container{padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden>.mCSB_container{padding-bottom:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0;margin-left:0}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;transition:opacity .2s ease-in-out,background-color .2s ease-in-out}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar{-webkit-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out}.introjs-helperLayer,.introjs-overlay{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out}.mCS-autoHide>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide>.mCustomScrollBox~.mCSB_scrollTools{opacity:0;filter:"alpha(opacity=0)";-ms-filter:"alpha(opacity=0)"}.mCS-autoHide:hover>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide:hover>.mCustomScrollBox~.mCSB_scrollTools,.mCustomScrollBox:hover>.mCSB_scrollTools,.mCustomScrollBox:hover~.mCSB_scrollTools,.mCustomScrollbar>.mCustomScrollBox>.mCSB_scrollTools.mCSB_scrollTools_onDrag,.mCustomScrollbar>.mCustomScrollBox~.mCSB_scrollTools.mCSB_scrollTools_onDrag{opacity:1;filter:"alpha(opacity=100)";-ms-filter:"alpha(opacity=100)"}.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.4);filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75);filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85);filter:"alpha(opacity=85)";-ms-filter:"alpha(opacity=85)"}.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9);filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp{background-image:url(mCSB_buttons.png);background-repeat:no-repeat;opacity:.4;filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_buttonUp{background-position:0 0}.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -20px}.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -40px}.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -56px}.mCSB_scrollTools .mCSB_buttonDown:hover,.mCSB_scrollTools .mCSB_buttonLeft:hover,.mCSB_scrollTools .mCSB_buttonRight:hover,.mCSB_scrollTools .mCSB_buttonUp:hover{opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_buttonDown:active,.mCSB_scrollTools .mCSB_buttonLeft:active,.mCSB_scrollTools .mCSB_buttonRight:active,.mCSB_scrollTools .mCSB_buttonUp:active{opacity:.9;filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCS-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:rgba(0,0,0,.85)}.mCS-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:rgba(0,0,0,.9)}.mCS-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:4px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px auto}.mCS-light-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px 0}.mCS-light-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -20px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -40px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px 0}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -20px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -40px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px 0}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:6px;margin:5px auto}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px 0}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -20px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -40px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px 0}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -20px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -40px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -56px}.mCS-light-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.1)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:2px}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:2px;margin:7px auto}.mCS-dark-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-rounded.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger,.mCS-rounded.mCSB_scrollTools .mCSB_dragger{height:14px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:14px;margin:0 1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger{width:14px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:14px;margin:1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:16px;height:16px;margin:-1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:4px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:16px;width:16px;margin:0 -1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:4px;margin:6px 0}.mCS-rounded.mCSB_scrollTools .mCSB_buttonUp{background-position:0 -72px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -92px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -112px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -128px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px -72px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -92px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -112px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools_vertical .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_vertical .mCSB_draggerRail{width:4px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{background-color:transparent;background-position:center}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAANElEQVQYV2NkIAAYiVbw//9/Y6DiM1ANJoyMjGdBbLgJQAX/kU0DKgDLkaQAvxW4HEvQFwCRcxIJK1XznAAAAABJRU5ErkJggg==);background-repeat:repeat-y;opacity:.3;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{height:4px;margin:6px 0;background-repeat:repeat-x}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px -72px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -92px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -112px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYV2NkIAAYSVFgDFR8BqrBBEifBbGRTfiPZhpYjiQFBK3A6l6CvgAAE9kGCd1mvgEAAAAASUVORK5CYII=)}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px -72px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -92px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -112px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-y;background-image:-moz-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to right,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-x;background-image:-moz-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to bottom,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-3d.mCSB_scrollTools_vertical .mCSB_dragger{height:70px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger{width:70px}.mCS-3d-dark.mCSB_scrollTools,.mCS-3d.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{width:8px;background-color:#000;background-color:rgba(0,0,0,.2);box-shadow:inset 1px 0 1px rgba(0,0,0,.5),inset -1px 0 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:8px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:8px;margin:4px 0;box-shadow:inset 0 1px 1px rgba(0,0,0,.5),inset 0 -1px 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:8px;margin:4px auto}.mCS-3d.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);box-shadow:inset 1px 0 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{box-shadow:inset 0 1px 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer,.mCS-3d-thick.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.mCSB_inside+.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCSB_inside+.mCS-3d-thick.mCSB_scrollTools_vertical{right:1px}.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCS-3d-thick.mCSB_scrollTools_vertical{box-shadow:inset 1px 0 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal,.mCS-3d-thick.mCSB_scrollTools_horizontal{bottom:1px;box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;box-shadow:inset 1px 0 0 rgba(255,255,255,.4);width:12px;margin:2px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4);height:12px;width:auto}.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{background-color:#000;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-thick-dark.mCSB_scrollTools{box-shadow:inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal{box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 1px 0 0 rgba(255,255,255,.4),inset -1px 0 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4),inset 0 -1px 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#777}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer{background-color:#fff;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{right:0;margin:12px 0}.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:0;margin:0 12px}.mCS-dir-rtl>.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCS-dir-rtl>.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{left:0;right:auto}.mCS-minimal-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_vertical .mCSB_dragger{height:50px}.mCS-minimal-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_horizontal .mCSB_dragger{width:50px}.mCS-minimal.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools .mCSB_draggerRail{width:6px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px}.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:6px;margin:5px 0}.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:12px}.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:12px;margin:2px 0}.mCS-light-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools .mCSB_draggerRail{width:12px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;margin:3px 5px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:6px;margin:5px 3px;position:absolute;width:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:12px;margin:2px 0}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent;border-width:1px;border-style:solid;border-color:#fff;border-color:rgba(255,255,255,.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail{border-color:#000;border-color:rgba(0,0,0,.2)}.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.6)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.6)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.dropdown-menu{border:1px solid #ddd;background-color:#fff}.dropdown-menu li{border-top:1px solid #ddd;padding:2px 5px}.dropdown-menu li:first-child{border-top:none}.dropdown-menu .active,.dropdown-menu li:hover{background-color:#6eb7db;color:#fff}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff}.dropdown-menu{list-style:none;padding:0;margin:0}.dropdown-menu a:hover{cursor:pointer}.markItUp .markItUpButton1 a{background-image:url(../images/markitup/h1.png)}.markItUp .markItUpButton2 a{background-image:url(../images/markitup/h2.png)}.markItUp .markItUpButton3 a{background-image:url(../images/markitup/h3.png)}.markItUp .markItUpButton4 a{background-image:url(../images/markitup/bold.png)}.markItUp .markItUpButton5 a{background-image:url(../images/markitup/italic.png)}.markItUp .markItUpButton6 a{background-image:url(../images/markitup/stroke.png)}.markdown .markItUpButton7 a{background-image:url(../images/markitup/list-bullet.png)}.markdown .markItUpButton8 a{background-image:url(../images/markitup/list-numeric.png)}.markdown .markItUpButton9 a{background-image:url(../images/markitup/picture.png)}.markdown .markItUpButton10 a{background-image:url(../images/markitup/link.png)}.markdown .markItUpButton11 a{background-image:url(../images/markitup/quotes.png)}.markdown .markItUpButton12 a{background-image:url(../images/markitup/code.png)}.markdown .preview-icon a{background-image:url(../images/markitup/preview.png)}.markdown .help a{background-image:url(../images/markitup/help.png)}.markItUp *{margin:0;padding:0;outline:0}.markItUp a:link,.markItUp a:visited{color:#000;text-decoration:none}.markItUpContainer{font:11px Verdana,Arial,Helvetica,sans-serif}.markItUpEditor{font:12px 'Courier New',Courier,monospace;padding:5px;height:320px;clear:both;overflow:auto}.markItUpPreviewFrame{overflow:auto;background-color:#FFF;width:99.9%;height:300px;margin:5px 0}.markItUpFooter{width:100%}.markItUpResizeHandle{overflow:hidden;width:22px;height:5px;margin-left:auto;margin-right:auto;background-image:url(../images/markitup/handle.png);cursor:n-resize}.markItUp .markItUpHeader ul{margin:0}.markItUpHeader ul li{list-style:none;position:relative;margin:3px}.markItUpHeader ul li:hover>ul{display:block}.markItUpHeader ul .markItUpDropMenu{background:url(../images/markitup/menu.png) 115% 50% no-repeat;margin-right:5px}.markItUpHeader ul .markItUpDropMenu li{margin-right:0}.markItUpHeader ul ul{display:none;position:absolute;top:18px;left:0;background:#FFF;border:1px solid #000}.markItUpHeader ul ul li{float:none;border-bottom:1px solid #000}.markItUpHeader ul ul .markItUpDropMenu{background:url(../images/markitup/submenu.png) 100% 50% no-repeat #FFF}.markItUpHeader ul .markItUpSeparator{margin:2px 10px 0;width:1px;height:16px;overflow:hidden;background-color:#CCC}.introjs-button,button{overflow:visible}.markItUpHeader ul ul .markItUpSeparator{width:auto;height:1px;margin:0}.markItUpHeader ul ul ul{position:absolute;top:-1px;left:150px}.markItUpHeader ul ul ul li{float:none}.markItUpHeader ul a{display:block;width:16px;height:16px;text-indent:-10000px;background-repeat:no-repeat;padding:3px;margin:0}.markItUpHeader ul ul a{display:block;text-indent:0;width:120px;padding:5px 5px 5px 25px;background-position:2px 50%}.markItUpHeader ul ul a:hover{color:#FFF;background-color:#000}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}mark{background:#ff0;color:#000}sub,sup{line-height:0;position:relative}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}optgroup{font-weight:700}/*! - * Pikaday - * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ - */.pika-single{display:block;position:relative;width:240px;padding:8px;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-title{position:relative;text-align:center}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;filter:alpha(opacity=0);opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.introjs-bullets ul,.introjs-button,.pika-select{display:inline-block}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-table{width:100%;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700;text-align:center}.pika-button{cursor:pointer;display:block;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.is-today .pika-button{color:#3af;font-weight:700}.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.pika-button:hover{color:#fff!important;background:#ff8000!important;box-shadow:none!important;border-radius:3px!important}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;position:absolute!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border-radius:4px;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0);filter:progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000);box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid #fff;position:absolute}.introjs-arrow.top,.introjs-arrow.top-middle,.introjs-arrow.top-right{top:-10px;border-color:transparent transparent #fff}.introjs-arrow.top-right{right:10px}.introjs-arrow.top-middle{left:50%;margin-left:-5px}.introjs-arrow.left,.introjs-arrow.right{top:10px}.introjs-arrow.right,.introjs-arrow.right-bottom{right:-10px;border-color:transparent transparent transparent #fff}.introjs-arrow.right-bottom{bottom:10px}.introjs-arrow.bottom{bottom:-10px;border-color:#fff transparent transparent}.introjs-arrow.left,.introjs-arrow.left-bottom{left:-10px;border-color:transparent #fff transparent transparent}.introjs-arrow.left-bottom{bottom:10px}.introjs-tooltip{position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{position:relative;margin:10px 0 0;text-decoration:none;font:11px/normal sans-serif;white-space:nowrap;cursor:pointer;outline:0;-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;zoom:1}.introjs-progress,.loader-active,.taskboard,.taskboard-inner,body.loading-project,h1 .date,h1 span{overflow:hidden}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-bullets{text-align:center}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0}.introjs-bullets ul li{list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{height:10px;margin:10px 0 5px;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{float:left;width:0;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.admin-membership header a,.header-with-actions .button,.kanban .kanban-settings,.save-wiki{float:right}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.master,fieldset{position:relative}body,html{width:100%;min-height:100%}*{box-sizing:border-box}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{border:0;font:inherit;font-size:100%;margin:0;padding:0;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}body{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.3}.icon{font-family:taiga}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body .master.ng-animate{-webkit-transition:0;transition:0}.drag-active{overflow-x:hidden}.master{height:100%;min-height:100%}.menu-secondary,.menu-tertiary,.wrapper{min-height:calc(100vh - 40px)}.centered{margin:1rem auto;max-width:1200px;min-width:960px;width:90%}.wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-secondary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary.filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0;-webkit-transition:all .2s linear;transition:all .2s linear;width:0}.menu-secondary.filters-bar.active{padding:2em 1em;-webkit-transition:all .2s linear;transition:all .2s linear;width:260px}.menu-secondary.filters-bar.active .filters-inner{opacity:1;-webkit-transition:all .4s ease-in;transition:all .4s ease-in}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;min-width:0;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions .action-buttons{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;margin-left:10px}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}h1 span,h2{font-size:1.6rem}h1{font-size:2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:1rem;text-transform:uppercase}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.ttf) format("truetype")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.ttf) format("truetype")}@font-face{font-family:OpenSans-Regular;src:url(../fonts/OpenSans-Regular.ttf) format("truetype")}@font-face{font-family:OpenSans-Semibold;src:url(../fonts/OpenSans-Semibold.ttf) format("truetype")}@font-face{font-family:taiga;font-style:normal;font-weight:400;src:url(../fonts/taiga.eot);src:url(../fonts/taiga.eot?) format("eot"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype")}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.5}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}.wysiwyg dl dt,strong{font-weight:700}h1 span{margin-right:.5rem;vertical-align:bottom}h1 span.green,h1 span:last-child{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#3f51b5}h1 .date{max-width:500px;color:#BDBDBD}h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.2;margin-bottom:1rem}p{line-height:1.5;margin:0 0 20px}p img{margin:0}em{font-style:italic}[class*=' icon-']::before,[class^=icon-]::before,[data-icon]::before{font-family:taiga!important;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal!important;font-variant:normal!important;font-weight:400!important;line-height:1;speak:none;text-transform:none!important}hr{border:solid #212121;border-width:1px 0 0;clear:both;height:0;margin:10px 0 30px}a,a:visited{text-decoration:none}a:hover,a:visited:hover{-webkit-transition:color .3s linear;transition:color .3s linear}[data-icon]::before{content:attr(data-icon)}.admin-contrib .help .alt-image,.admin-third-parties .help .alt-image,.wysiwyg dl dt{font-style:italic}.icon-bug::before{content:'a'}.icon-copy::before{content:'b'}.icon-minimize::before{content:'c'}.icon-maximize::before{content:'d'}.icon-comment::before{content:'e'}.icon-plus::before{content:'f'}.icon-attachments::before{content:'g'}.icon-edit::before{content:'h'}.icon-documents::before{content:'i'}.icon-delete::before{content:'j'}.icon-arrow-bottom::before{content:'k'}.icon-arrow-left::before{content:'l'}.icon-arrow-right::before{content:'m'}.icon-arrow-up::before{content:'n'}.icon-briefcase::before{content:'o'}.icon-caret-down::before{content:'p'}.icon-caret-up::before{content:'q'}.icon-check-square::before{content:'r'}.icon-notification-error::before{content:'s'}.icon-settings::before{content:'t'}.icon-document::before{content:'u'}.icon-warning::before{content:'v'}.icon-move::before{content:'w'}.icon-drag-v::before{content:'x'}.icon-filter::before{content:'y'}.icon-help::before{content:'z'}.icon-reload::before{content:'A'}.icon-writer::before{content:'B'}.icon-stats::before{content:'C'}.icon-floppy::before{content:'D'}.icon-warning-alt::before{content:'E'}.icon-video::before{content:'F'}.icon-bulk::before{content:'G'}.icon-vunfold::before{content:'H'}.icon-tasks::before{content:'I'}.icon-kanban::before{content:'J'}.icon-search::before{content:'K'}.icon-wiki::before{content:'L'}.icon-team::before{content:'M'}.icon-vfold::before{content:'N'}.icon-issues::before{content:'O'}.icon-iocaine::before{content:'P'}.icon-archive::before{content:'Q'}.icon-capslock::before{content:'R'}.icon-upload::before{content:'S'}.icon-github::before{content:'T'}.icon-timeline::before{content:'U'}.icon-scrum::before{content:'V'}.icon-project::before{content:'W'}.icon-heart::before{content:'X'}.icon-eye::before{content:'Y'}@-webkit-keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@-webkit-keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;flex:10}}@keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;-ms-flex:10;flex:10}}@-webkit-keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes blink{85%{opacity:1}100%{opacity:.6}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote cite,sup{font-size:.9rem}.spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32;max-height:2rem;max-width:2rem}blockquote,blockquote p{line-height:1.25rem}blockquote{margin:0 0 20px;padding:.5rem 1.25rem}blockquote cite{display:block}blockquote cite::before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}sup{vertical-align:super}.icon{vertical-align:middle}.clickable{cursor:pointer}.not-clickable{cursor:default}.draggable{cursor:move}svg{height:1rem;width:1rem}.pika-single{z-index:999999}.pika-single .pika-title{color:#424242}.pika-single .is-selected .pika-button{background:#3f51b5;border-radius:0!important;box-shadow:inset 0 1px 3px #3f51b5}.pika-single .is-today .pika-button{color:#3f51b5}.pika-single .is-today.is-selected button{color:#fff}.pika-single .pika-button:hover{background:#8c9eff!important;border-radius:0!important;box-shadow:inset 0 1px 3px #8c9eff!important}fieldset{border:0;margin:0;padding:0;width:100%}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{border:1px solid;margin:0;padding:8px;width:100%}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{-webkit-transition:border .3s linear;transition:border .3s linear}button,button:active,button:focus{border:0;outline:0}textarea{min-height:10rem}.checksley-error-list{margin-bottom:0}.checksley-error-list li{padding:.2rem}.icon-capslock{bottom:.6rem;color:#757575;display:none;position:absolute;right:1rem}.auth,.error-main{bottom:0;z-index:999;left:0}.admin-membership header:after{clear:both;content:'';display:table}.admin-membership .check input{height:40px;width:85px}.admin-roles p{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#BDBDBD}.auth .logo,.auth .tagline{color:#fff;text-align:center}.admin-attributes .admin-attributes-section{margin-bottom:2rem}.admin-attributes .admin-attributes-section .checksley-error-list{height:0;position:relative}.admin-attributes .admin-attributes-section .checksley-error-list li{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(244,67,54,.7);position:absolute;width:100%}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.project-values-title{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#EEE;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem;text-transform:uppercase}.project-values-title h2{margin:0}.auth .logo,.auth .tagline,.auth form{margin-bottom:1rem}.project-values-title h2 span{margin-left:.5rem;text-transform:none}.project-values-title a{display:inline-block}.auth{background:url(https://lh4.googleusercontent.com/-k7YewfrSQ_Q/VGdNZND0NBI/AAAAAAAAD1A/UDZBeSGR7iM/w1465-h824-no/Ultimate%2BMaterial%2BLollipop%2BCollection%2B-%2B480) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:fixed;right:0;top:0}.invitation-main .avatar,.invitation-main .invitation-container,.kanban{-webkit-box-orient:vertical;-webkit-box-direction:normal}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.auth .logo{font-size:3rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.auth .auth-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{text-align:center;width:100%}.auth .logo-svg svg{height:8rem;width:8rem}.kanban,.taskboard{height:calc(100vh - 40px)}.auth fieldset{margin-bottom:.5rem}.auth .login-text,.auth .register-text{text-align:center}.auth .login-text a:hover,.auth .register-text a:hover{color:#8c9eff}.auth .button{color:#fff;display:block;text-align:center}.auth a:hover{color:#fff}.moustache{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moustache;animation-name:moustache;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;fill:rgba(63,81,181,.9);stroke:#8c9eff;stroke-width:1px;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transition:.3s;transition:.3s}.moustache:hover{fill:rgba(140,158,255,.9);-webkit-transition:.3s;transition:.3s}.list-itemtype-project .icon path,.list-itemtype-project .list-itemtype-track-likers.active path,.list-itemtype-project .list-itemtype-track-watchers.active path,.list-itemtype-ticket .icon path,.list-itemtype-ticket .list-itemtype-track-likers.active path,.list-itemtype-ticket .list-itemtype-track-watchers.active path,.list-itemtype-timeline .icon path,.list-itemtype-timeline .list-itemtype-track-likers.active path,.list-itemtype-timeline .list-itemtype-track-watchers.active path,.list-itemtype-user .icon path,.list-itemtype-user .list-itemtype-track-likers.active path,.list-itemtype-user .list-itemtype-track-watchers.active path{fill:currentcolor}@-webkit-keyframes moustache{0%,30%,70%,90%{-webkit-transform:rotate(0);transform:rotate(0)}10%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}@keyframes moustache{0%,30%,70%,90%{-webkit-transform:rotate(0);transform:rotate(0)}10%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}.backlog-menu{background:#EEE;color:#212121;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .trans-button{color:#212121;display:inline-block;padding:.4rem 1.5rem}.backlog-menu .trans-button.active,.backlog-menu .trans-button:hover{background:#757575;color:#EEE}.backlog-menu .trans-button.active:hover{background:#c2c2c2}.backlog-menu .trans-button.move-to-sprint{display:none}.invitation-main,.invitation-main .invitation-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-menu .button-bulk{margin-left:.2rem}.invitation-main{background:url(https://lh6.googleusercontent.com/-2l_mJ5g6j4k/VGdNZCpaERI/AAAAAAAAD2o/zCx5Z3cYv6Y/w1465-h824-no/Ultimate%2BMaterial%2BLollipop%2BCollection%2B-%2B497) center center no-repeat;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-size:cover;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;z-index:999}.invitation-main .invitation-form .forgot-pass{font-size:.9rem}.invitation-main .avatar .person-name,.invitation-main .invitation-text,.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.invitation-main .invitation-container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar .person-name{color:#fff}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{color:#fff;text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{color:#BDBDBD;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#424242;-webkit-transition:color .3s linear;transition:color .3s linear}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header,.invitation-main .register-text{color:#fff}.invitation-main .login-form,.invitation-main .register-form{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .register-text a{color:#3f51b5}.invitation-main .button-auth{display:block}.invitation-main .button-blackish:hover{background:#3f51b5}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.issues .filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:260px}.issues .filters-inner{opacity:1;padding:1rem}.kanban{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px)}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.error-main,.taskboard-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.error-main{background:url(https://lh6.googleusercontent.com/-2l_mJ5g6j4k/VGdNZCpaERI/AAAAAAAAD2o/zCx5Z3cYv6Y/w1465-h824-no/Ultimate%2BMaterial%2BLollipop%2BCollection%2B-%2B497) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:fixed;right:0;top:0}.basic-table,.taskboard-inner{-webkit-box-orient:vertical;-webkit-box-direction:normal}.error-main .error-container{color:#fff;-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;text-align:center}.error-main .logo-svg{padding:0 32%;text-align:center;width:100%}.error-main h1{color:#fff;margin-bottom:3rem}.error-main a{color:#3f51b5}.error-main a:hover{color:#8c9eff}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.taskboard-inner{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%}.us-story-main-data .us-title,.us-story-main-data header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.team h2{margin:1rem 0}.team h2 span:last-child{color:#3f51b5}.us-story-main-data .us-title .block-desc-container,.us-story-main-data .us-title .us-related-task{font-size:.9rem}.us-story-main-data .us-title,.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{font-size:1.2rem}.us-story-main-data .us-title .us-title-text{font-size:1.6rem}.blocked-warning .blocked,.blocked-warning .icon,.issue-nav a{font-size:2rem}.blocked-warning .blocked{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.us-story-main-data .us-title,.us-story-main-data .us-title .us-number,.us-story-main-data .us-title .us-title-text{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.us-story-main-data .us-title .block-description-title,.us-story-main-data .us-title.blocked .unblock{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.card-placeholder p,.wiki .wiki-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32}.us-story-main-data{margin-bottom:1rem}.us-story-main-data header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.us-story-main-data .us-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#EEE;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:.5rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear}.us-story-main-data .us-title.blocked{background:#f44336;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:middle}.us-story-main-data .us-title.blocked .us-title-text,.us-story-main-data .us-title.blocked input{margin-bottom:.5rem}.us-story-main-data .us-title.blocked .us-name,.us-story-main-data .us-title.blocked .us-number,.us-story-main-data .us-title.blocked .us-related-task{color:#fff}.us-story-main-data .us-title.blocked a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title.blocked a:hover{color:#ff5252}.us-story-main-data .us-title.blocked .unblock{color:#fff;float:right}.us-story-main-data .us-title.blocked .unblock:hover{color:#ff5252;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title p{margin-bottom:0}.us-story-main-data .us-title .us-edit-name-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.us-story-main-data .us-title .edit-subject{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.us-story-main-data .us-title input{background:#fff;-webkit-box-flex:9;-webkit-flex-grow:9;-ms-flex-positive:9;flex-grow:9}.us-story-main-data .us-title .save-container{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.us-story-main-data .us-title .us-title-text{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-bottom:0;max-width:92%}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{max-height:1.5rem;max-width:1.5rem}.us-story-main-data .us-title .us-title-text:hover .icon-edit{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.us-story-main-data .us-title .us-number{color:#BDBDBD;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;line-height:2.2rem;margin-right:.5rem}.us-story-main-data .us-title .us-name{color:#757575;display:inline-block;line-height:2.2rem;padding-right:1rem;width:100%}.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{color:#BDBDBD;margin-left:.5rem}.us-story-main-data .us-title .icon-edit{opacity:0}.us-story-main-data .us-title .us-related-task{color:#BDBDBD;margin-top:.5rem}.us-story-main-data .us-title .us-related-task a{border-left:1px solid #BDBDBD;padding:0 .2rem}.us-story-main-data .us-title .us-related-task a:hover{color:#3f51b5}.us-story-main-data .us-title .us-related-task a:first-child{border:0}.us-story-main-data .us-title .block-description-title{color:#fff;margin-right:.5rem}.us-story-main-data .us-title .block-description{color:#fff;display:inline-block;margin-right:5rem}.basic-table,.subheader{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.blocked-warning{margin-bottom:1rem}.blocked-warning .blocked{color:#f44336;line-height:2.5rem;margin-bottom:.5rem}.blocked-warning .icon{vertical-align:middle}.blocked-warning .block-description{color:#424242;margin:0}.duty-content .edit-description,.wiki-content{margin-bottom:2rem}.issue-nav{position:absolute;right:1rem;top:1rem}.subheader{display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:1280px){.subheader{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}}.subheader .ticket-created-by{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-basis:250px;-ms-flex-preferred-size:250px;flex-basis:250px}@media (max-width:1280px){.subheader .ticket-created-by{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}}.subheader .tags-block{-webkit-box-flex:3;-webkit-flex:3;-ms-flex:3;flex:3}@media (max-width:1280px){.subheader .tags-block{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}}.duty-content{position:relative}.duty-content .in-progress{cursor:progress}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#EEE;cursor:pointer}.duty-content:hover .view-description .no-description{color:#424242}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#BDBDBD}.duty-content textarea{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-content .edit{color:#424242}.duty-content .view-description .edit{background:#EEE;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .save{top:.4rem}.duty-content .edit-description .edit{position:absolute;right:2.5rem;top:.4rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wiki .remove{font-size:.9rem;color:#BDBDBD}.wiki .wiki-title{font-size:1.6rem}.wiki .remove:hover span{color:#424242;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove:hover .icon{color:#f44336;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove .icon{color:#BDBDBD;margin-right:.2rem}.wiki-content{position:relative}.wiki-content .in-progress{cursor:progress}.wiki-content.editable:hover .wysiwyg{background:#EEE;cursor:pointer}.wiki-content .view-wiki-content:hover .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .view-wiki-content .edit{background:#EEE;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .icon:hover{color:#424242;opacity:.3;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .preview-icon{position:absolute;right:3.5rem}.wiki-content .edit-wiki-content .action-container{position:absolute;right:1rem;top:.3rem}.wiki-content .edit-wiki-content .edit{position:absolute;right:3.5rem;top:.4rem}.wiki-content .preview{padding-top:1.8rem}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row,.card-placeholder .placeholder-avatar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.basic-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e4e4;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}.basic-table .row .width-1{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:4;-webkit-flex-grow:4;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:5;-webkit-flex-grow:5;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:7;-webkit-flex-grow:7;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.beta{left:0;position:absolute;top:0;z-index:9999}.button,.button-auth,.button-blackish,.button-bulk,.button-gray,.button-green,.button-red,.trans-button,a.button-gray,a.button-green{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:0 0;border:0;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;padding:.4rem 2rem;text-align:center;text-transform:uppercase;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:middle}.trans-button{font-size:1rem}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button:hover,.trans-button:hover{color:#fff;-webkit-transition:all .2s linear;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.trans-button span{-webkit-animation:loading .5s linear;animation:loading .5s linear}.admin-project-export-result .spin img,.loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.button span,.button-auth span,.button-blackish span,.button-bulk span,.button-gray span,.button-green span,.button-red span,.trans-button span{color:#fff}.button .icon,.button-auth .icon,.button-blackish .icon,.button-bulk .icon,.button-gray .icon,.button-green .icon,.button-red .icon,.trans-button .icon{color:#fff;margin-right:.3rem}.trans-button .icon,.trans-button span{color:#212121;-webkit-transition:color .2s linear;transition:color .2s linear}.trans-button.active .icon,.trans-button.active span,.trans-button:hover .icon,.trans-button:hover span{color:#3f51b5}.trans-button:visited{color:#212121}.submit-button{width:100%}.button-green,a.button-green{background:#3f51b5}.button-green.active,.button-green:hover,a.button-green.active,a.button-green:hover{background:#8c9eff;color:#fff}.button-gray,a.button-gray{background:#757575}.button-gray.active,.button-gray:hover,a.button-gray.active,a.button-gray:hover{background:#8c9eff;color:#fff}.button-blackish{background:#212121;color:#EEE}.button-blackish:hover{background:#212121;color:#fff}.button-red{background:#ff5252}.button-red:hover{background:#f44336;color:#fff}.button-red .icon{color:#fff}.button-block{background:#fff;color:#f44336}.button-block:hover{background:#ff5252;color:#fff}.button-bulk{background:#3f51b5;padding:.35rem .5rem}.button-bulk .icon{margin-right:0}.button-bulk:hover{background:#8c9eff}.button-auth{background:#424242}.button-auth .icon,.button-auth img{font-size:1.2rem;color:#fff;margin-right:.5rem}.button-auth:hover{background:#000}.card-placeholder{background:#e9e9e9;border:1px dashed #dadada;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:flex}.card-placeholder .image{background:#dadada;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.card-placeholder .line{background:#dadada;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{color:#757575;margin:0}.check{background-color:#d5d5d5;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:500px;left:-10px;opacity:0;position:absolute;top:-10px;width:500px;z-index:999}.check input+div{background-color:#757575;height:25px;-webkit-transition:all .2s linear;transition:all .2s linear;width:50%}.check input~.check-text{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff;position:absolute;top:.2rem}.check input~.check-yes{opacity:0;right:.5rem}.check input~.check-no{left:.5rem;opacity:.6}.check input:checked+div{background-color:#8c9eff;margin-left:50%;-webkit-transition:all .2s linear;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.check input:disabled{cursor:auto}.check input:disabled+div{background-color:#BDBDBD}.ticket-created-by{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}@media (max-width:1280px){.ticket-created-by{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:.5rem}}.ticket-created-by .user-avatar{-webkit-flex-basis:2rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-left:.5rem}.ticket-created-by .user-avatar img{width:100%}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block;text-align:right}.ticket-estimation .points-per-role,.wysiwyg-help{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}@media (max-width:1280px){.ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ticket-created-by .created-by{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{text-align:left}}.ticket-created-by .created-by .created-title{color:#3f51b5}.ticket-created-by .created-by .created-date{margin-left:.5rem}@media (max-width:1280px){.ticket-created-by .created-by .created-date{margin-left:0}}.drag-drop-help,.help-button,.help-markdown{font-size:.75rem}.wysiwyg-help{background:#EEE;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:-.5rem;padding:.25rem .5rem}.drag-drop-help{color:#757575}.help-button:hover span,.help-markdown:hover span{-webkit-transition:color .2s linear;transition:color .2s linear}.help-button:hover .icon,.help-markdown:hover .icon{color:#8c9eff;-webkit-transition:color .2s linear;transition:color .2s linear}.help-button .icon,.help-markdown .icon{margin-right:.2rem}.ticket-estimation .popover,.ticket-estimation .popover a,.ticket-estimation .popover.fix,.ticket-estimation .popover.fix a{font-size:.9rem}.ticket-estimation .popover,.ticket-estimation .popover.fix,.ticket-estimation .ticket-role-points .points,.ticket-estimation .ticket-role-points .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .points-per-role{display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.empty-burndown,.loading-bar{-webkit-box-orient:horizontal}.ticket-estimation .ticket-role-points{background:rgba(189,189,189,.2);color:#BDBDBD;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.1rem;min-height:2rem;padding:.5rem 1rem;position:relative;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .ticket-role-points.clickable.active,.ticket-estimation .ticket-role-points.clickable:hover{background:rgba(140,158,255,.9);color:#EEE}.ticket-estimation .ticket-role-points.clickable.active .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable.active .points,.ticket-estimation .ticket-role-points.clickable.active .role,.ticket-estimation .ticket-role-points.clickable:hover .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable:hover .points,.ticket-estimation .ticket-role-points.clickable:hover .role{color:#EEE}.ticket-estimation .ticket-role-points:last-child{background:rgba(26,35,126,.5);border-bottom:0;color:#EEE}.ticket-estimation .ticket-role-points:last-child .icon-arrow-bottom,.ticket-estimation .ticket-role-points:last-child .points,.ticket-estimation .ticket-role-points:last-child .role{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#EEE}.ticket-estimation .ticket-role-points .icon-arrow-bottom{color:#BDBDBD;margin-left:.25rem;vertical-align:middle}.ticket-estimation .ticket-role-points .points{color:#424242}.ticket-estimation .popover{background:#212121;color:#fff;display:none;left:.5rem;list-style-type:none;margin:0;padding:10px;position:absolute;top:100%;width:200px;z-index:99}.ticket-estimation .popover a{border-bottom:1px solid #424242;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#212121;content:'';height:10px;left:10px;position:absolute;top:-5px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:10px}.ticket-estimation .popover li{display:inline-block;width:23%}.ticket-estimation .popover a{display:block;text-align:center}.ticket-estimation .popover a.active,.ticket-estimation .popover a:hover{background:#8c9eff;color:#fff}.ticket-estimation .popover.fix{background:#212121;color:#fff;display:none;left:-160px;list-style-type:none;margin:0;padding:10px;position:absolute;top:100%;width:200px;z-index:99}.ticket-estimation .popover.fix a{border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.ticket-estimation .popover.fix a:last-child{border:0}.ticket-estimation .popover.fix a:hover{color:#8c9eff;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#212121;content:'';height:10px;left:90%;position:absolute;top:-5px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:10px}.single-filter{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;cursor:pointer;display:block;margin-bottom:.5rem;opacity:.5;position:relative}.single-filter:after{clear:both;content:'';display:table}.single-filter.active,.single-filter.selected,.single-filter:hover{color:#424242;opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{background:#d5d5d5;display:block;width:100%}.single-filter .number{background:#bbb;position:absolute;right:0;top:0}.single-filter .icon-delete{color:#424242;position:absolute;right:.5rem;top:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.single-filter .icon-delete:hover{color:#f44336;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task .avatar a,.kanban-task .task-text,.kanban-task-maximized .task-archived p,.kanban-task-maximized .task-points,.kanban-task-minimized .task-archived{font-size:.9rem}.kanban-task-minimized .icon-drag-h{font-size:1rem}.kanban-task .icon-drag-h,.kanban-task .icon-edit{font-size:1.2rem}.kanban-task .task-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.kanban-task{background:#fff8e4;border:1px solid #f1e8cd;box-shadow:none;cursor:move;margin:.2rem;position:relative}.kanban-task:last-child{margin-bottom:0}.kanban-task:hover .icon-drag-h,.kanban-task:hover .icon-edit{color:#cfc29b;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.kanban-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.kanban-task.ui-sortable-placeholder{background:#424242}.kanban-task.blocked{background:#f44336;border:1px solid #ea1c0d;color:#fff}.kanban-task.blocked a,.kanban-task.blocked span{color:#fff}.kanban-task.card-placeholder{background:#e9e9e9;border:3px dashed #dadada;cursor:default}.kanban-task .kanban-tagline{border-color:#f1e8cd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.6rem}.kanban-task .kanban-tag{border-top:.3rem solid #f1e8cd;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.kanban-task .kanban-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.kanban-task .avatar-wrapper{-webkit-flex-basis:55px;-ms-flex-preferred-size:55px;flex-basis:55px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:55px}.kanban-task .avatar-wrapper img{width:100%}.kanban-task .avatar a{text-align:center}.kanban-task .avatar img{margin:0 auto}.kanban-task .avatar img:hover{border:2px solid #3f51b5;-webkit-transition:border .3s linear;transition:border .3s linear}.kanban-task .task-text{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 .5rem 0 .8rem}.kanban-task .task-assigned{color:#cfc29b;display:block}.kanban-task .task-num{color:#424242;margin-right:.3rem}.kanban-task .loading{bottom:.5rem;position:absolute}.kanban-task .icon-drag-h,.kanban-task .icon-edit{color:#f1e8cd;opacity:0;position:absolute;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.kanban-task .icon-drag-h:hover,.kanban-task .icon-edit:hover{color:#e0cd91;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task-maximized .task-archived{background:#e1e1e1;padding:.5rem;text-align:left;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived:hover{background:#dadada;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-maximized .task-archived span{color:#BDBDBD}.kanban-task-maximized .task-archived p{color:#BDBDBD;margin:0}.kanban-task-maximized .task-archived p:last-child{color:#757575;margin:.5rem 0;text-align:center}.kanban-task-maximized .icon-edit,.kanban-task-maximized .loading{bottom:.2rem;right:.5rem}.kanban-task-maximized .icon-drag-h{font-size:2rem;bottom:.2rem;cursor:move;right:45%}.kanban-task-maximized .task-points{color:#e0cd91;margin:0}.kanban-task-maximized .task-points span{display:inline-block}.kanban-task-maximized .task-points span:first-child{padding-right:.2rem}.kanban-task-maximized .task-points .points-text{text-transform:lowercase}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{line-height:1.4;text-transform:none}.kanban-task-maximized .kanban-tag{border-top:.3rem solid}.kanban-task-minimized .kanban-task-inner{padding:0 .3rem}.kanban-task-minimized .task-archived{background:#e1e1e1;padding:.3rem;text-align:left}.kanban-task-minimized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-minimized .task-archived span{color:#BDBDBD}.kanban-task-minimized .task-archived .task-name{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kanban-task-minimized .task-archived p{color:#BDBDBD;margin:0}.kanban-task-minimized .task-archived p:last-child{display:none}.kanban-task-minimized .task-num{vertical-align:top}.kanban-task-minimized .task-name{display:inline-block;overflow:hidden;width:135px}.kanban-task-minimized .task-points{display:none}.kanban-task-minimized .icon-drag-h,.kanban-task-minimized .icon-edit{top:1.4rem}.kanban-task-minimized .icon-edit{bottom:.2rem;right:1rem}.kanban-task-minimized .icon-drag-h{cursor:move;right:.1rem;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.kanban-task-minimized .kanban-tag{border-top:.2rem solid}.level{background-color:#BDBDBD;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project .list-itemtype-track,.list-itemtype-ticket .list-itemtype-track,.list-itemtype-timeline .list-itemtype-track,.list-itemtype-user .extra-info,.list-itemtype-user .list-itemtype-track{font-size:.9rem}.list-itemtype-ticket h2{font-size:1rem}.list-itemtype-project h2,.list-itemtype-user h2,.loader p{font-size:1.2rem}.list-itemtype-project p,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.list-itemtype-project{border-bottom:1px solid #EEE;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{color:#BDBDBD;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-project .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-project .list-itemtype-track-likers,.list-itemtype-project .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-project .icon svg{height:1rem;width:1rem}.list-itemtype-project h2,.list-itemtype-project p{margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-project .list-itemtype-avatar img{width:100%}.list-itemtype-project .list-itemtype-project-data-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;width:3rem}.list-itemtype-project .list-itemtype-project-members,.list-itemtype-project .list-itemtype-project-tags{-webkit-align-self:flex-end;-ms-flex-item-align:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-project .list-itemtype-project-image img{width:100%}.list-itemtype-project .list-itemtype-project-members{align-self:flex-end;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-wrap:wrap-reverse;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse;margin-top:1rem}.list-itemtype-project .list-itemtype-project-members img{border-radius:.1rem;margin-right:.3rem;width:2rem}.list-itemtype-project .list-itemtype-project-tags{align-self:flex-end;display:flex;-webkit-box-flex:3;-webkit-flex:3;-ms-flex:3;flex:3;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:.5rem}.list-itemtype-project .tag{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket h2,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user h2,.list-itemtype-user p{margin-bottom:0}.list-itemtype-ticket,.list-itemtype-timeline,.list-itemtype-user{border-bottom:1px solid #EEE;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track{color:#BDBDBD;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-ticket .list-itemtype-track-likers,.list-itemtype-ticket .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user,.list-itemtype-user .list-itemtype-track{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-ticket .icon svg{height:1rem;width:1rem}.list-itemtype-ticket .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-ticket .list-itemtype-avatar img{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-project{color:#BDBDBD}.list-itemtype-ticket .list-itemtype-ticket-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-id{color:#BDBDBD;margin-right:.3rem}.list-itemtype-ticket .ticket-blocked{color:#f44336;margin-left:.3rem}.list-itemtype-user{display:flex}.list-itemtype-user .list-itemtype-track{color:#BDBDBD;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-user .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-user .list-itemtype-track-likers,.list-itemtype-user .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-user .icon svg{height:1rem;width:1rem}.list-itemtype-user .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .list-itemtype-avatar img{width:100%}.list-itemtype-user .extra-info{margin-top:.25rem}.list-itemtype-timeline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track{color:#BDBDBD;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-timeline .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-timeline .list-itemtype-track-likers,.list-itemtype-timeline .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track-likers .icon,.list-itemtype-timeline .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-timeline .list-itemtype-track-likers.active,.list-itemtype-timeline .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-timeline .icon svg{height:1rem;width:1rem}.list-itemtype-timeline .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-timeline h2{margin-bottom:0}.admin-menu li,.empty-backlog .title,.empty-burndown .title,.sprints-empty .title,.taskboard-table-header .task-colum-name,.ticket-header .detail-status-inner,.ticket-header .ticket-title,.wysiwyg h1,.wysiwyg h2,.wysiwyg h3,tg-project-menu{text-transform:uppercase}.list-itemtype-timeline .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.loader p{color:#757575;text-align:center}.loader{background-color:#fff;bottom:0;display:none;height:100%;left:0;opacity:0;position:fixed;right:0;top:0;z-index:-100}.loader .container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar,.notification-light{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.loading-bar{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:loadBar;animation-name:loadBar;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;background:#757575;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{-webkit-animation-delay:0s;animation-delay:0s;background:#ffc107}.loading-bar .item-1{-webkit-animation-delay:1s;animation-delay:1s;background:#009688}.loading-bar .item-2{-webkit-animation-delay:2s;animation-delay:2s;background:#e91e63}.loading-bar .item-3{-webkit-animation-delay:3s;animation-delay:3s;background:#9c27b0}.loading-bar .item-4{-webkit-animation-delay:4s;animation-delay:4s;background:#cddc39}.loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;-webkit-transform-origin:32 32;transform-origin:32 32}.markItUpHeader ul{background:#EEE;padding:.3rem}.markItUpHeader ul li{display:inline-block;float:none}.markItUpHeader ul li a{opacity:.8}.markItUpHeader ul li a:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.markItUpHeader ul .preview-icon{position:absolute;right:2.5rem}.markItUpContainer{padding:0}.markdown{position:relative}.preview .actions{background:#EEE;margin-top:.5rem;min-height:2rem;padding:.3rem}.notification-light p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.notification-message-success .warning{font-size:1.2rem;color:#fff;line-height:1.2}.notification-message-error .warning{font-size:2rem;color:#fff;line-height:2.4rem}.notification-message-error .icon-notification-error{font-size:3rem;display:inline;vertical-align:sub}.notification-message-error .warning,.notification-message-success .warning{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.notification-message-success{background:rgba(140,158,255,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);opacity:1;right:-370px;top:2%;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{-webkit-animation:animSlide 2s linear both;animation:animSlide 2s linear both;opacity:1}.notification-message-success p{margin:0}@-webkit-keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}.notification-message-error{background:rgba(244,67,54,.9);top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error.inactive{-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-light p,.notification-message-error .text p{margin:0}.notification-message-error .icon-delete{color:#fff;position:absolute;right:1rem;top:1rem}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(189,189,189,.95);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;opacity:0;padding:1rem;position:absolute;top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s;width:100%;z-index:99999}.paginator ul,.summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.notification-light.inactive{opacity:0;-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s}.notification-light.active{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s;transition:all .6s}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{margin-right:1rem;width:2rem}.notification-light .close path{fill:#fff}.notification-message-light-error{background:rgba(244,67,54,.8)}.paginator{margin:2rem 0}.paginator ul{display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator .dots,.paginator a{background:#BDBDBD;color:#fff;padding:.5rem 1rem;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator a:hover{background:#212121;color:#fff;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator .active span{background:#8c9eff}.paginator .dots{background:0 0;color:#BDBDBD}.v-pagination-list{overflow:hidden}.v-pagination-next,.v-pagination-previous{background-color:#757575;color:#EEE;display:block;padding:.1rem 0;text-align:center;visibility:hidden;width:100%}.select-color,.select-color:after{background:#212121;position:absolute}.v-pagination-next:hover,.v-pagination-previous:hover{background-color:#212121;-webkit-transition:background .3s linear;transition:background .3s linear}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.private{display:inline-block;margin-left:.5rem;width:.5rem}.private svg{width:1rem;height:1rem}.private path{fill:#BDBDBD;-webkit-transition:fill .3s linear;transition:fill .3s linear}.select-color,.select-color a{font-size:.9rem}.select-color input{font-size:1rem}.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;border-radius:0 10px 10px 0;padding:15px}.select-color a{border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.select-color a:last-child{border:0}.select-color a:hover{color:#8c9eff;-webkit-transition:color .3s linear;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:15px}.select-color li{float:left;margin:0 .5rem .5rem 0}.select-color li:nth-child(7n){margin-right:0}.select-color li:nth-last-child(-n+7){margin-bottom:0}.select-color .color{background-color:#BDBDBD;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background-color:#EEE;width:243px}.select-color input::-webkit-input-placeholder{color:#757575}.select-color input::-moz-placeholder{color:#757575}.select-color input:-moz-placeholder{color:#757575}.select-color input:-ms-input-placeholder{color:#757575}.select-color .selected-color{background:#BDBDBD;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.settings-nav .active{background:#fff}.summary .description{font-size:.9rem}.empty-burndown .title{font-size:1.2rem}.empty-burndown,.empty-burndown .title,.summary .description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.empty-burndown a,.summary .number{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.summary{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;padding:1em}.summary .summary-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .data .number{color:#8c9eff}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{line-height:1}.summary .stats{cursor:pointer;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .color-line,.summary .stats:hover .graph{fill:#8c9eff;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats.active .graph,.summary .stats.active svg,.summary .stats:hover svg{fill:#3f51b5}.summary .stats.active .color-line,.summary .stats.active .white-line{display:none}.summary .stats svg{fill:#000;height:100%;max-height:2rem;max-width:2rem;-webkit-transition:all .2s;transition:all .2s;width:100%}.summary .stats .color-line,.summary .stats .graph{fill:#8a8a8a;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats .white-line{fill:#424242}.summary .stats .color-line,.summary .stats .white-line{display:block}.summary-progress-bar{background:#fff;height:30px;margin-bottom:0;margin-right:10px;padding:3px;position:relative;width:15%}.summary-progress-bar .current-progress{background:#8c9eff;height:24px}.summary-progress-bar .defined-points{background:#ff5252;height:24px;position:absolute;width:calc(100% - 6px)}.summary-progress-bar .project-points-progress{background:#fff;height:24px;position:absolute}.summary-progress-bar .closed-points-progress{background:#8c9eff;height:24px;position:absolute}.large-summary{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.large-summary .large-summary-wrapper{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.empty-burndown,.taskboard-task .taskboard-tagline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.large-summary .summary-progress-bar{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.empty-burndown,.upvote-btn{-webkit-align-content:center;-ms-flex-line-pack:center}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats-divider{margin-right:2rem}.large-summary .icon{font-size:1.4rem;margin-right:.4rem}.large-summary .icon.icon-stats{color:#3f51b5;float:right;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#8c9eff;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#8c9eff}.large-summary .icon.icon-stats.active:hover{color:#3f51b5;-webkit-transition:color .3s linear;transition:color .3s linear}.empty-burndown{align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(26,35,126,.15);display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{-webkit-flex-basis:5rem;-ms-flex-preferred-size:5rem;flex-basis:5rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;width:5rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.empty-burndown .title{color:#1a237e;margin:0}.empty-burndown path{fill:#1a237e}.empty-burndown a{-webkit-animation:blink 2s infinite;animation:blink 2s infinite}.graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.wysiwyg,.wysiwyg .codehilite{overflow:auto}.graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;-webkit-transition:none;transition:none}.tag,.tags-block .add-tag-text,.tags-block .tag{font-size:.9rem}.tags-block .icon-plus{font-size:1.2rem}.tag{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:#EEE;border-radius:0 5px 5px 0;color:#424242;display:inline-block;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.tag .icon-delete{color:#BDBDBD;margin-left:1rem}.tag .icon-delete:hover{color:#f44336}.ui-autocomplete{background:#fff;border:1px solid #BDBDBD;z-index:99910}.ui-autocomplete .ui-state-focus{background:#8c9eff}.ui-autocomplete li{cursor:pointer}.ui-helper-hidden-accessible{display:none}.tags-block .tags-container{display:inline-block}.tags-block input{margin-right:.25rem;padding:.4rem;width:14rem}.tags-block input+.icon-floppy{margin-left:.5rem}.tags-block .tag{margin:0 .5rem .5rem 0;padding:.5rem}.tags-block .add-tag{color:#BDBDBD}.tags-block .add-tag:hover{color:#8c9eff}.taskboard-task .task-assigned,.taskboard-task .taskboard-text,.taskboard-task .taskboard-user-avatar a{font-size:.9rem}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit,.taskboard-task .icon-iocaine{font-size:1.2rem}.taskboard-task .task-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name,.watch-options a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.taskboard-task{background:#fff8e4;border:1px solid #f1e8cd;box-shadow:none;cursor:move;margin:.2rem;position:relative}.taskboard-task:hover .icon-drag-h,.taskboard-task:hover .icon-edit{color:#cfc29b;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.taskboard-task.ui-sortable-placeholder{background:#424242}.taskboard-task .blocked{background:#f44336;border:1px solid #ea1c0d;color:#fff}.taskboard-task .blocked a,.taskboard-task .blocked span,.taskboard-task .blocked:hover .icon-drag-h,.taskboard-task .blocked:hover .icon-edit{color:#fff}.taskboard-task.card-placeholder{background:#e9e9e9;border:3px dashed #dadada;cursor:default}.taskboard-task .taskboard-tagline{border-color:#f1e8cd;display:flex;height:.6rem}.taskboard-task .taskboard-tag{border-top:.3rem solid #f1e8cd;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.taskboard-task .taskboard-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.taskboard-task .taskboard-user-avatar{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:55px}.taskboard-task .taskboard-user-avatar a{display:block;text-align:center}.taskboard-task .taskboard-user-avatar img{margin:0 auto}.taskboard-task .taskboard-user-avatar img:hover{border:2px solid #3f51b5;-webkit-transition:border .3s linear;transition:border .3s linear}.taskboard-task .iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.taskboard-task .icon-iocaine{background:#000;border-radius:5px;color:#fff;left:.2rem;padding:.1rem;position:absolute;top:1rem}.taskboard-task .task-assigned{color:#cfc29b;display:block}.taskboard-task .task-assigned:hover{color:#3f51b5}.taskboard-task .task-num{color:#424242;margin-right:.5em}.taskboard-task .taskboard-text{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;padding:0 .5rem 0 1rem;word-wrap:break-word}.taskboard-task .icon{-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task .loading{bottom:.5rem;position:absolute}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit{bottom:.5rem;color:#f1e8cd;opacity:0;position:absolute}.taskboard-task .icon-drag-h:hover,.taskboard-task .icon-edit:hover{color:#cfc29b}.taskboard-task .icon-edit,.taskboard-task .loading{right:1rem}.taskboard-task .icon-drag-h{font-size:2rem;cursor:move;right:45%}.task-drag{box-shadow:1px 1px 15px 6px rgba(0,0,0,.1)}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;position:relative}.track-button .track-inner{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;background:#EEE;border-radius:4px 0 0 4px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;margin-right:.1rem;min-width:140px}.track-button .track-button-counter,.watch-options a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.track-button .track-inner:hover{background:#e1e1e1;-webkit-transition:background .3s;transition:background .3s}.track-button .track-inner span{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.track-button .track-inner .icon-arrow-up{margin-left:auto;padding:0 .5rem;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.track-button:hover{color:#212121}.track-button.active .track-inner{background:rgba(140,158,255,.2)}.track-button.active .track-icon path{fill:#3f51b5}.track-button.watch-container{margin-right:1rem;position:relative}.track-button .track-icon{padding:.3rem .6rem .3rem .75rem}.track-button .track-icon svg{height:1.1rem;position:relative;top:2px;width:1.1rem}.track-button .track-icon path{fill:#424242}.track-button .track-button-counter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #EEE;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;min-width:2rem}.like-button.active.is-hover .track-inner,.watch-button.active.is-hover .track-inner{background:#f44336;color:#EEE;-webkit-transition:background .3s;transition:background .3s}.like-button.active.is-hover path,.watch-button.active.is-hover path{fill:#ff5252}.watch-options{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;background:rgba(0,0,0,.9);border-radius:4px;margin:2.5rem 0 0;min-width:300px;padding:1rem;position:absolute;right:0;top:0;z-index:99}.watch-options.hidden{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse}.watch-options li{margin:0}.assigned-to-list,.ticket-watchers{margin-top:1rem}.watch-options li:last-child a{border:0}.watch-options a{border-bottom:1px solid rgba(189,189,189,.3);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.assigned-to-list .user-list-single,.upvote-btn{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.watch-options a.active{color:#8c9eff}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check path{fill:#8c9eff}.upvote-btn{align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#EEE;color:#BDBDBD;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e1e1e1;color:#1a237e;-webkit-transition:background .3s;transition:background .3s}.upvote-btn a:hover path{fill:#1a237e}.upvote-btn a.active{background:rgba(140,158,255,.2);color:#3f51b5;-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.active path{fill:#3f51b5}.upvote-btn a.is-hover{background:#f44336;color:#EEE}.upvote-btn a.is-hover svg{-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.is-hover path{fill:#ff5252}.upvote-btn svg{height:1rem;width:1rem}.assigned-to-list .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.upvote-btn span{display:block}.upvote-btn path{fill:#BDBDBD}.assigned-to-list .user-list-single{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #EEE;display:flex;padding:.25rem 0;vertical-align:middle}.assigned-to-list .user-list-single:last-child{border:0}.assigned-to-list .user-list-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-name{color:#424242;margin-left:.5rem}.assigned-to-list .user-list-single.selected,.assigned-to-list .user-list-single:hover{background:#fff;cursor:pointer}.assigned-to-list .user-list-single:hover{-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{background:#fff;cursor:pointer;margin-bottom:1rem;position:relative;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.1s;transition-delay:.1s}.assigned-to-list .user-list-single.is-active .icon-delete{opacity:1;position:absolute;right:1rem;top:1.5rem;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .user-list-single{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #EEE;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.25rem 0;vertical-align:middle}.ticket-watchers .user-list-single:last-child{border:0}.ticket-watchers .user-list-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-watchers .user-list-name{color:#424242;margin-left:.5rem;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.ticket-watchers .user-list-single:hover .icon-delete{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .icon-delete{opacity:0;position:absolute;right:.5rem;top:0;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.ticket-watchers .icon-delete:hover{color:#f44336;-webkit-transition:color .3s ease-in;transition:color .3s ease-in}.wysiwyg code,.wysiwyg pre{font-size:.9rem}.wysiwyg h2{font-size:1.2rem}.wysiwyg h1{font-size:2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.wysiwyg h2,.wysiwyg h3{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.wysiwyg{line-height:1.4rem;margin-bottom:2rem;padding:1rem}.wysiwyg h1{line-height:2.5rem}.wysiwyg h2{margin-bottom:.5rem}.wysiwyg ol,.wysiwyg ul{list-style-position:outside;margin-left:1rem}.wysiwyg ul{list-style-type:disc}.wysiwyg dl dt{font-size:1em;margin-top:16px;padding:0}.wysiwyg dl dd{margin-bottom:16px;padding:0 16px}.wysiwyg p,.wysiwyg table{margin-bottom:1rem}.wysiwyg a{color:#3f51b5}.wysiwyg a:hover{color:#8c9eff}.wysiwyg code,.wysiwyg pre{background:#5c5c5c;color:#EEE;direction:ltr;font-family:'courier new',monospace;margin-bottom:1rem;overflow:auto;unicode-bidi:embed;white-space:pre}.admin-functionalities .functionality .title,.admin-membership-table .avatar .name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-membership-table .avatar figcaption span,.admin-submenu ul a span,.admin-submenu-roles .single-role,.admin-webhooks .webhook-url span,.custom-fields-table .custom-description{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wysiwyg pre{line-height:1.4rem;padding:.5rem}.wysiwyg table{border:1px solid #BDBDBD}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#BDBDBD 1px solid}.wysiwyg th{border-right:#BDBDBD 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#BDBDBD 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.wysiwyg textarea{background:#fff;max-height:none}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{color:#b8b8b8;margin-bottom:2rem}.admin-common .total{font-size:1.2rem;background-color:#f5f5f5;color:#444;padding:.3rem 1rem}.admin-common .total:hover .edit-value{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-field-options{margin-bottom:1rem;text-align:right}.custom-fields-table{margin-bottom:2em}.custom-fields-table .row{border-bottom:0;padding:.5rem 0}.custom-fields-table .table-header{border-bottom:3px solid #f5f5f5}.custom-fields-table .table-header .custom-description span,.custom-fields-table .table-header .custom-name span{padding-left:1.1rem}.custom-fields-table .table-body form:last-child .row{border:0}.custom-fields-table .table-body .row:hover{background:rgba(157,206,10,.05);cursor:move;-webkit-transition:background .2s linear;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag-v{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-fields-table .table-body form.row:hover{background:0 0;cursor:default}.custom-fields-table .table-body .custom-description{color:#b8b8b8}.custom-fields-table .single-custom-field{border-bottom:1px solid #f5f5f5;color:#555}.custom-fields-table .icon-drag-v{color:#b8b8b8;opacity:0;padding:0 .1rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .icon-drag-v:hover{color:#555;cursor:move;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{color:#555;margin-right:.5rem}.custom-fields-table .custom-name{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{max-width:100%;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.custom-fields-table .custom-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.admin-functionalities .functionality{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.3rem;margin-right:.3rem;opacity:.5;padding:1rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:top;width:32%}.admin-functionalities .functionality.active{background-color:rgba(114,161,20,.3);opacity:1}.admin-functionalities .functionality .icon{font-size:3rem;-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;margin:0 auto;min-width:60px}.admin-functionalities .functionality .desc{text-align:center;width:100%}.admin-functionalities .functionality .activate-input{display:none}.admin-functionalities .functionality .activate-input+label{color:#fff;cursor:pointer;display:block;text-align:center}.admin-functionalities .functionality .title{display:block}.admin-functionalities .functionality select{margin-top:1rem}.admin-functionalities .videoconference-attributes select{margin-bottom:.5rem}.admin-functionalities .button-green{color:#fff;display:block;text-align:center}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.admin-membership-table .avatar figcaption{margin-left:1rem;width:75%}.admin-membership-table .avatar figcaption span{width:100%}.admin-membership-table .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:35px}.admin-membership-table .avatar .email,.admin-membership-table .avatar .name{display:block;width:100%}.admin-membership-table .avatar .email{color:#b8b8b8}.admin-membership-table .header-role,.admin-membership-table .header-status{padding-left:.5rem}.admin-membership-table .row-role{padding-right:1rem}.admin-membership-table .row-status{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.admin-membership-table .active,.admin-membership-table .resend{padding:.4rem .5rem}.admin-membership-table .active{background-color:#f5f5f5}.admin-membership-table .resend{background-color:#72a114;color:#fff}.admin-membership-table .resend:hover{background-color:#9dce0a;color:#fff;-webkit-transition:background-color .3s linear;transition:background-color .3s linear}.admin-membership-table .delete{font-size:1.2rem;color:#b8b8b8}.admin-membership-table .delete:hover{color:red}.admin-membership-table .pending{color:#ff8282}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-webkit-flex-basis:210px;-ms-flex-preferred-size:210px;flex-basis:210px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.admin-menu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #dcdcdc}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.admin-project-export-result .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;-webkit-transform-origin:32 32;transform-origin:32 32}.project-details .loading-spinner,.ticket-assigned-to .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.admin-project-export-buttons{margin:2rem 0 1rem}.admin-project-export-result{margin-top:1rem}.admin-project-export-result .spin{margin:0 auto;width:2.5rem}.admin-project-export-result .spin img{width:100%}.admin-project-export-result h3{font-size:1.2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin:.5rem;padding:.5rem;text-align:center}.admin-roles .general-category,.admin-roles .role-name,.project-details .looking-for-people,.project-details label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-project-export-result p{color:#b8b8b8;margin:.5rem 0;text-align:center}.project-details .delete-project:hover,.project-details .use-default-image:hover{color:red}.project-details .delete-project,.project-details .image-help,.project-details .private-or-public,.project-details .use-default-image{font-size:.75rem}.project-details .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;border:0;-webkit-transform-origin:center center;transform-origin:center center}.project-details form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-details fieldset{margin-bottom:1rem}.project-details label{display:block;margin-bottom:.2rem}.project-details .project-details-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.project-details .project-details-image .image{width:100%}.project-details .image-container{position:relative;margin-bottom:0}.project-details .loading-overlay{display:none}.project-details .loading-overlay.active{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.project-details .image-help{line-height:1rem;margin-bottom:.5rem;text-align:center}.project-details .use-default-image{text-align:center}.project-details .project-details-form-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.project-details form{display:block}}.project-details .looking-for-people{border-bottom:1px solid #f5f5f5;border-top:1px solid #f5f5f5;padding:1rem 0}.project-details .looking-for-people-selector{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-details .looking-for-people-selector svg{width:1rem;height:1rem;fill:#b8b8b8;margin-left:.5rem}.project-details .looking-for-people-selector .check{margin-left:auto}.project-details .looking-for-people-reason{display:block;margin-top:1rem}.project-details .looking-for-people-reason.ng-hide-remove-active{-webkit-animation:dropdownFade .3s;animation:dropdownFade .3s}.project-details .looking-for-people-reason.ng-hide-add-active{-webkit-animation:dropdownFade .2s reverse;animation:dropdownFade .2s reverse;-webkit-animation-delay:.1s;animation-delay:.1s}.project-details .delete-project{display:block;margin-top:1rem;text-align:right}.project-details .private-or-public{color:#b8b8b8;margin-bottom:2rem}.project-details .private-or-public svg{width:1.1rem;height:1.1rem;fill:#b8b8b8;margin-right:.5rem;vertical-align:middle}.project-privacy-settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.project-privacy-settings .privacy-option{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-transition:.2 linear;transition:.2 linear}.project-privacy-settings .privacy-option:first-child{margin-right:.5rem}.project-privacy-settings input[type=radio],.project-privacy-settings input[type=text]{display:none}.project-privacy-settings label{background:#f5f5f5;color:#444;text-align:center;-webkit-transition:all .2s linear;transition:all .2s linear}.project-privacy-settings label:hover{background:rgba(157,206,10,.4);color:#444}.project-privacy-settings label:hover svg{fill:#444}.project-privacy-settings label svg{width:1.1rem;height:1.1rem;fill:#444;margin-left:.5rem;vertical-align:middle}.project-privacy-settings .privacy-project:checked+label{background:#9dce0a;color:#fff}.project-privacy-settings .privacy-project:checked+label svg{width:1.1rem;height:1.1rem;fill:#fff}.project-privacy-settings .privacy-project:checked~input[type=text]{display:block}.admin-roles .general-category{font-size:.9rem}.admin-roles .edit-value{font-size:1rem}.admin-roles .role-name{font-size:2rem;color:#444}.admin-roles .edit-value{color:#b8b8b8;cursor:pointer;margin-left:.5rem;opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-roles .edit-role{background-color:#f5f5f5;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .edit-role .icon-floppy{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .edit-role .icon-floppy:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .any-computable-role{background:red;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category .check{margin-left:.5rem}.admin-roles .general-category .check input{height:40px;width:85px}.admin-submenu-roles .single-role{max-width:175px;display:inline-block}.admin-submenu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.admin-contrib .help .alt-image,.admin-contrib .help code,.admin-contrib .select-input-text .help-copy,.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-body span,.admin-webhooks .history-single-response-header a{font-size:.9rem}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#8fa291;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a.active{background:#a3b2a4;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a span{display:block;max-width:85%}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#050505}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child,.admin-webhooks .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body .response-container,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-webhooks .table-header{border-bottom:1px solid #b8b8b8}.admin-webhooks .table-body .webhook-service{color:#555}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #f5f5f5}.admin-webhooks .webhooks-options{margin-bottom:1rem;text-align:right}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.admin-webhooks .webhook-url{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.admin-webhooks .webhook-url span{max-width:65%;color:#b8b8b8;display:inline-block;vertical-align:middle}.admin-contrib .help code,.admin-third-parties .help code{direction:ltr;line-height:1.4rem;unicode-bidi:embed;white-space:pre}.admin-webhooks .webhook-url a{color:#72a114;margin-left:.5rem}.admin-webhooks .webhook-url a:hover{color:#9dce0a}.admin-webhooks .webhook-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;min-width:100px;text-align:center}.admin-webhooks .webhook-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.admin-webhooks .webhook-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .webhooks-history.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #f5f5f5;margin-left:22%}.admin-webhooks .history-single{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(157,206,10,.1);-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single.history-single-open:hover{background:0 0}.admin-webhooks .history-single.history-single-open .icon-arrow-bottom{-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:-webkit-transform .3s linear;transition:-webkit-transform .3s linear;transition:transform .3s linear;transition:transform .3s linear,-webkit-transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s linear;transition:-webkit-transform .3s linear;transition:transform .3s linear;transition:transform .3s linear,-webkit-transform .3s linear}.admin-webhooks .history-response-icon{background:#555;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#9dce0a}.admin-webhooks .history-response-icon.history-error{background:red}.admin-webhooks .history-single-response{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header a,.admin-webhooks .history-single-response-header span:first-child{color:#b8b8b8}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .history-single-request-header .icon,.admin-webhooks .history-single-response-header .icon{margin-right:.3rem;vertical-align:middle}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-response-body .response-container{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin-bottom:.5rem}.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-response-body span{color:#b8b8b8;-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{border:0;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.admin-contrib h2,.admin-contrib label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-contrib .help h3,.admin-contrib .help ol span{font-family:opensans-semibold}.admin-contrib form{margin:1rem 0;max-width:700px;width:100%}.admin-contrib h2{font-size:1.2rem;margin-bottom:0}.admin-contrib fieldset{border-bottom:1px solid #f5f5f5;margin-bottom:1rem;padding-bottom:1rem}.admin-contrib .contrib-input{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.admin-contrib .contrib-test{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:7.5rem;-ms-flex-preferred-size:7.5rem;flex-basis:7.5rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-left:.5rem;text-align:center}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .contrib-form-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-contrib .select-input-text .help-copy{opacity:0}.admin-contrib .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-contrib .check-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0}.admin-contrib .help{margin-top:2rem}.admin-contrib .help h3{margin-bottom:1rem}.admin-contrib .help ol{padding:0 0 0 2rem}.admin-contrib .help .img{margin-bottom:1rem}.admin-contrib .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-contrib .help .code-info{padding-left:1rem}.admin-contrib .help .code-info li{margin-bottom:.5rem}.admin-contrib .help .code-info span{font-family:opensans-semibold}.default-values fieldset{margin-bottom:1rem}.default-values fieldset:last-child{margin-top:1.5rem}.default-values label,.default-values select{display:inline-block;width:49.7%}.default-values a{color:#fff;display:block;text-align:center}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field .icon{margin-right:.3rem}.project-csv .field-with-options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row .icon,.project-values-settings a{font-size:1.2rem}.admin-third-parties .help .alt-image,.admin-third-parties .help code,.admin-third-parties .select-input-text .help-copy,.backlog-table-body .doom-line span,.backlog-table-body .pop-points,.backlog-table-body .pop-points a,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open a,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-body .pop-role,.backlog-table-body .pop-role a,.backlog-table-body .pop-status,.backlog-table-body .pop-status a,.backlog-table-body .row,.backlog-table-body .tags-block .tag,.backlog-table-header .pop-points,.backlog-table-header .pop-points a,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open a,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom a,.backlog-table-header .pop-role,.backlog-table-header .pop-role a,.backlog-table-header .pop-status,.backlog-table-header .pop-status a,.backlog-table-header .row,.login-form-container .forgot-pass,.register-form-container .register-text{font-size:.9rem}.project-values-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{color:#b8b8b8;opacity:0}.project-values-row .icon:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.project-values-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #f5f5f5}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-header .points,.login-form-container .remember-me+label{cursor:pointer}.project-values-body .project-values-row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.project-values-name{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.project-values-value{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{color:#555;margin-right:.5rem}.project-values-settings a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.project-values-settings a:hover .icon-delete{color:red}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.admin-third-parties .help h3,.admin-third-parties .help ol span{font-family:opensans-semibold}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.admin-third-parties fieldset{margin-bottom:1rem}.admin-third-parties label{display:block;margin-bottom:.2rem}.admin-third-parties textarea{height:10rem}.admin-third-parties .submit-button{color:#fff;display:block;text-align:center}.cancel-account p,.change-email-form p,.change-password-text{color:#444;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-third-parties .help{margin-top:2rem}.cancel-account form,.change-email-form form{margin-top:1rem}.admin-third-parties .help h3{margin-bottom:1rem}.admin-third-parties .help ol{padding:0 0 0 2rem}.admin-third-parties .help .img{margin-bottom:1rem}.admin-third-parties .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-third-parties .help .code-info li,.cancel-account p{margin-bottom:.5rem}.admin-third-parties .help .code-info{padding-left:1rem}.admin-third-parties .help .code-info span{font-family:opensans-semibold}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-email-form p{margin-bottom:.5rem}.change-password-form-container .token-change-password{position:relative}.change-password-form-container input:focus+.get-token{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.change-password-form-container .get-token{font-size:.9rem;color:#b8b8b8;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.change-password-form-container .get-token:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.login-form-container .forgot-pass{color:#555;opacity:1;position:absolute;right:1rem;top:.6rem;-webkit-transition:all .3s linear;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.login-form-container .remember-me{vertical-align:top}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin-bottom:1rem;text-align:center}.backlog-table-header .backlog-table-title{font-size:1rem}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a,.empty-backlog .title{font-size:1.2rem}.backlog-table-body .doom-line span{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.backlog-table-body .pop-points,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-body .user-story-name a,.backlog-table-header .pop-points,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-role,.backlog-table-header .pop-status,.empty-backlog{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.backlog-table-body,.backlog-table-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.backlog-table-body.show-tags .tags-block,.backlog-table-header.show-tags .tags-block{display:block}.backlog-table-body .row,.backlog-table-header .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-subtitle:hover,.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-subtitle:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-subtitle .input,.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-subtitle .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-webkit-flex-basis:25px;-ms-flex-preferred-size:25px;flex-basis:25px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .votes,.backlog-table-body .backlog-table-title .votes,.backlog-table-body .row .votes,.backlog-table-header .backlog-table-subtitle .votes,.backlog-table-header .backlog-table-title .votes,.backlog-table-header .row .votes{color:#555;-webkit-flex-basis:65px;-ms-flex-preferred-size:65px;flex-basis:65px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .backlog-table-subtitle .votes.inactive,.backlog-table-body .backlog-table-title .votes.inactive,.backlog-table-body .row .votes.inactive,.backlog-table-header .backlog-table-subtitle .votes.inactive,.backlog-table-header .backlog-table-title .votes.inactive,.backlog-table-header .row .votes.inactive{color:#b8b8b8}.backlog-table-body .backlog-table-subtitle .votes.is-voted,.backlog-table-body .backlog-table-title .votes.is-voted,.backlog-table-body .row .votes.is-voted,.backlog-table-header .backlog-table-subtitle .votes.is-voted,.backlog-table-header .backlog-table-title .votes.is-voted,.backlog-table-header .row .votes.is-voted{color:#9dce0a}.backlog-table-body .backlog-table-subtitle .user-stories,.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-subtitle .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{overflow:hidden;width:100%}.backlog-table-body .backlog-table-subtitle .status,.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-subtitle .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .points,.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-subtitle .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-webkit-flex-basis:125px;-ms-flex-preferred-size:125px;flex-basis:125px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .points,.backlog-table-body .status,.backlog-table-header .points,.backlog-table-header .status{position:relative;text-align:right}.backlog-table-body .points .popover a,.backlog-table-body .status .popover a,.backlog-table-header .points .popover a,.backlog-table-header .status .popover a{text-align:left;width:100%}.backlog-table-body .points .popover .point,.backlog-table-body .status .popover .point,.backlog-table-header .points .popover .point,.backlog-table-header .status .popover .point,.empty-backlog,.sprints .loading,.sprints .sprint-table .sprint-empty{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{color:#b8b8b8;margin-left:.2rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-status a:last-child,.backlog-table-header .pop-status a:last-child{border:0}.backlog-table-body .pop-status a:hover,.backlog-table-header .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-status a:hover.point,.backlog-table-header .pop-status a:hover.point{color:#fff}.backlog-table-body .pop-status:after,.backlog-table-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-status.fix,.backlog-table-header .pop-status.fix{bottom:0;top:auto}.backlog-table-body .pop-role,.backlog-table-header .pop-role{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-role a:last-child,.backlog-table-header .pop-role a:last-child{border:0}.backlog-table-body .pop-role a:hover,.backlog-table-header .pop-role a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-role a:hover.point,.backlog-table-header .pop-role a:hover.point{color:#fff}.backlog-table-body .pop-role:after,.backlog-table-header .pop-role:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#9dce0a;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{background:#050505;bottom:10px;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px 3rem 10px 10px;position:absolute;width:150px;z-index:99}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points a:last-child,.backlog-table-header .pop-points a:last-child{border:0}.backlog-table-body .pop-points a:hover,.backlog-table-header .pop-points a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points a:hover.point,.backlog-table-header .pop-points a:hover.point{color:#fff}.backlog-table-body .pop-points:after,.backlog-table-header .pop-points:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{border-bottom:1px solid #444;color:#fff;padding:10px 2px}.backlog-table-body .pop-points-open a:last-child,.backlog-table-header .pop-points-open a:last-child{border:0}.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open a:hover.point,.backlog-table-header .pop-points-open a:hover.point{color:#fff}.backlog-table-body .pop-points-open:after,.backlog-table-header .pop-points-open:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{background:#050505;bottom:0;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:auto;width:200px;z-index:99}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open.pop-bottom a:last-child,.backlog-table-header .pop-points-open.pop-bottom a:last-child{border:0}.backlog-table-body .pop-points-open.pop-bottom a:hover,.backlog-table-header .pop-points-open.pop-bottom a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open.pop-bottom a:hover.point,.backlog-table-header .pop-points-open.pop-bottom a:hover.point{color:#fff}.backlog-table-body .pop-points-open.pop-bottom:after,.backlog-table-header .pop-points-open.pop-bottom:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open li,.backlog-table-header .pop-points-open li{display:inline-block;width:23%}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{display:block;text-align:center}.backlog-table-body .user-story-name,.sprints .sprint-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-table-body .pop-points-open a.active,.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a.active,.backlog-table-header .pop-points-open a:hover{background:#9dce0a;color:#fff}.backlog-table-header .backlog-table-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:2px solid #b8b8b8;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:30px}.backlog-table-header .header-points span{color:#b8b8b8}.backlog-table-body .row{border-bottom:1px solid #ebebeb;cursor:move;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag-v,.backlog-table-body .row:hover .us-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .is-checked,.backlog-table-body .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body input:checked{color:#9dce0a;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.backlog-table-body .user-story-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{display:inline-block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.backlog-table-body .user-story-name span{line-height:1.5}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff8282;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:red;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .blocked a{color:#fff!important}.backlog-table-body .blocked .icon,.backlog-table-body .blocked .icon:hover,.backlog-table-body .blocked a:hover{color:#fff}.backlog-table-body .doom-line{background:red;margin:.2rem 0;padding:.6rem 0;position:relative;width:100%}.backlog-table-body .doom-line span{color:#fff;position:absolute;right:.5rem;top:-3px}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;width:30px}.backlog-table-body .icon-drag-v:hover,.backlog-table-body .us-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .us-settings{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 0 0 2rem;opacity:0}.backlog-table-body .icon-drag-v{cursor:move;opacity:0;padding:.1rem .5rem 0 0}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.empty-backlog{padding:2rem}.empty-backlog img{margin-bottom:1rem}.empty-backlog .title{margin-bottom:.5rem}.empty-backlog a{color:#72a114}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint .description{font-size:.75rem}.sprints .filter-closed-sprints,.sprints .sprint-table .column-us,.sprints .us-item-row .user-story-name{font-size:.9rem}.sprints .sprint .number,.sprints .sprint .sprint-date,.sprints .sprint-name a,.sprints-empty .title{font-size:1.2rem}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint-header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#72a114;padding:.25rem .25rem 0;-webkit-transition:background .2s;transition:background .2s}.sprints .add-sprint:hover{background:#9dce0a}.sprints .add-sprint svg{height:1.4rem;max-height:1.4rem;max-width:1.5rem;width:1.5rem}.sprints .add-sprint path{fill:#f5f5f5}.sprints .filter-closed-sprints{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading-spinner{border:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;-webkit-transform-origin:center center;transform-origin:center center}.sprints .sprint-name a{max-width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;margin-right:3px}.sprints .sprint{margin-bottom:2rem;overflow:hidden}.sprints .sprint header{position:relative}.sprints .sprint:hover .icon-edit{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.sprints .sprint .icon{display:inline-block}.sprints .sprint .icon-arrow-up{-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:baseline}.sprints .sprint .icon-arrow-up.active{-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.sprints .sprint .icon-arrow-up:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.sprints .sprint .icon-edit{color:#b8b8b8;opacity:0;position:absolute;right:0;top:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;vertical-align:baseline}.sprints .sprint .icon-edit:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.sprints .sprint .description{line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{color:#b8b8b8;-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1}.sprints .sprint .sprint-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.sprints .sprint ul{margin:0}.sprints .sprint li{display:inline-block}.sprints .sprint li:first-child{margin-right:3px}.sprints .sprint-progress-bar{background:#b8b8b8;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#72a114;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table .sprint-empty{background:#e6e6e6;border:2px dashed #d2d2d2;color:#555;padding:1rem}.sprints .sprint-table .row{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:#d7d7d7;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .row.readonly,.taskboard-table .taskboard-task.readonly{cursor:auto}.sprints .sprint-table .row:last-child{border-bottom:0}.sprints .sprint-table .row.sortable-placeholder{background:#d7d7d7;height:40px}.sprints .sprint-table .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .column-us{-webkit-flex-flow:3;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{max-width:230px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.sprints .sprint-table .us-name.closed{color:#c5c5c5}.sprints .sprint-table .us-name.blocked{color:red}.sprints .sprint-table .column-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#c5c5c5}.sprints .sprint-table .column-points.blocked{color:red}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.sprints .us-item-row .icon-drag-v,.sprints .us-item-row .popover,.sprints .us-item-row .status,.sprints .us-item-row .tags-block,.sprints .us-item-row .us-settings,.sprints .us-item-row input,.taskboard-table-body .column-fold .taskboard-task .icon,.taskboard-table-body .column-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .column-fold .taskboard-task .taskboard-text,.taskboard-table-body .row-fold .taskboard-task .icon,.taskboard-table-body .row-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .row-fold .taskboard-task .taskboard-text{display:none}.sprints .us-item-row .user-story-name{line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#b8b8b8}.sprint-closed .sprint-progress-bar .current-progress{background:#9f9f9f}.sprint-closed .button-gray{background:#b8b8b8}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{margin-bottom:.5rem}.sprints-empty a{color:#72a114}.taskboard-userstory-box .points-value{font-size:.9rem}.taskboard-table-header .task-colum-name,.taskboard-table-header .task-colum-name .icon{font-size:1rem}.taskboard-table-body .column-fold .taskboard-task,.taskboard-table-body .row-fold .taskboard-task{background:0 0;border:0;margin:0;min-height:0}.category-config,.ticket-assigned-to{border-bottom:1px solid #b8b8b8}.category-config:first-child,.ticket-assigned-to{border-top:1px solid #b8b8b8}.taskboard-table-body .column-fold .taskboard-task .taskboard-task-inner,.taskboard-table-body .row-fold .taskboard-task .taskboard-task-inner{padding:.2rem}.taskboard-table-body .column-fold .taskboard-task .avatar,.taskboard-table-body .row-fold .taskboard-task .avatar{height:35px;width:35px}.taskboard-table-body .column-fold .taskboard-task.ui-sortable-helper,.taskboard-table-body .row-fold .taskboard-task.ui-sortable-helper{box-shadow:none}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .row-fold .task-column,.taskboard-table-body .task-column.column-fold,.taskboard-table-body .task-column.row-fold{-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .column-fold .avatar-task-link,.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table,.taskboard-table-header .taskboard-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;overflow:hidden}.taskboard-table{display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;width:100%}.taskboard-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:flex;position:absolute}.taskboard-table-header .task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-header .task-colum-name .icon:hover{color:#72a114}.taskboard-table-header .task-colum-name .icon.hfold,.taskboard-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.taskboard-table-header .task-colum-name.column-fold{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.3rem 0}.taskboard-table-header .task-colum-name.column-fold span{display:none}.taskboard-table-header .task-colum-name.column-fold .hfold,.taskboard-table-header .task-colum-name.column-fold .hunfold{margin:0}.taskboard-table-body{height:100%;overflow:auto;width:100%}.taskboard-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;width:300px}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .column-fold .taskboard-task{max-width:40px;width:40px}.taskboard-table-body .task-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;min-height:10rem;width:100%}.taskboard-table-body .avatar-task-link,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .icon-plus,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .task-row:hover .new-task{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(255,0,0,.6)}.taskboard-table-body .task-row.blocked .points-value,.taskboard-table-body .task-row.blocked .points-value:hover,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a:hover{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(255,0,0,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-table-body .taskboard-userstory-box .icon{color:#b8b8b8;position:absolute;right:.5rem;top:.7rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-body .taskboard-userstory-box .icon:hover{color:#72a114}.taskboard-table-body .taskboard-userstory-box .icon.icon-plus{right:2rem}.taskboard-table-body .taskboard-userstory-box .icon.icon-vfold,.taskboard-table-body .taskboard-userstory-box .icon.icon-vunfold{left:0;right:inherit}.taskboard-table-body .avatar-assigned-to{display:block}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .tag-list{display:none;margin-bottom:1rem}.taskboard-userstory-box .us-title{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{color:#b8b8b8}.taskboard-userstory-box .points-value span{margin-right:.1rem}.points-list a{color:#72a114;margin-left:.5rem}.points-list a:hover span{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.points-list span{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.ticket-assigned-to{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:1rem 0;position:relative}.ticket-assigned-to:hover .assigned-to .icon-delete{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;-webkit-transform-origin:32 32;transform-origin:32 32;margin:1rem auto;max-height:2rem;max-width:2rem}.filters-inner .loading .loading-spinner,.lightbox-generic-loading .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.ticket-assigned-to .user-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;position:relative}.ticket-assigned-to .user-avatar img{width:100%}.ticket-assigned-to .user-avatar.is-iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.ticket-assigned-to .user-avatar .iocaine-symbol{left:-.5rem;position:absolute;top:-.75rem;z-index:9}.ticket-assigned-to .user-avatar .iocaine-symbol svg{background:#444;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.ticket-assigned-to .assigned-to{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-to .assigned-to .assigned-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block;margin:.2rem 0 .25rem}.ticket-assigned-to .assigned-to .assigned-to-options{display:inline-block}.category-config .category-item,.category-config .resume{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.ticket-assigned-to .assigned-to .assign-to-me,.ticket-assigned-to .assigned-to .user-assigned{color:#72a114;cursor:default}.ticket-assigned-to .assigned-to .assign-to-me:hover,.ticket-assigned-to .assigned-to .user-assigned:hover{cursor:pointer}.ticket-assigned-to .assigned-to .assign-to-me .icon,.ticket-assigned-to .assigned-to .user-assigned .icon{vertical-align:middle}.ticket-assigned-to .assigned-to .assign-to-me>span,.ticket-assigned-to .assigned-to .user-assigned>span{max-width:80%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ticket-assigned-to .assigned-to .icon-delete{color:#b8b8b8;opacity:0;position:absolute;right:0;top:2rem}.ticket-assigned-to .assigned-to .icon-delete:hover{color:red}.category-config .resume{-webkit-box-align:space-between;-webkit-align-items:space-between;-ms-flex-align:space-between;align-items:space-between;cursor:pointer;display:flex;padding:1rem;position:relative}.category-config .resume-title{width:280px}.category-config .count{color:#b8b8b8;float:left;padding-right:5px}.category-config .summary-role{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#b8b8b8;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#72a114}.category-config .summary-role .role-summary-single.inactive{background:#555}.category-config .icon{font-size:2rem;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;text-align:right}.category-config .category-items{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden;background-color:#f5f5f5;width:100%}.category-config .category-items.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.colors-table .row,.duty-custom-fields .custom-fields-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #f5f5f5}.colors-table .icon,.colors-table .icon-check-square{font-size:1.2rem}.colors-table .table-header:hover{background:0 0}.colors-table .table-header .row{padding-left:50px}.colors-table form:last-child .row{border:0}.colors-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.colors-table .row.edition .current-color,.duty-custom-fields form label{cursor:pointer}.colors-table .row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.colors-table .row:last-child{border:0}.colors-table .row.edition,.colors-table .row.new-value{padding-left:50px}.colors-table .row.hidden{display:none}.colors-table .row .color-column{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100px;position:relative}.colors-table .row .is-archived-column,.colors-table .row .is-closed-column,.colors-table .row .options-column,.colors-table .row .status-wip-limit{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.colors-table .row .status-name{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px;position:relative}.colors-table .row .status-name span{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.duty-custom-fields .custom-field-value.js-value-view-mode,.lightbox-generic-ask .subtitle{white-space:pre-line}.colors-table .row .status-slug{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px}.colors-table .row .options-column{max-width:100px;opacity:0;text-align:right}.colors-table .row .is-archived-column{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row .is-closed-column{max-width:130px;text-align:center}.colors-table .row .status-wip-limit{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#b8b8b8;border-radius:2px;height:40px;width:40px}.activity-single .activity-user img,.duty-custom-fields form input{width:100%}.colors-table .icon{color:#b8b8b8;margin-right:1rem;opacity:0}.colors-table .icon.icon-check-square,.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.colors-table .icon:hover{color:#72a114;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.colors-table .icon-delete:hover{color:red}.colors-table .icon-check-square{color:#72a114}.duty-custom-fields .custom-field-data .custom-field-description{font-size:.9rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom{font-size:1.2rem;cursor:pointer;-webkit-transform:rotate(-90deg);transform:rotate(-90deg);-webkit-transition:-webkit-transform .2s linear;transition:-webkit-transform .2s linear;transition:transform .2s linear;transition:transform .2s linear,-webkit-transform .2s linear}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields{margin-bottom:2rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom.open{-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .2s linear;transition:-webkit-transform .2s linear;transition:transform .2s linear;transition:transform .2s linear,-webkit-transform .2s linear}.duty-custom-fields .custom-fields-body{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.duty-custom-fields .custom-fields-body.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.duty-custom-fields .custom-field-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;padding:1rem}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-single .custom-field-options{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-custom-fields .custom-field-single .custom-field-options a{color:#b8b8b8}.duty-custom-fields .custom-field-single .custom-field-options a:hover{color:#72a114}.duty-custom-fields .custom-field-data{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px}.duty-custom-fields .custom-field-data .custom-field-name{display:block}.duty-custom-fields .custom-field-data .custom-field-description{color:#888;display:block;line-height:.9rem}.duty-custom-fields .custom-field-options{margin:0}.duty-custom-fields .custom-field-value{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff8282}.external-reference{font-size:.9rem;color:#b8b8b8;margin-top:.5rem}.external-reference a{border-left:1px solid #b8b8b8;padding:0 .2rem;-webkit-transition:color .3s linear;transition:color .3s linear}.external-reference a:hover{color:#72a114}.external-reference a:first-child{border:0}.activity-single .comment-restore,.activity-single .date,.activity-single .deleted-comment,.activity-single.deleted-comment,.change-entry .activity-fromto,.more-activity,.more-comments,.show-more-comments{font-size:.9rem}.activity-single .deleted-comment .comment-body p,.activity-single.deleted-comment .comment-body p{font-size:1rem}.history-tabs{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.change-entry .activity-changed{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.history{margin-bottom:1rem}.changes-title{display:block;padding:.5rem}.changes-title:hover .icon{color:#72a114;-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.changes-title .icon{color:#444;float:right;-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:all .2s linear;transition:all .2s linear}.main-nav a:hover .helper::after,.related-tasks-body .pop-status:after{-webkit-transform:rotate(45deg);content:''}.change-entry{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.change-entry:last-child{border-bottom:0}.change-entry .activity-changed,.change-entry .activity-fromto{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.history-tabs{border-bottom:3px solid #b8b8b8;margin-bottom:0;padding:.5rem 0}.history-tabs li{font-size:1.2rem;display:inline-block}.history-tabs li:first-child{border-right:1px solid #b8b8b8}.history-tabs a{color:#b8b8b8;padding:0 2rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs a.active{color:#444}.history-tabs a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs .icon{margin-right:.5rem}.add-comment .in-progress{cursor:progress}.add-comment:after{clear:both;content:'';display:table}.add-comment.active .button-green{display:block;margin-top:.5rem}.add-comment.active textarea{height:6rem;-webkit-transition:height .3s ease-in;transition:height .3s ease-in}.add-comment.active .help-markdown{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.add-comment.active .preview-icon{opacity:1;position:absolute;right:1rem}.add-comment .help-markdown,.add-comment .preview-icon,.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave.ng-leave-active:last-child{opacity:0}.add-comment textarea{background:#fff;height:5rem;min-height:41px}.add-comment .save-comment{color:#fff;float:right}.add-comment .button-green{display:none}.more-comments,.show-more-comments{color:#b8b8b8;display:block;border-bottom:1px solid #b8b8b8}.add-comment .edit,.add-comment .preview-icon{position:absolute;right:1rem}.show-more-comments{border-top:1px solid #b8b8b8;padding:1rem 0 1rem 1rem}.show-more-comments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.more-comments{padding:1rem}.more-comments .prev-comments-num{color:#72a114;margin-left:.5rem}.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{-webkit-transition:all .3s ease-in;transition:all .3s ease-in}.comment-list.activeanimation .comment-single.ng-enter.ng-enter-active:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{opacity:1}.activity-single{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:2rem 0;position:relative}.activity-single:hover .comment-delete,.activity-single:hover .comment-restore{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.activity-single:first-child{margin-top:0}.activity-single:last-child{border-bottom:0}.activity-single .deleted-comment,.activity-single.deleted-comment{color:#b8b8b8;padding:.5rem}.activity-single .deleted-comment a,.activity-single.deleted-comment a{color:#b8b8b8;margin-left:.3rem}.activity-single .deleted-comment a:hover,.activity-single.deleted-comment a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .deleted-comment img,.activity-single.deleted-comment img{-webkit-filter:grayscale(100%);filter:grayscale(100%);opacity:.5}.activity-single .deleted-comment .comment-body,.activity-single.deleted-comment .comment-body{display:none;margin:.2rem 0 .5rem}.activity-single .activity-username,.activity-single .username{margin-bottom:.5rem;color:#72a114}.activity-single .comment-restore{color:#b8b8b8;position:absolute;right:0;top:.4rem}.activity-single .comment-restore .icon{vertical-align:baseline}.activity-single .comment-restore:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .activity-user{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.activity-single .activity-content{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:calc(100% - 80px)}.activity-single .changes{background:#f5f5f5}.activity-single .changes .change-entry{display:none}.activity-single .changes .change-entry.active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.activity-single .date{color:#b8b8b8;margin-left:1rem}.activity-single .wysiwyg{margin-bottom:0}.activity-single .comment-delete{color:red;opacity:0;position:absolute;right:0;top:2rem;-webkit-transition:all .2s linear;transition:all .2s linear}.activity-single .comment-delete:hover{color:#ff8282;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single.activity .change-entry{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.more-activity{border-bottom:1px solid #b8b8b8;color:#b8b8b8;display:block;padding:1rem}.more-activity .prev-activity-num{color:#72a114;margin-left:.5rem}.lightbox{background:rgba(255,255,255,.98);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox-generic-form label{font-size:.75rem}.lightbox-add-member .help-text,.lightbox-delete-account .newsletter input+label,.lightbox-sprint-add-edit .delete-sprint,.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem}.lightbox-select-user .more-watchers{font-size:1rem}.lightbox-add-member .add-member-wrapper .icon-delete,.lightbox-add-member .icon,.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-size:1.2rem}.lightbox h2{font-size:1.6rem}.lightbox .close,.lightbox-add-member .icon-delete{font-size:2rem}.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress,.lightbox-select-user .more-watchers{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.lightbox h2,.lightbox-delete-account .newsletter input+label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox .close{color:#555;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.lightbox-add-member .add-member-wrapper fieldset,.lightbox-generic-form fieldset{position:relative}.lightbox-add-member .checksley-error-list,.lightbox-generic-form .attachment-delete{right:.5rem}.lightbox .close:hover{color:#72a114}.open.lightbox{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.lightbox{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox-generic-loading .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32}.lightbox-generic-form form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form textarea{min-height:4.5rem;resize:vertical}.lightbox-generic-form label{background:#f5f5f5;border:1px solid #b8b8b8;color:#444;cursor:pointer;display:block;padding:7px 30px;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#444;vertical-align:middle}.lightbox-generic-form .settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-add-member .button,.lightbox-add-member .extra-text{margin-top:1rem}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#9dce0a;border:1px solid #72a114}.lightbox-generic-form .settings .blocked:hover{background:#ff8282;border:1px solid red}.lightbox-generic-form .settings .client-requirement input:checked+label,.lightbox-generic-form .settings .iocaine-flag input:checked+label,.lightbox-generic-form .settings .team-requirement input:checked+label{background:#72a114;border:1px solid #72a114;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:red;border:1px solid red;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-form .attachments{margin-bottom:0}.lightbox-generic-form .attachment-body{max-height:7.5rem;overflow-y:auto}.lightbox-generic-form .attachment-delete svg{fill:#b8b8b8;height:1.25rem;width:1.25rem}.lightbox-generic-form .attachment-delete:hover svg{fill:red}.lightbox-generic-bulk form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-search form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-search fieldset{margin-bottom:1rem}.lightbox-add-member .add-member-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.lightbox-add-member .add-member-wrapper:last-child,.lightbox-add-member fieldset{margin-bottom:0}.lightbox-add-member .add-member-wrapper fieldset:first-child{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.lightbox-add-member .add-member-wrapper fieldset:last-child{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.lightbox-add-member select{width:80%}.lightbox-add-member .icon{margin-left:.5rem}.lightbox-add-member .icon-delete:hover{color:red}.lightbox-add-member .help-text{padding:.5rem 1rem}.lightbox-add-member .checksley-error-list li{display:none}.lightbox-add-member .checksley-error-list li:first-child{display:block}.lightbox-sprint-add-edit form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{color:#555;opacity:1;position:absolute;right:1rem;top:.7rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-sprint-add-edit .dates div{float:left;margin-right:1%;position:relative;width:49%}.lightbox-sprint-add-edit .dates div:last-child{margin:0;width:50%}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint{color:#444;display:block;margin-top:1rem;text-align:right}.lightbox-sprint-add-edit .delete-sprint a{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-sprint-add-edit .delete-sprint a:hover{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-generic-ask form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:420px}.lightbox-generic-ask .message,.lightbox-generic-ask .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-generic-ask .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-generic-ask .options a{padding:8px 0;text-align:center;width:100%}.lightbox-ask-choice{text-align:center}.lightbox-ask-choice form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.lightbox-ask-choice .question,.lightbox-ask-choice .subtitle{display:block;line-height:1.5rem;text-align:center}.lightbox-ask-choice .replacement,.lightbox-ask-choice .replacement span{display:block}.lightbox-ask-choice .choices{margin-bottom:2rem}.lightbox-ask-choice .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-account form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-account .question,.lightbox-delete-account .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-account .newsletter{margin:1rem 0;text-align:center}.lightbox-delete-account .newsletter input,.lightbox-delete-account .options a:first-child,.lightbox-delete-project .options a:first-child{margin-right:.5rem}.lightbox-delete-account .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-project .question,.lightbox-delete-project .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-project .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-delete-project .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-generic-error section,.lightbox-generic-loading section,.lightbox-generic-success section{-webkit-flex-basis:500px;-ms-flex-preferred-size:500px;flex-basis:500px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:500px}.lightbox-generic-error h2,.lightbox-generic-loading h2,.lightbox-generic-success h2{line-height:2rem}.lightbox-generic-error p,.lightbox-generic-loading p,.lightbox-generic-success p{text-align:center}.lightbox-generic-loading .spin{margin:1rem auto;width:5rem}.lightbox-generic-loading .spin img{max-height:100%;max-width:100%;width:100%}.lightbox-generic-loading .progress-bar-wrapper{background:#e8e8e8;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#9dce0a;height:24px;position:absolute;-webkit-transition:width .1s linear;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#e8e8e8;bottom:35px;color:#555;padding:.3rem;position:absolute;-webkit-transition:left .1s linear;transition:left .1s linear}.lightbox-create-issue form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row fieldset{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem;width:30%}.lightbox-create-issue .fieldset-row fieldset:last-child{margin:0}.lightbox-block textarea,.lightbox-create-issue textarea{margin-bottom:1rem;max-height:12rem;min-height:8rem}.lightbox-block .form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-select-user .form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single.selected,.lightbox-select-user .user-list-single:hover{background:#f3fbe1;cursor:pointer}.lightbox-select-user .user-list-single:hover{-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.lightbox-select-user .more-watchers{padding:.5rem;text-align:center}.lb-create-edit-userstory .points-per-role{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0}.featured-project .project-card-inner,.highlighted .highlighted-projects-container,.highlighted .most-active,.highlighted .most-liked,.kanban-table,.wiki-summary .wiki-user-modification{-webkit-box-orient:vertical;-webkit-box-direction:normal}.lb-create-edit-userstory .ticket-role-points{margin:.1rem;min-width:20%}.lb-create-edit-userstory .ticket-role-points:first-child{margin-left:0}.lb-create-edit-userstory .ticket-role-points:nth-child(4n+4){margin-right:0}.lb-create-edit-userstory .ticket-role-points:last-child{margin:.1rem 0;min-width:100%}.main-nav a:hover .helper{font-size:.9rem}.main-nav .item{font-size:1.2rem}tg-project-menu{background-position:0 -300px;display:inline-block;min-height:95%;min-width:50px;padding:1rem 0;position:relative;z-index:9}.main-nav a,.main-nav span{display:block}tg-project-menu .menu.menu-fixed{position:fixed;top:1rem}.main-nav{list-style:none;padding:0;position:relative;text-align:center}.related-tasks-body .row,.related-tasks-body .status{text-align:left;position:relative}.main-nav a{color:#fff;padding:.75rem .8rem;position:relative}.main-nav a:hover{background:rgba(0,0,0,.2);color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.main-nav a:hover .helper{-webkit-animation:slideLeft .2s ease-in-out both;animation:slideLeft .2s ease-in-out both;background:-webkit-linear-gradient(left,#000 0,rgba(0,0,0,.8) 100%);background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;padding:.4rem 1rem;position:absolute;top:calc(50% - 1rem);-webkit-transition:all .2s;transition:all .2s;white-space:nowrap;z-index:99}.main-nav a:hover .helper::after{background:#050505;height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);transform:rotate(45deg);width:12px;z-index:98}.main-nav svg{height:1.5rem;width:1.5rem}.main-nav svg path{opacity:1}.main-nav .helper{display:none}.main-nav .icon{font-size:1.5rem;line-height:2.2rem}.main-nav .active{background:rgba(0,0,0,.2);color:#9dce0a}.main-nav .active svg path{fill:#9dce0a;opacity:1}@-webkit-keyframes slideLeft{0%{opacity:0}100%{opacity:1}}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.related-tasks-body .pop-status,.related-tasks-body .pop-status a,.related-tasks-body .row{font-size:.9rem}.related-tasks-body .task-name input,.related-tasks-header .related-tasks-title{font-size:1rem}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine,.related-tasks-body .task-settings a{font-size:1.2rem}.related-tasks-body .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.related-tasks-header .related-tasks-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-tasks{margin-bottom:2rem;position:relative}.related-tasks-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-tasks-header .add-button{background:#444;border:0;display:inline-block;padding:.5rem;-webkit-transition:background .25s;transition:background .25s}.related-tasks-header .add-button.is-active,.related-tasks-header .add-button:hover{background:#9dce0a}.related-tasks-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-tasks-body{width:100%}.related-tasks-body .row{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.5rem 0 .5rem .5rem;width:100%}.related-tasks-body .row:hover{background:0 0}.related-tasks-body .row:hover .task-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .row:last-child{border:0}.related-tasks-body .row .tasks{overflow:hidden;width:100%}.related-tasks-body .row .status{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100px}.related-tasks-body .row .assigned-to{cursor:pointer;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.related-tasks-body .related-task-create-form{padding:0}.related-tasks-body .related-task-create-form.active{padding:.5rem 0 .5rem .5rem}.related-tasks-body .status:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.related-tasks-body .status .not-clickable:hover{color:#444}.related-tasks-body .status .popover a{text-align:left;width:100%}.related-tasks-body .status .popover .point{text-align:center}.related-tasks-body .status .icon{color:#b8b8b8;margin-left:.2rem;opacity:0}.related-tasks-body .pop-status{background:#050505;color:#fff;display:none;left:40%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.related-tasks-body .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.related-tasks-body .avatar,.related-tasks-body .task-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.related-tasks-body .blocked .icon,.related-tasks-body .blocked .icon:hover,.related-tasks-body .blocked a,.related-tasks-body .blocked a:hover,.related-tasks-body .blocked:hover .icon,.related-tasks-body .blocked:hover .icon:hover,.related-tasks-body .blocked:hover a,.related-tasks-body .blocked:hover a:hover,.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#050505;height:15px;position:absolute;transform:rotate(45deg);width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .task-name{display:flex;position:relative}.related-tasks-body .task-name a{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-name input{margin-right:1rem;padding:3px;width:85%}.related-tasks-body .task-name.loading{margin:0;padding:8px;text-align:center;width:100%}.related-tasks-body .task-name.loading span{-webkit-animation:loading .5s linear,spin 1s linear infinite;animation:loading .5s linear,spin 1s linear infinite}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:#ff8282;color:#fff}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .iocaine,.related-tasks-body .iocaine:hover{background:rgba(157,206,10,.3)}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine{display:inline-block;margin-right:.5rem;vertical-align:top}.related-tasks-body .task-settings{margin:0 0 0 2rem;opacity:0;position:absolute;right:0;top:0;width:10%}.related-tasks-body .task-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .task-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .assigned-to{position:relative;text-align:left}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .task-assignedto figcaption{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-assignedto .icon{opacity:0;position:absolute;right:.5rem;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex}.related-tasks-body .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-data-container,.ticket-header .detail-status,.ticket-header .pop-status,.ticket-header .pop-status a,.ticket-status .priority-data .pop-priority,.ticket-status .priority-data .pop-priority a,.ticket-status .severity-data .pop-severity,.ticket-status .severity-data .pop-severity a,.ticket-status .type-data .pop-type,.ticket-status .type-data .pop-type a,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-size:.9rem}.ticket-header .ticket-title{font-size:1.6rem;vertical-align:sub}.ticket-header .pop-status,.ticket-header .ticket-title,.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .type-data .pop-type,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-header{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1.5rem 0 2rem;position:relative}.ticket-header .detail-status{display:inline-block;margin-left:.25rem;position:relative}.ticket-header .detail-status .icon-arrow-bottom{margin-left:.25rem}.ticket-header .detail-status-inner{color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.15rem .25rem}.ticket-header .pop-status{background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;position:absolute;top:1.25rem;width:150px;z-index:99;padding:0;text-transform:none}.ticket-header .pop-status a{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #444;color:#fff;display:block;padding:.5rem 1rem}.ticket-header .pop-status a:last-child{border:0}.ticket-header .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-header .pop-status a:hover.point{color:#fff}.ticket-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-header .pop-status a:hover{background:rgba(157,206,10,.2)}.ticket-data-container{margin-bottom:1rem}.ticket-data-container .icon{margin-left:.25rem}.ticket-status:last-child{margin:0}.ticket-status .level{display:inline-block;margin-right:.5rem;vertical-align:top}.filters h1,.filters h1 a{vertical-align:baseline}.ticket-status .level-name{color:#c2c2c2;float:right;text-transform:lowercase}.ticket-status .clickable:hover{background:#dcdcdc;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .type-data{background:#e8e8e8;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .type-data .pop-type{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .type-data .pop-type a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .type-data .pop-type a:last-child{border:0}.ticket-status .type-data .pop-type a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-status .severity-data{background:#e8e8e8;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .severity-data .pop-severity{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .severity-data .pop-severity a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .severity-data .pop-severity a:last-child{border:0}.ticket-status .severity-data .pop-severity a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-status .priority-data{background:#e8e8e8;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .priority-data .pop-priority{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .priority-data .pop-priority a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .priority-data .pop-priority a:last-child{border:0}.ticket-status .priority-data .pop-priority a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-detail-settings img,.ticket-detail-settings svg{max-height:1.25rem;max-width:1.25rem;width:100%}.ticket-watch-buttons{margin-bottom:1rem}.ticket-watch .ticket-watch-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.ticket-watch .ticket-watch-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ticket-watch .track-icon{position:relative;top:2px}.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{background:#b8b8b8;color:#fff;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:.25rem;text-align:center;text-transform:uppercase;-webkit-transition:background .25s;transition:background .25s}.ticket-watch .add-watcher path,.ticket-watch .ticket-watch-button path{fill:#fff}.ticket-watch .add-watcher:hover,.ticket-watch .ticket-watch-button:hover{background:#9dce0a}.ticket-watch .add-watcher.is-hover,.ticket-watch .ticket-watch-button.is-hover{background:red;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.ticket-watch .add-watcher.is-hover svg,.ticket-watch .ticket-watch-button.is-hover svg{fill:#ff8282}.ticket-watch .add-watcher.active,.ticket-watch .ticket-watch-button.active{background:#9dce0a}.ticket-watch .add-watcher.active:hover,.ticket-watch .ticket-watch-button.active:hover{background:#ff8282}.ticket-watch .add-watcher.active svg,.ticket-watch .ticket-watch-button.active svg{fill:#fff}.ticket-watch .ticket-watch-button{margin-right:.25rem}.wizard-create-project .create-step1 fieldset:first-child,.wizard-create-project .wizard-action a:first-child{margin-right:.5rem}.ticket-detail-settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-top:2rem}.ticket-detail-settings .button-delete,.ticket-detail-settings .item-block,.ticket-detail-settings .item-unblock,.ticket-detail-settings .promote-button,.ticket-detail-settings label{background:#b8b8b8;display:inline-block;margin-right:.5rem;padding:1rem;-webkit-transition:background .2s linear;transition:background .2s linear;-webkit-transition-delay:.1s;transition-delay:.1s}.ticket-detail-settings .button-delete:hover,.ticket-detail-settings .item-block:hover,.ticket-detail-settings .item-unblock:hover,.ticket-detail-settings .promote-button:hover,.ticket-detail-settings label:hover{background:#555}.ticket-detail-settings .button-delete.editable,.ticket-detail-settings .item-block.editable,.ticket-detail-settings .item-unblock.editable,.ticket-detail-settings .promote-button.editable,.ticket-detail-settings label.editable{cursor:pointer}.ticket-detail-settings .button-delete+input,.ticket-detail-settings .item-block,.ticket-detail-settings .item-block+input,.ticket-detail-settings .item-unblock,.ticket-detail-settings .item-unblock+input,.ticket-detail-settings .promote-button+input,.ticket-detail-settings label+input{display:none}.ticket-detail-settings .item-block.is-active,.ticket-detail-settings .item-unblock.is-active{display:inline-block}.ticket-detail-settings .item-unblock{background:#ff8282}.ticket-detail-settings .item-unblock:hover{background:red}.ticket-detail-settings .button-delete{background:#ff8282}.ticket-detail-settings .button-delete:hover{background:red}.ticket-detail-settings svg{fill:#fff;height:100%}.single-project .track-container .icon path,.single-project .track-container .list-itemtype-track-likers.active path,.single-project .track-container .list-itemtype-track-watchers.active path{fill:currentcolor}.wizard-create-project{background:url(../images/invitation_bg.jpg) center center no-repeat;bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910;background-size:cover;color:#fff;text-align:center}.wizard-create-project p{font-size:.9rem}.wizard-create-project .close{font-size:2rem;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.open.wizard-create-project{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.wizard-create-project{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.wizard-create-project fieldset{margin-bottom:1rem}.wizard-create-project .button-gray,.wizard-create-project .button-green{display:block;padding:12px;text-align:center}.wizard-create-project form{width:500px}.wizard-create-project .title{text-align:center;width:100%}.wizard-create-project h1,.wizard-create-project p{color:#fff}.wizard-create-project h1{line-height:1.5rem}.wizard-create-project p{opacity:.8}.wizard-create-project input,.wizard-create-project select,.wizard-create-project textarea{background:rgba(255,255,255,.7)}.wizard-create-project input::-webkit-input-placeholder,.wizard-create-project select::-webkit-input-placeholder,.wizard-create-project textarea::-webkit-input-placeholder{color:#444}.wizard-create-project input::-moz-placeholder,.wizard-create-project select::-moz-placeholder,.wizard-create-project textarea::-moz-placeholder{color:#444}.wizard-create-project input:-moz-placeholder,.wizard-create-project select:-moz-placeholder,.wizard-create-project textarea:-moz-placeholder{color:#444}.wizard-create-project input:-ms-input-placeholder,.wizard-create-project select:-ms-input-placeholder,.wizard-create-project textarea:-ms-input-placeholder{color:#444}.wizard-create-project .close{color:#fff}.wizard-create-project .close:hover{color:#ff8282}.wizard-create-project .wizard-step{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out;-webkit-animation-direction:alternate-reverse;animation-direction:alternate-reverse;display:none}.wizard-create-project .wizard-step.active{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out}.wizard-create-project .wizard-step.active.create-step1,.wizard-create-project .wizard-step.active.create-step2,.wizard-create-project .wizard-step.active.create-step3{display:block}.wizard-create-project .wizard-action div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .wizard-action a{color:#fff;display:inline-block;-webkit-flex-basis:40%;-ms-flex-preferred-size:40%;flex-basis:40%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 .template-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .create-step1 fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 input{display:none}.wizard-create-project .create-step1 input:checked+label{background:rgba(157,206,10,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label{background:rgba(245,245,245,.7);cursor:pointer;display:block;margin-bottom:1rem;padding:1rem;text-align:center;-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label:hover{background:rgba(114,161,20,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label .icon{font-size:3rem;color:#fff}.wizard-create-project .create-step1 h2{color:#fff;margin:.5rem 0 0;text-transform:uppercase}.wizard-create-project .create-step1 p{text-align:center}.wizard-create-project .progress-bar{bottom:0;height:.5rem;left:0;position:absolute;width:100%}.wizard-create-project .step1 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:25%}.wizard-create-project .step1 .progress-state span:nth-child(1){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .step2 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:75%}.wizard-create-project .step2 .progress-state span:nth-child(1),.wizard-create-project .step2 .progress-state span:nth-child(2){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .progress-state{position:absolute;width:100%}.wizard-create-project .progress-state span{color:rgba(255,255,255,.5);display:inline-block;margin-left:-100px;position:absolute;text-align:center;top:-2rem;-webkit-transition:all 1s ease-in;transition:all 1s ease-in;width:200px}.wizard-create-project .progress-state span:nth-child(1){left:25%}.wizard-create-project .progress-state span:nth-child(2){left:75%}.wizard-create-project .progress-bar-wrapper{background:rgba(255,255,255,.3);height:.5rem}.wizard-create-project .bar{background:rgba(157,206,10,.9);height:.5rem;left:0;position:absolute;top:0;width:0}.create-project{background:url(https://lh4.googleusercontent.com/-k7YewfrSQ_Q/VGdNZND0NBI/AAAAAAAAD1A/UDZBeSGR7iM/w1465-h824-no/Ultimate%2BMaterial%2BLollipop%2BCollection%2B-%2B480) center center no-repeat;background-size:cover;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;bottom:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.create-project .tagline{font-size:2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#fff;line-height:2rem;text-transform:uppercase}.introjs-tooltip p,.single-project .description,.single-project .looking-for-people p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project fieldset{margin-bottom:1rem}.create-project .create-project-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.create-project h1{color:#fff;text-align:center}.create-project .logo,.create-project .tagline{margin-bottom:1rem;text-align:center}.create-project form{margin-bottom:2rem}.create-project input{background:#fff}.create-project input::-webkit-input-placeholder{color:#BDBDBD}.create-project input::-moz-placeholder{color:#BDBDBD}.create-project input:-moz-placeholder{color:#BDBDBD}.create-project input:-ms-input-placeholder{color:#BDBDBD}.create-project .button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.create-project .button:hover{background:#8c9eff}.create-project a:hover{color:#fff}.filters h2 .icon-arrow-right{font-size:1rem}.filters-inner .loading .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32;max-height:1rem;max-width:1rem}.profile .timeline-wrapper .spin img,.user-profile .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.filters h1 .icon{margin:0}.filters h2 .icon-arrow-right,.issues-table .subject span,.single-project h1{vertical-align:middle}.filters h2{font-size:1.2rem;margin-top:1rem}.filters input{background:#444;color:#fff}.filters input::-webkit-input-placeholder{color:#b8b8b8}.filters input::-moz-placeholder{color:#b8b8b8}.filters input:-moz-placeholder{color:#b8b8b8}.filters input:-ms-input-placeholder{color:#b8b8b8}.filters .icon-search{color:#b8b8b8;position:absolute;right:.7rem;top:.7rem}.filters-inner{opacity:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}.filters-inner .loading{margin:0;padding:8px;text-align:center;width:100%}.filters-applied{margin-top:.5rem}.filters-step-cat .save-filters{color:#fff;display:block;text-align:center}.filters-step-cat .my-filter-name{background:#444;color:#f5f5f5;width:100%}.filters-step-cat .my-filter-name::-webkit-input-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name::-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-ms-input-placeholder{color:#b8b8b8}.filters-cats{margin-top:2rem}.filters-cats li{border-bottom:1px solid #b8b8b8;text-transform:uppercase}.filters-cats .custom-filters .title{color:#72a114}.filters-cats a{color:#444;display:block;padding:.5rem 0 .5rem .5rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.filters-cats .icon{color:#444;float:right;opacity:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-overlay{background:-webkit-radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background-color:#f5f5f5}.introjs-helperLayer{border:1px solid rgba(157,206,10,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(68,68,68,.2)}.introjs-bullets ul li a.active{background:#9dce0a}.introjs-button{background-color:#72a114;background-image:none;border:0;border-radius:0;color:#fff;margin-top:10px;padding:.3rem .8rem;text-shadow:none}.introjs-button:focus,.introjs-button:hover{background:#9dce0a;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .looking-for-people h3,.single-project .looking-for-people p,.single-project .track-container .list-itemtype-track{font-size:.9rem}.single-project .description,.single-project .title{font-size:1rem}.single-project .single-project-intro{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.single-project .project-logo{margin-right:1rem;width:6rem}.single-project .project-logo img{width:100%}.single-project .single-project-title-wrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.single-project .intro-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem}.single-project .intro-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project h1{color:#3f51b5;display:inline-block;line-height:1.2;margin-bottom:0}.single-project .like-watch-container{margin-left:auto}.single-project .track-buttons-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{color:#BDBDBD;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.single-project .track-container .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.single-project .track-container .list-itemtype-track-likers,.single-project .track-container .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .track-container .list-itemtype-track-likers .icon,.single-project .track-container .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.single-project .project-data,.single-project .title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#3f51b5}.single-project .track-container .icon svg{height:1rem;width:1rem}.single-project .description{margin:0}.single-project .project-data{display:flex}.single-project .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#EEE;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem}.single-project .single-project-tags{margin-bottom:1rem;margin-top:1rem}.single-project .timeline{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-shrink:3;-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;max-width:960px;width:0}.single-project .looking-for-people img{width:100%}.single-project .involved-data{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-organization,.single-project .involved-team{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-organization li,.single-project .involved-team li{-webkit-flex-basis:24%;-ms-flex-preferred-size:24%;flex-basis:24%;margin-right:.14rem}.single-project .involved-organization li:nth-child(4n),.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-organization a,.single-project .involved-team a{display:block}.single-project .involved-organization img,.single-project .involved-team img{border-radius:.2rem;width:100%}.issues-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table .pop-status,.issues-table .pop-status a,.issues-table .table-main{font-size:.9rem}.issues-table .title{font-size:1rem}.empty-issues .title{font-size:1.2rem;text-transform:uppercase}.empty-issues p,.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.issues-table .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8}.issues-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .avatar,.kanban-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.issues-table .row.is-blocked{background:#ffe8e8}.issues-table .row.is-blocked .blocked-text{color:red;margin-right:.5rem}.issues-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#555}.issues-table .table-main{border-bottom:1px solid #ebebeb}.issues-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-webkit-flex-basis:60%;-ms-flex-preferred-size:60%;flex-basis:60%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes{color:#555;-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes.inactive{color:#b8b8b8}.issues-table .votes.is-voted{color:#9dce0a}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field{-webkit-box-flex:0;-webkit-flex:0 0 160px;-ms-flex:0 0 160px;flex:0 0 160px;max-width:160px}.issues-table .issue-assignedto{cursor:pointer;position:relative}.issues-table .issue-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .issue-assignedto figcaption{max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.issues-table .issue-assignedto .icon{opacity:0;position:absolute;right:0;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .pop-status{background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99}.issues-table .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.search-filter,.search-result-table{border-top:1px solid #f5f5f5}.issues-table .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.issues-table .pop-status.fix{bottom:0;top:auto}@media (max-width:1280px){.issues-table .created-field,.issues-table .level-field{display:none}}.empty-issues{margin-top:4rem;text-align:center}.empty-issues img{margin-bottom:1rem}.empty-issues p,.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem}.kanban-table-body,.kanban-table-header .task-colum-name,.kanban-table-header .task-colum-name .icon{font-size:1rem}.kanban-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table .vfold.task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold .kanban-task,.kanban-table .vfold.task-colum-name .icon-bulk,.kanban-table .vfold.task-colum-name .icon-closed-eye,.kanban-table .vfold.task-colum-name .icon-open-eye,.kanban-table .vfold.task-colum-name .icon-plus,.kanban-table .vfold.task-colum-name .icon-vfold,.kanban-table .vfold.task-colum-name .icon-vunfold,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1;max-width:30px;min-height:2.5rem;min-width:30px;width:30px}.kanban-table .readonly{cursor:auto}.kanban-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.kanban-table-header .kanban-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.kanban-table-header .task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem .5rem .5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name span{max-width:65%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kanban-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.kanban-table-header .task-colum-name .icon.hfold,.kanban-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.kanban-table-header .icon-closed-eye,.kanban-table-header .icon-open-eye{display:inline-block}.kanban-table-header .icon-closed-eye svg,.kanban-table-header .icon-open-eye svg{fill:#b8b8b8;height:1.1rem;margin-top:.25rem;width:1.1rem}.kanban-table-header .icon-closed-eye:hover svg,.kanban-table-header .icon-open-eye:hover svg{fill:#72a114}.kanban-table-header .icon-open-eye .svg-eye-closed{display:none}.kanban-table-header .icon-closed-eye .svg-eye-closed,.kanban-table-header .icon-open-eye .svg-eye-open{display:block}.kanban-table-header .icon-closed-eye .svg-eye-open{display:none}.kanban-table-body,.kanban-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.kanban-table-body{display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;overflow-y:auto;widows:300px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#b8b8b8;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#050505}.kanban-table-body .task-column .kanban-wip-limit{background:red;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-inner{display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.search-filter{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:0;z-index:9}.search-filter a{background:#fff;color:#b8b8b8;display:inline-block;margin-right:1rem;padding:1rem 1.25rem}.search-filter .icon,.search-filter a:hover .icon{margin-right:.4rem}.search-filter .name,.search-filter a:hover .name{padding-left:5px}.search-filter a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.search-filter a.active{border-left:1px solid #f5f5f5;border-right:1px solid #f5f5f5;color:#444;position:relative;top:1px}.search-filter a.active .icon{color:#9dce0a}.search-in input{background:#444;color:#fff}.search-in input::-webkit-input-placeholder{color:#b8b8b8}.search-in input::-moz-placeholder{color:#b8b8b8}.search-in input:-moz-placeholder{color:#b8b8b8}.search-in input:-ms-input-placeholder{color:#b8b8b8}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{color:#b8b8b8}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #f5f5f5}.search-result-table .user-story-name .icon{font-size:1rem;color:#b8b8b8}.empty-search-results .title{font-size:1.2rem;text-transform:uppercase}.empty-search-results p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.search-result-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.search-result-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row .ref{-webkit-flex-basis:30px;-ms-flex-preferred-size:30px;flex-basis:30px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .status{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.search-result-table .user-story-name span{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-table .user-story-name .icon:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.search-result-table .points,.search-result-table .status{position:relative}.search-result-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.search-result-table .avatar img{width:35px}.search-result-table .avatar .avatar-caption{display:block;margin-left:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:80px}.empty-search-results{margin-top:4rem;text-align:center}.empty-search-results img{margin-bottom:1rem}.empty-search-results p{margin:0}.team-filters nav li{font-size:1.6rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.table-team .team-header,.team-filters nav li:last-child{border-bottom:0}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters nav a{display:block;padding:1rem 0 1rem 1rem}.team-filters nav a.active,.team-filters nav a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.team-filters nav .active,.team-filters nav a.active.icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.team-filters nav .icon{color:#050505;float:right;opacity:0}.table-team .leave-project,.table-team .popover,.table-team .popover a{font-size:.9rem}.table-team .attribute .points{font-size:1.6rem}.table-team .attribute,.table-team .attribute .points,.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.policy-table .policy-table-header,.table-team .avatar .name,.table-team .team-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.table-team .row{padding:.5rem}.table-team .username{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:6;-webkit-flex:6;-ms-flex:6;flex:6;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{color:#050505;font-size:1.8rem}.table-team .attribute .points{color:#444}.table-team .attribute .top{color:#9dce0a;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{color:#b8b8b8;display:block}.table-team .leave-project .icon{margin-right:.2rem}.table-team .leave-project:hover .icon{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .hero{width:100%}.table-team .hero .row{background:#f5f5f5;border-bottom:0;margin:1rem 0}.table-team .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.table-team .avatar img{-webkit-flex-basis:66px;-ms-flex-preferred-size:66px;flex-basis:66px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:66px}.table-team .avatar figcaption{margin-left:1rem;width:65%}.table-team .avatar figcaption span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.table-team .avatar .name,.table-team .avatar .position{display:block;width:100%}.table-team .avatar .position{color:#b8b8b8}.table-team .popover{background:#050505;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99}.table-team .popover a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#050505;bottom:-5px;content:'';height:15px;left:50%;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:15px}.policy-table .policy-table-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{border-bottom:2px solid #b8b8b8}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none,.policy-table .policy-table-project{padding:1rem}.policy-table .policy-table-project{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#72a114;-webkit-transition:background .3s linear;transition:background .3s linear}.policy-table label{background:#b8b8b8;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#9dce0a;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear}.user-change-password fieldset{margin-bottom:1rem;width:50%}.user-change-password fieldset:last-child{margin-top:2rem}.user-change-password label{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;display:block;margin-bottom:.5rem}.user-change-password .button-green{color:#fff;display:block;padding:12px;text-align:center}.user-profile .image-help,.user-profile .use-default-image{font-size:.75rem}.user-profile .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;border:0;-webkit-transform-origin:center center;transform-origin:center center}.user-profile{max-width:780px}.user-profile form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.user-profile fieldset{margin-bottom:1rem}.user-profile label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.user-profile .project-details-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.user-profile .project-details-image .image,.user-profile .submit-button,.wiki-nav li .loading{width:100%}.user-profile .image-container{position:relative;margin-bottom:0}.user-profile .loading-overlay{display:none}.user-profile .loading-overlay.active{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.user-profile .image-help{line-height:1rem;margin-bottom:.5rem;text-align:center}.user-profile .use-default-image{text-align:center}.user-profile .use-default-image:hover{color:red}.user-profile .project-details-form-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.user-profile form{display:block}}.user-profile .delete-account{font-size:.9rem;display:block;margin-top:1rem}.wiki-nav li input{font-size:1rem}.attachment-list .attachment-settings .editable-settings,.attachment-list .attachment-settings .settings,.attachment-list .icon-delete,.wiki-nav li{font-size:1.2rem}.wiki-nav li{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.wiki-nav li:hover .icon{opacity:1;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li a{display:block;padding:1rem 0 1rem 1rem}.wiki-nav li a span{cursor:pointer}.wiki-nav li .icon{color:#050505;float:right;opacity:0;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li input{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background:#444;color:#f5f5f5}.wiki-nav li input::-webkit-input-placeholder{color:#b8b8b8}.wiki-nav li input::-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-ms-input-placeholder{color:#b8b8b8}.wiki-nav li .loading{margin:0;padding:8px;text-align:center}.wiki-nav .add-button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.wiki-summary .wiki-user-modification,.wiki-summary div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.wiki-summary .username{font-size:1.2rem;color:#9dce0a;white-space:nowrap}.wiki-summary{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary div{display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:1rem}.wiki-summary .number{line-height:2rem;top:0}.wiki-summary .wiki-user-modification{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary figure{margin-right:.3rem;width:32px}.attachment-gallery{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.attachment-gallery .single-attachment{margin-bottom:.5rem;margin-right:.5rem;max-width:200px}.attachment-gallery .single-attachment:hover .icon-delete{opacity:1}.attachment-gallery .single-attachment .attachment-image{display:inline-block}.attachment-gallery .single-attachment img{height:150px;margin-bottom:.2rem;width:200px}.attachment-gallery .single-attachment img:hover{-webkit-filter:saturate(150%) hue-rotate(60deg);filter:saturate(150%) hue-rotate(60deg);-webkit-transition:all .3s cubic-bezier(.01,.7,1,1);transition:all .3s cubic-bezier(.01,.7,1,1)}.attachment-gallery .single-attachment.deprecated img{opacity:.5}.attachment-gallery .single-attachment.deprecated .attachment-name{color:#BDBDBD}.attachment-gallery .single-attachment .attachment-data{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.attachment-gallery .single-attachment .attachment-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;max-width:175px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block}.attachments-empty,.attachments-header .attachments-title,.live-announcement-inner .title,.live-announcement-inner .warning a,.single-attachment .attachment-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.attachment-gallery .single-attachment .icon-delete{color:#ff5252;margin-left:auto;opacity:0;-webkit-transition:opacity .3s ease-in;transition:opacity .3s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.attachment-gallery .single-attachment .icon-delete:hover{color:#f44336}.attachment-gallery .single-attachment .loading-container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:150px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0 .5rem .5rem 0;width:200px}.attachment-gallery .single-attachment .loading-spinner{margin:0 auto;max-height:3rem;max-width:3rem}.attachment-list .single-attachment{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;position:relative}.attachment-list .single-attachment:hover .settings{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.attachment-list .single-attachment.deprecated,.attachment-list .single-attachment.deprecated .attachment-name a{color:#BDBDBD}.attachment-list .attachment-name{max-width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding-right:1rem}.attachment-list .attachment-comments,.attachment-list .editable-attachment-comment{-webkit-box-flex:2;-webkit-flex:2;-ms-flex:2;flex:2;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;margin-right:.5rem}.attachment-list .attachment-comments span,.attachment-list .editable-attachment-comment span{color:#757575}.attachment-list .attachment-size{-webkit-flex-basis:125px;-ms-flex-preferred-size:125px;flex-basis:125px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.attachment-list .attachment-settings{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:10%;-ms-flex-preferred-size:10%;flex-basis:10%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin-left:auto}.attachment-list .attachment-settings .editable-settings,.attachment-list .attachment-settings .settings{color:#BDBDBD}.attachment-list .attachment-settings .editable-settings:hover,.attachment-list .attachment-settings .settings:hover{color:#3f51b5}.attachment-list .attachment-settings .settings{opacity:0}.attachment-list .attachment-settings .editable-settings{opacity:1}.attachment-list .attachment-settings .icon-delete:hover{color:#f44336}.attachment-list .attachment-settings .icon-drag-v{cursor:move}.attachment-list .icon-delete{color:#BDBDBD}.attachment-list .icon-delete:hover{color:#f44336}.attachment-list .editable-attachment-deprecated{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:1rem}.attachment-list .editable-attachment-deprecated span{color:#BDBDBD}.attachment-list .editable-attachment-deprecated input{margin-right:.2rem;vertical-align:middle}.attachment-list .editable-attachment-deprecated input:checked+span{color:#424242}.attachment-list .percentage{background:rgba(63,81,181,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.more-attachments,.single-attachment{font-size:.9rem}.attachments-header .attachments-title{font-size:1rem;color:#424242;padding:0 1rem}.more-attachments span,.single-attachment .attachment-size{color:#BDBDBD}.attachments{margin-bottom:2rem}.attachments-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#EEE;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.attachments-header .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.attachments-header label{cursor:pointer;margin-left:1rem}.attachments-header label.add-attachment-button{background:#757575;border:0;display:inline-block;padding:.5rem;-webkit-transition:background .25s;transition:background .25s}.attachments-header label.add-attachment-button:hover{background:#8c9eff}.attachments-header label svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.attachments-header button{background:0 0;margin-right:.2rem}.attachments-header button.is-active svg,.attachments-header button:hover svg{fill:#8c9eff}.attachments-header button svg{fill:#BDBDBD;height:1.6rem;margin-bottom:-.2rem;width:1.6rem}.attachments-header input{display:none}.attachments-empty{font-size:1.2rem;border:3px dashed #EEE;color:#BDBDBD;margin-top:.5rem;padding:1rem;text-align:center}.single-attachment.ui-sortable-helper{background:#fff;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.single-attachment.sortable-placeholder{background:#EEE;height:40px}.single-attachment .attachment-name{padding-right:1rem}.single-attachment .attachment-name .icon{margin-right:.25rem}.single-attachment .attachment-name svg{height:1.2rem;width:1.2rem}.more-attachments{border-bottom:1px solid #BDBDBD;display:block;padding:1rem 0 1rem 1rem}.live-announcement,.live-announcement-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.more-attachments .more-attachments-num{color:#3f51b5;margin-left:.5rem}.more-attachments:hover{background:#fff;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.attachment-preview img{max-height:80vh;max-width:80vw}.live-announcement-inner .title{font-size:1.6rem;color:#107a8a;margin-bottom:.5rem}.live-announcement{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#98e0eb;display:flex;height:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;-webkit-transition:width .5s,height .5s;transition:width .5s,height .5s;-webkit-transition-delay:.5s;transition-delay:.5s;width:0;z-index:99}.live-announcement .live-announcement-inner{opacity:0;-webkit-transition:opacity .5s;transition:opacity .5s;width:100%}.live-announcement.visible{height:146px;pointer-events:auto;-webkit-transition-delay:0s;transition-delay:0s;width:100%}.live-announcement.visible .live-announcement-inner{opacity:1;-webkit-transition:opacity .5s .5s;transition:opacity .5s .5s}.live-announcement-inner{display:flex;max-width:1200px}.live-announcement-inner .announcement-decoration{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin-right:1rem}.live-announcement-inner .text{padding:1.25rem 3rem 1.25rem 2rem;position:relative;width:100%}.live-announcement-inner .warning,.live-announcement-inner .warning a{color:#107a8a}.live-announcement-inner .close{height:2.5rem;position:absolute;right:0;top:1rem;width:2.5rem}.live-announcement-inner .close svg{fill:#18b7cf;-webkit-transition:fill .2s;transition:fill .2s}.live-announcement-inner .close svg:hover{fill:#107a8a}.discover-header .project-number{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#72a114}.discover-header{background:url(../images/discover.png) bottom left repeat-x #f5f5f5;margin-bottom:2.5rem;padding:1rem 1rem 2rem;text-align:center}.discover-header .discover-header-inner{max-width:1200px;min-width:768px;margin:0 auto}.discover-header .title{font-size:3rem;margin-bottom:0}.discover-header form{margin:0 30%;position:relative}@media (max-width:767px){.discover-header .discover-header-inner{width:90%;min-width:0}.discover-header form{margin:0 .5rem}}.discover-header input[type=text]{background:#fff;border:0;padding:1rem;width:100%}.discover-header input[type=text]:focus{outline-color:#9dce0a}.discover-header input[type=text]:-webkit-autofill{background:rgba(135,155,137,.5)}.discover-header .search-button{position:absolute;right:1rem;top:1rem}.discover-header .search-button:hover svg{fill:#72a114}.discover-header svg{fill:#b8b8b8;height:1.5rem;-webkit-transition:all .2;transition:all .2;width:1.5rem}.discover-search-subfilter .results{font-size:.9rem}.discover-results-header .title{font-size:1.6rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;text-transform:uppercase}.discover-results-header .discover-results-header-inner{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.discover-results-header svg{width:1.1rem;height:1.1rem;fill:#b8b8b8}.discover-results-header h2{display:inline-block}.filter-discover-search .discover-search-filter{margin-right:1rem}.filter-discover-search .discover-search-filter.active{color:#72a114}.discover-search-subfilter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:relative}.discover-search-subfilter:after,.discover-search-subfilter:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.discover-search-subfilter:after{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:8px;margin-left:-8px}.discover-search-subfilter:before{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.discover-search-subfilter.most-liked-subfilter::after,.discover-search-subfilter.most-liked-subfilter::before{left:85%}.discover-search-subfilter.most-active-subfilter::after,.discover-search-subfilter.most-active-subfilter::before{left:95%}.discover-search-subfilter.ng-enter{-webkit-animation:dropdownFade .2s;animation:dropdownFade .2s}.discover-search-subfilter .results{color:#ff8282;display:block;padding:.5rem 1rem;-webkit-transition:all .2s;transition:all .2s}.discover-search-subfilter .results:hover{color:red}.discover-search-subfilter .filter-list{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 0 0 auto}.discover-search-subfilter .filter-list a{display:block;padding:.5rem 1rem;-webkit-transition:all .2s;transition:all .2s}.featured-project,.featured-projects-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.discover-search-subfilter .filter-list a:hover{background:#b8b8b8;color:currentColor}.discover-search-subfilter .filter-list a.active{background:#9dce0a;color:#f5f5f5}.featured-project .project-card-description,.featured-project .statistic{font-size:.9rem}.featured-project .project-card-name a{font-size:1.2rem}.featured-project .project-card-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.featured-projects .title{font-size:1.6rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#444;text-align:center}.featured-projects{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.featured-projects{width:90%;min-width:0}}.featured-projects-inner{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.featured-project{background:#fff;border:1px solid #f5f5f5;margin:.5rem;display:flex;-webkit-flex-basis:23%;-ms-flex-preferred-size:23%;flex-basis:23%;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:23%}.featured-project .tags-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.3rem}.featured-project .project-tag{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.featured-project .project-card-inner{padding:1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.featured-project .project-card-description{color:#555}.featured-project .project-card-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:auto}.featured-project .project-card-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.featured-project .project-card-statistics .svg-eye-closed{display:none}.featured-project .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.featured-project .project-card-name a,.featured-project .statistic.active{color:#72a114}.featured-project .statistic.active svg{fill:#72a114}.featured-project .project-card-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.featured-project .project-card-logo{display:inline-block;-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;width:50px;height:50px;margin-right:.5rem}.featured-project .project-card-logo img{width:100%}.featured-project .project-card-name{line-height:.9}.featured-project .project-card-name a:hover{color:#9dce0a}.featured-project .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8;margin:0 .5rem}@media (max-width:767px){.featured-project{-webkit-flex-basis:45%;-ms-flex-preferred-size:45%;flex-basis:45%}}@media (max-width:480px){.featured-project{-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%}}.filter-highlighted li,.highlighted-project .project-description,.highlighted-project .statistic{font-size:.9rem}.highlighted-project .project-title{font-size:1.2rem}.highlighted .title{font-size:1.6rem}.highlighted .empty-highlighted-project span{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted-project .project-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.highlighted{margin:1rem auto 4rem;max-width:1200px;min-width:768px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}@media (max-width:767px){.highlighted{width:90%;min-width:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.highlighted tg-most-active{margin-top:4rem}}.highlighted tg-most-active,.highlighted tg-most-liked{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.highlighted tg-most-liked{margin-right:8%}@media (max-width:767px){.highlighted tg-most-liked{margin-right:0}}.highlighted .most-active,.highlighted .most-liked{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.highlighted .header{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.highlighted .header svg{width:1.5rem;height:1.5rem;fill:#b8b8b8;margin:.5rem}.highlighted .title-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.highlighted .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#444;display:inline-block;margin:0}.empty-discover-results .title,.home-project .project-card-description,.home-wrapper .title-bar,.projects-empty p,.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted .highlighted-projects-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.highlighted .loading-container{margin-top:calc(50% - 1rem)}.highlighted .loading-spinner{display:block;margin:2rem auto;max-height:3rem;max-width:3rem}.highlighted .view-more-projects{margin-top:auto;width:100%}.highlighted .empty-highlighted-project{border:2px dashed #f5f5f5;padding:2rem;text-align:center}.highlighted .empty-highlighted-project svg{width:2rem;height:2rem;display:block;fill:#b8b8b8;margin:1rem auto}.highlighted .empty-highlighted-project span{color:#555;display:block}.filter-highlighted{position:relative}.filter-highlighted .current-filter{padding:1rem}.filter-highlighted .current-filter span{margin-left:.2rem;position:relative;top:.2rem}.filter-highlighted .filter-list{background:#000;position:absolute;right:0;top:1.5rem}.filter-highlighted .filter-list.ng-enter{-webkit-animation:dropdownFade .2s ease-in;animation:dropdownFade .2s ease-in}.filter-highlighted .filter-list.ng-leave{-webkit-animation:dropdownFade .2s ease-in;animation:dropdownFade .2s ease-in;-webkit-animation-direction:reverse;animation-direction:reverse}.filter-highlighted li{color:#fff;cursor:pointer;min-width:8rem;padding:.25rem .5rem}.filter-highlighted li:hover{background:rgba(157,206,10,.4)}.highlighted-project{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:9rem;-ms-flex-preferred-size:9rem;flex-basis:9rem;min-height:9rem;padding:1.5rem 0}.highlighted-project:nth-last-child(-n+2){border-bottom:0}.highlighted-project .project-logo{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;height:auto;margin-right:1rem;width:3rem}.highlighted-project .project-logo img{width:100%}.highlighted-project .project-data-container{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.highlighted-project .single-project-header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.highlighted-project .project-title{display:inline-block;margin-bottom:.5rem}.highlighted-project .project-title a{color:#72a114}.highlighted-project .project-title a:hover{color:#9dce0a}.highlighted-project .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8;margin-left:.5rem}.highlighted-project .project-description{color:#555;margin-bottom:0}.highlighted-project .project-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.highlighted-project .project-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.highlighted-project .project-statistics .svg-eye-closed{display:none}.highlighted-project .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.highlighted-project .statistic.active{color:#72a114}.highlighted-project .statistic.active svg{fill:#72a114}.discover-results .statistic{font-size:.9rem}.discover-search .discover-header form{margin:0 8rem;position:relative}.discover-search .discover-header .search-button{left:1rem;right:auto}.discover-search .discover-header .searchbox input{padding-left:3.5rem;padding-right:23rem}.discover-search .searchbox-filters{position:absolute;right:1rem;top:.7rem;width:auto}.discover-search .searchbox-filters input{display:none}.discover-search .searchbox-filters label{border-radius:4px;color:#b8b8b8;cursor:pointer;display:inline-block;padding:.4rem .75rem;-webkit-transition:all .2s;transition:all .2s;-webkit-transition-delay:.2s;transition-delay:.2s}.discover-search .searchbox-filters label.active{background:#9dce0a;color:#fff}.discover-search .searchbox-filters label:hover{background:#f5f5f5;color:#555}.discover-results{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.discover-results{width:90%;min-width:0}}.discover-results .discover-results-inner .spin{margin-top:4rem}.discover-results .list-itemtype-project{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:1rem 0}.discover-results .list-itemtype-project:last-child{border-bottom:0}.discover-results .list-itemtype-project-left{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%}.discover-results .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.discover-results .list-itemtype-project-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;vertical-align:middle}.discover-results .look-for-people{margin-left:.5rem}.discover-results .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8}.discover-results .project-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.discover-results .project-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.discover-results .project-statistics .svg-eye-closed{display:none}.discover-results .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.discover-results .statistic.active{color:#72a114}.discover-results .statistic.active svg{fill:#72a114}.discover-results .more-results{display:block;margin:0 20rem;-webkit-transition:inherit;transition:inherit}.discover-results div[tg-loading] img{display:block;margin:0 auto}.empty-discover-results{margin:4rem auto 1rem;max-width:1200px;min-width:768px;text-align:center}@media (max-width:767px){.empty-discover-results{width:90%;min-width:0}}.empty-discover-results img{margin-bottom:1rem}.empty-discover-results .title{font-size:1.2rem;margin:0;text-transform:uppercase}.external-app-wrapper .app-card a,.external-app-wrapper .app-card p,.external-app-wrapper .user-card a{font-size:.75rem}.external-app-wrapper .cancel{font-size:.9rem}.external-app-wrapper .app-card h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:6rem;margin:0 auto;width:6rem}.external-app-wrapper h1{margin-bottom:0}.external-app-wrapper .app-card,.external-app-wrapper .user-card{line-height:1.4;margin-bottom:2rem;text-align:left}.external-app-wrapper .app-card .card-inner,.external-app-wrapper .user-card .card-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.external-app-wrapper .app-card a,.external-app-wrapper .button-green,.external-app-wrapper .user-card a{display:block}.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.external-app-wrapper .app-card h3,.external-app-wrapper .app-card p,.external-app-wrapper .user-card h3,.external-app-wrapper .user-card p{margin:0}.external-app-wrapper .app-card a,.external-app-wrapper .user-card .card-inner{margin-bottom:.5rem}.external-app-wrapper .app-card .app-image{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.external-app-wrapper .user-card{background:#fff8e4;border:1px solid #f1e8cd;padding:1rem}.external-app-wrapper .user-card .user-image{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .cancel{display:block;margin-top:.5rem;text-align:left}@media (max-width:480px){.external-app-wrapper{margin:0;min-width:100%;padding:2rem 1rem;text-align:center;width:100%}}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #f5f5f5;cursor:pointer;-webkit-transition:background .2s;transition:background .2s;-webkit-transition-delay:.2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(157,206,10,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single>a,.working-on .duty-single>a{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.empty-ticket .data,.home-project .project-card-inner{-webkit-box-orient:vertical;-webkit-box-direction:normal}.watching .duty-single>a.blocked,.working-on .duty-single>a.blocked{background:rgba(255,130,130,.2);color:red}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper,.home-wrapper .title-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-wrapper{display:flex}.home-wrapper .duty-summary{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .project-list{width:250px}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.6rem;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#EEE;display:flex;margin:0 0 .5rem;padding:.9rem 1rem}.home-project .project-card-description,.home-project .statistic,.projects-empty p{font-size:.9rem}.home-project{background:#fff;border:1px solid #f5f5f5;margin:.5rem .5rem 1rem;cursor:pointer;-webkit-transition:.2s;transition:.2s;-webkit-transition-delay:.1s;transition-delay:.1s}.home-project .tags-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.3rem}.home-project .project-tag{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.home-project .project-card-inner{padding:1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home-project .project-card-description{color:#555}.home-project .project-card-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:auto}.home-project .project-card-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.home-project .project-card-statistics .svg-eye-closed{display:none}.home-project .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.empty-ticket,.home-project .project-card-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-project .statistic.active{color:#72a114}.home-project .statistic.active svg{fill:#72a114}.home-project .project-card-header{display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.home-project .project-card-logo{display:inline-block;-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;width:50px;height:50px;margin-right:.5rem}.home-project .project-card-logo img{width:100%}.home-project .project-card-name{line-height:.9}.home-project .project-card-name a{font-size:1.2rem;color:#72a114}.home-project .project-card-name a:hover{color:#9dce0a}.home-project .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8;margin:0 .5rem}.home-project:hover{border:1px solid #9dce0a}.projects-empty{text-align:center}.projects-empty svg{height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty svg path{fill:#f5f5f5}.projects-empty .create-project-button{display:block;margin-bottom:.25rem}.projects-empty .import-project-button{display:block}.watching-empty,.working-on-empty{margin-bottom:4rem}.watching-empty p,.working-on-empty p{margin:2rem 9rem 1rem;text-align:center}.empty-ticket{display:flex}.empty-ticket .data,.navbar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.empty-ticket:not(:last-child){border-bottom:1px solid #f5f5f5;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#e8e8e8;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:40vw}.empty-ticket .line:last-child{margin:0;width:20vw}.navbar{display:flex;height:40px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:relative}.navbar::after{background-size:200%;bottom:0;content:'';height:100%;left:0;position:absolute;right:0;top:0;z-index:-1}.navbar .nav-left,.navbar .nav-right{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.navbar .nav-left>a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left>a.logo{background:rgba(0,0,0,.2);padding:.4rem .75rem}.navbar .nav-left>a svg{height:1.6rem;max-height:1.6rem;max-width:2rem;width:1.6rem}.navbar .nav-left>a path{fill:#fff}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar a{color:#fff;display:inline-block;-webkit-transition:all .2s linear;transition:all .2s linear}.navbar a svg path{fill:#131a5c}.navbar a:hover{background:rgba(0,0,0,.2);color:#8c9eff}.navbar a:hover svg path{fill:#fff}.navbar a.user-avatar{min-width:200px;padding:0 0 0 2rem;text-align:right}.navbar a.user-avatar span{padding-right:1rem}.navbar img{height:2.5rem;padding-left:.5rem;vertical-align:middle}.navbar svg{height:1.2rem;max-height:1.2rem;max-width:1.2rem;width:1.2rem}.navbar svg path{fill:#fff;-webkit-transition:all .2s;transition:all .2s}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;display:block}.navbar .navbar-dropdown a{padding:.8rem .5rem}.navbar .navbar-dropdown{border-radius:2px;display:none;left:calc(50% - 350px/2);min-width:350px;position:absolute;top:2.4rem;z-index:999}.navbar-dropdown{background:#212121;border:1px solid #000;padding:.3rem}.navbar-dropdown.dropdown-user{left:calc(50% - 200px/2);min-width:200px}.navbar-dropdown.dropdown-user ul{margin-bottom:0}.navbar-dropdown ul{margin:0 0 .5rem;padding:0}.navbar-dropdown ul:after,.navbar-dropdown ul:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:rgba(33,33,33,0);border-bottom-color:#212121}.navbar-dropdown ul:after{border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown a{color:#BDBDBD;display:block;padding:.8rem .5rem}.navbar-dropdown .create-options,.profile-filter{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.navbar-dropdown a:hover{background:rgba(255,255,255,.1);color:#8c9eff}.navbar-dropdown a.create-organization-btn,.navbar-dropdown a.create-project-btn,.navbar-dropdown a.see-more-projects-btn{color:#fff;text-align:center}.navbar-dropdown a.create-organization-btn:hover,.navbar-dropdown a.create-project-btn:hover,.navbar-dropdown a.see-more-projects-btn:hover{color:#fff}.navbar-dropdown a.see-more-projects-btn{margin-bottom:.3rem}.navbar-dropdown a.create-project-btn{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.navbar-dropdown a.import-project-button{padding-left:.75rem;padding-right:.75rem}.navbar-dropdown .create-options{display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #f5f5f5}.profile-filter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile,.profile-filter .searchbox{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.profile-filter .searchbox{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{color:grayer;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs,.profile-projects,.profile-timeline{border-top:1px solid #f5f5f5}.profile-filter .searchbox input:focus{border-bottom:1px solid #b8b8b8;outline:0;-webkit-transition:border-bottom .3s ease-in;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#b8b8b8;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#050505}.profile .timeline-wrapper .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile{display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{background:#fff;margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;-webkit-transition:all .3s cubic-bezier(.09,.43,.35,.95);transition:all .3s cubic-bezier(.09,.43,.35,.95)}.profile .timeline-wrapper>div.ng-hide{opacity:0;padding-top:.5vh}.profile .timeline-wrapper .spin{margin:10% auto;width:3rem}.profile .profile-sidebar{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.profile .profile-sidebar .button-gray{display:block;margin-bottom:2rem;padding-left:2rem;padding-right:2rem}.profile .empty-tab{padding:5vh;text-align:center}.profile .empty-tab svg{margin:2rem auto;max-width:160px;text-align:center}.profile .empty-tab p{font-size:.9rem}.profile-bar .profile-stats .stat-name{font-size:.9rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username{font-size:1.2rem}.profile-bar h2{font-size:1.6rem}.profile-bar .profile-stats .stat-number,.profile-bar h1{font-size:2rem}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar .profile-organizations h3,.profile-bar .profile-stats .stat-number,.profile-bar h1{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-bar .profile-image-wrapper{height:200px;margin-bottom:1rem;overflow:hidden;position:relative}.profile-bar .profile-image-wrapper.is-current-user:hover img{-webkit-filter:brightness(40%) saturate(150%) hue-rotate(60deg);filter:brightness(40%) saturate(150%) hue-rotate(60deg);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1);-webkit-transition-delay:.3s;transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;-webkit-transform:translateY(100%);transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);-webkit-transition:all .3s cubic-bezier(.01,.7,1,1);transition:all .3s cubic-bezier(.01,.7,1,1)}.profile-bar .button-green{display:block;margin-bottom:1rem}.profile-bar .profile-data{position:relative}.profile-bar .flag{position:absolute;right:0;top:0;width:12px}.profile-bar .flag path{fill:#b8b8b8;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar .flag:hover path{fill:red;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar h1{line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar h2{color:#555;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#b8b8b8;margin-bottom:1rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#b8b8b8}.profile-bar .profile-stats{border-bottom:1px solid #f5f5f5;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1.25rem;padding:1rem .5rem}.profile-bar .profile-stats .stat{padding:0 .2rem;text-align:center}.profile-bar .profile-stats .stat-number{display:block;line-height:1}.profile-bar .profile-stats .stat-name{display:block}.profile-bar .profile-organizations{border-bottom:1px solid #f5f5f5;border-top:1px solid #f5f5f5;margin-bottom:1rem;padding:1rem 0}.profile-bar .profile-organizations h3{margin-bottom:.5rem}.profile-bar .profile-organizations .profile-organizations-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.profile-bar .profile-organizations .organization{background:#b8b8b8;border-radius:5px;height:45px;margin-right:.2rem;width:45px}.profile-bar .profile-quote{background:url(../images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contact-single .profile-contact-data h1 span{font-size:.9rem}.profile-contact-single .profile-contact-data .extra-info{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-contact-single .profile-contact-data h1,.profile-contact-single .profile-contact-data h1 span{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.profile-contacts{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.profile-contact-filters{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.profile-contact-filters a{border-bottom:2px solid #fff;color:#b8b8b8;display:inline-block;padding:1rem 1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-contact-filters a.active,.profile-contact-filters a:hover{border-bottom:2px solid #b8b8b8;color:#72a114}.profile-contact-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.8rem 1rem}.profile-contact-single .profile-contact-picture{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:1rem;max-width:54px}.profile-contact-single .profile-contact-picture img{border-radius:.2rem;width:100%}.profile-contact-single .profile-contact-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-contact-single .profile-contact-data h1{font-size:1.2rem;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;line-height:1.6;margin-bottom:0;text-transform:none}.profile-contact-single .profile-contact-data h1 span{background:#f5f5f5;color:#555;margin-left:1rem;padding:.1rem .3rem}.profile-contact-single .profile-contact-data p{color:#555;margin-bottom:0}.profile-contact-single .profile-contact-data .extra-info{color:#555}.profile-contact-single .profile-contact-data .position{margin-right:.3rem}.profile-contact-single .profile-project-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-left:auto;width:100px}.profile-contact-single .profile-project-stats div{color:#b8b8b8;margin-right:.5rem}.profile-contact-single .profile-project-stats div .icon{margin-right:.2rem;vertical-align:center}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{color:#b8b8b8;display:inline-block;padding:1rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#444;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #f5f5f5;border-right:1px solid #f5f5f5;position:relative;top:1px;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .icon{margin-right:.4rem}.profile-sidebar h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin-bottom:.5rem;padding:.5rem}.profile-sidebar h4 .icon{color:#b8b8b8;margin-right:.3rem;vertical-align:text-bottom}.profile-sidebar p{font-size:.9rem;color:#b8b8b8}.profile-sidebar a{color:#72a114}.profile-sidebar .trans-button{margin-bottom:1rem}.profile-projects .list-itemtype-project{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:10rem}.profile-projects .list-itemtype-project .project-list-single-title-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.profile-projects .list-itemtype-project .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:200px}.project-list-wrapper .help-area{font-size:.9rem;color:#b8b8b8;width:200px}.project-list-wrapper .drag{font-size:1.2rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:2rem 0 1rem;padding:.9rem 1rem}.project-list-wrapper .project-list-title h1{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.project-list-wrapper .create-options a.create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .create-options a.import-project-button{padding:.53rem .8rem}.project-list-wrapper .create-options a.import-project-button:hover{background:#444}.project-list-wrapper .create-options a.import-project-button .icon-upload{margin:0}.project-list-wrapper .project-list-section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .placeholder{background-color:#fdfdfd;height:5rem}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:#fcfef8;cursor:move;-webkit-transition:background .3s;transition:background .3s}.master,body{background:#fff}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .list-itemtype-project .list-itemtype-project-data-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-list-wrapper .list-itemtype-project .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.project-list-wrapper .drag{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;color:#b8b8b8;opacity:0;-webkit-transition:opacity .2s;transition:opacity .2s}.profile-timeline .single-attachment span{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child,.profile-timeline .activity-member-view a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-timeline .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32}.profile-timeline .activity-item{border-bottom:1px solid #f5f5f5;padding:1rem .5rem 1rem 0;position:relative}.profile-timeline .activity-item p{margin-bottom:0}.profile-timeline .activity-item .username,.profile-timeline .activity-item a{color:#72a114}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{color:#555}.profile-timeline .activity-item a:hover{color:#9dce0a}.profile-timeline .activity-item blockquote{line-height:1.4rem;margin-bottom:0;margin-left:calc(35px + 1rem);margin-top:.5rem;overflow-x:auto;overflow-y:hidden;white-space:pre-line}.profile-timeline .activity-item img{max-height:640px;max-width:640px}.profile-timeline .activity-item .activity-info{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#b8b8b8;font-size:.75rem;position:absolute;right:.5rem;top:1.2rem}.profile-timeline .activity-item .profile-contact-picture,.profile-timeline .activity-item .profile-member-picture{border-radius:.1rem;-webkit-flex-basis:2rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;vertical-align:center;width:2rem}.profile-timeline .activity-item .profile-contact-picture img,.profile-timeline .activity-item .profile-member-picture img{width:100%}.profile-timeline .activity-member-view{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-timeline .activity-member-view p{color:#b8b8b8}a,body{color:#424242}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.profile-timeline .single-attachment .icon{margin-right:.3rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{max-height:3rem;max-width:3rem}.markItUpEditor{font-size:.9rem;line-height:1.5;font-family:monospace}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-CondLight.woff) format("woff"),url(../fonts/OpenSans-CondLight.ttf) format("truetype"),url(../fonts/OpenSans-CondLight.svgOpenSans-CondLight) format("svg")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-Light.woff) format("woff"),url(../fonts/OpenSans-Light.ttf) format("truetype"),url(../fonts/OpenSans-Light.svgOpenSans-Light) format("svg")}@font-face{font-family:opensans-regular;src:url(../fonts/opensans-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-regular.woff) format("woff"),url(../fonts/opensans-regular.ttf) format("truetype"),url(../fonts/opensans-regular.svgopensans-regular) format("svg")}@font-face{font-family:opensans-semibold;src:url(../fonts/opensans-semibold.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-semibold.woff) format("woff"),url(../fonts/opensans-semibold.ttf) format("truetype"),url(../fonts/opensans-semibold.svgopensans-semibold) format("svg")}@font-face{font-family:taiga;src:url(../fonts/taiga.eot?#iefix) format("embedded-opentype"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype"),url(../fonts/taiga.svgtaiga) format("svg")}.menu-secondary{background:#fcfdff}.menu-tertiary{background-color:#1a237e}.extrabar{background:#fcfdff}h1,h2,h3,h4,h5,h6{color:#212121}a:hover{color:#3f51b5}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{background:#EEE;border-color:#3f51b5;color:#424242}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#a4a4a4}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#a4a4a4}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#a4a4a4}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a4a4a4}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{border:1px solid #f44336}.checksley-error-list{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(244,67,54,.7);color:#fff}blockquote{border-left:5px solid #8c9eff}blockquote,blockquote p,cite{color:#757575}.summary{background:#424242;color:#fff}.kanban-table-header .task-colum-name .icon,.taskboard-table-header .task-colum-name .icon{color:#3f51b5}.navbar{background:rgba(233,30,99,.6)}.navbar::after{background:url(../images/menu-vert.png) top left}tg-project-menu{background-color:#0d113f;background-image:none}.main-nav svg path{fill:#fff}.taskboard-table-header .task-colum-name{background:#f2f4ff;border-top:3px solid #3f51b5}.taskboard-table-body .taskboard-tasks-box{background:#EEE}.kanban-table-header .task-colum-name{background:#f2f4ff;border-top:3px solid #3f51b5}.kanban-table-body .kanban-uses-box{background:#EEE} \ No newline at end of file diff --git a/dist/v-1454172424320/styles/theme-taiga.css b/dist/v-1454172424320/styles/theme-taiga.css deleted file mode 100644 index 9e9b16a..0000000 --- a/dist/v-1454172424320/styles/theme-taiga.css +++ /dev/null @@ -1,4 +0,0 @@ -@charset "UTF-8";.introjs-arrow,blockquote::after,blockquote::before,q::after,q::before{content:''}.pika-table,table{border-collapse:collapse;border-spacing:0}.kanban-task-minimized .task-name,h1 .date,h1 span{text-overflow:ellipsis;white-space:nowrap}.lightbox textarea,.wizard-create-project textarea,textarea{resize:vertical}.change-entry .activity-fromto,.kanban-task-maximized .task-name,.profile-bar .not-full-name,.profile-bar h1{word-wrap:break-word}.codehilite .hll{background-color:#49483e}.codehilite .c{color:#75715e}.codehilite .err{color:#960050;background-color:#1e0010}.codehilite .k{color:#66d9ef}.codehilite .l{color:#ae81ff}.codehilite .n{color:#f8f8f2}.codehilite .o{color:#f92672}.codehilite .p{color:#f8f8f2}.codehilite .c1,.codehilite .cm,.codehilite .cp,.codehilite .cs{color:#75715e}.codehilite .ge{font-style:italic}.codehilite .gs{font-weight:700}.codehilite .kc,.codehilite .kd{color:#66d9ef}.codehilite .kn{color:#f92672}.codehilite .kp,.codehilite .kr,.codehilite .kt{color:#66d9ef}.codehilite .ld{color:#e6db74}.codehilite .m{color:#ae81ff}.codehilite .s{color:#e6db74}.codehilite .na{color:#a6e22e}.codehilite .nb{color:#f8f8f2}.codehilite .nc{color:#a6e22e}.codehilite .no{color:#66d9ef}.codehilite .nd{color:#a6e22e}.codehilite .ni{color:#f8f8f2}.codehilite .ne,.codehilite .nf{color:#a6e22e}.codehilite .nl,.codehilite .nn{color:#f8f8f2}.codehilite .nx{color:#a6e22e}.codehilite .py{color:#f8f8f2}.codehilite .nt{color:#f92672}.codehilite .nv{color:#f8f8f2}.codehilite .ow{color:#f92672}.codehilite .w{color:#f8f8f2}.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#ae81ff}.codehilite .s2,.codehilite .sb,.codehilite .sc,.codehilite .sd{color:#e6db74}.codehilite .se{color:#ae81ff}.codehilite .s1,.codehilite .sh,.codehilite .si,.codehilite .sr,.codehilite .ss,.codehilite .sx{color:#e6db74}.codehilite .bp,.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#f8f8f2}.codehilite .il{color:#ae81ff}.codehilite .gu{color:#75715e}.codehilite .gd{color:#f92672}.codehilite .gi{color:#a6e22e}.mCustomScrollbar{-ms-touch-action:none;touch-action:none}.mCustomScrollbar.mCS_no_scrollbar{-ms-touch-action:auto;touch-action:auto}.mCustomScrollBox{position:relative;overflow:hidden;height:100%;max-width:100%;outline:0;direction:ltr}.mCSB_container{overflow:hidden;width:auto;height:auto}.mCSB_inside>.mCSB_container{margin-right:30px}.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container{margin-right:0;margin-left:30px}.mCS-dir-rtl>.mCSB_inside>.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-left:0}.mCSB_scrollTools{position:absolute;width:16px;height:auto;left:auto;top:0;right:0;bottom:0;opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_outside+.mCSB_scrollTools{right:-26px}.mCS-dir-rtl>.mCSB_inside>.mCSB_scrollTools,.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{right:auto;left:0}.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{left:-26px}.mCSB_scrollTools .mCSB_draggerContainer{position:absolute;top:0;left:0;bottom:0;right:0;height:auto}.mCSB_scrollTools a+.mCSB_draggerContainer{margin:20px 0}.mCSB_scrollTools .mCSB_draggerRail{width:2px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCSB_scrollTools .mCSB_dragger{cursor:pointer;width:100%;height:30px;z-index:1}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{position:relative;width:4px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px;text-align:center}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:12px}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:8px}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonUp{display:block;position:absolute;height:20px;width:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools .mCSB_buttonDown{bottom:0}.mCSB_horizontal.mCSB_inside>.mCSB_container{margin-right:0;margin-bottom:30px}.mCSB_horizontal.mCSB_outside>.mCSB_container{min-height:100%}.mCSB_horizontal>.mCSB_container.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal{width:auto;height:16px;top:auto;right:0;bottom:0;left:0}.mCustomScrollBox+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:-26px}.mCSB_scrollTools.mCSB_scrollTools_horizontal a+.mCSB_draggerContainer{margin:0 20px}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:2px;margin:7px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger{width:30px;height:100%;left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:4px;margin:6px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:12px;margin:2px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:8px;margin:4px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{display:block;position:absolute;width:20px;height:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft{left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{right:0}.mCSB_container_wrapper{position:absolute;height:auto;width:auto;overflow:hidden;top:0;left:0;right:0;bottom:0;margin-right:30px;margin-bottom:30px}.mCSB_container_wrapper>.mCSB_container{padding-right:30px;padding-bottom:30px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:20px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:20px}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden+.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:20px}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container_wrapper{margin-right:0;margin-left:30px}.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden>.mCSB_container{padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden>.mCSB_container{padding-bottom:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0;margin-left:0}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;transition:opacity .2s ease-in-out,background-color .2s ease-in-out}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar{-webkit-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out}.introjs-helperLayer,.introjs-overlay{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out}.mCS-autoHide>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide>.mCustomScrollBox~.mCSB_scrollTools{opacity:0;filter:"alpha(opacity=0)";-ms-filter:"alpha(opacity=0)"}.mCS-autoHide:hover>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide:hover>.mCustomScrollBox~.mCSB_scrollTools,.mCustomScrollBox:hover>.mCSB_scrollTools,.mCustomScrollBox:hover~.mCSB_scrollTools,.mCustomScrollbar>.mCustomScrollBox>.mCSB_scrollTools.mCSB_scrollTools_onDrag,.mCustomScrollbar>.mCustomScrollBox~.mCSB_scrollTools.mCSB_scrollTools_onDrag{opacity:1;filter:"alpha(opacity=100)";-ms-filter:"alpha(opacity=100)"}.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.4);filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75);filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85);filter:"alpha(opacity=85)";-ms-filter:"alpha(opacity=85)"}.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9);filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp{background-image:url(mCSB_buttons.png);background-repeat:no-repeat;opacity:.4;filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_buttonUp{background-position:0 0}.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -20px}.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -40px}.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -56px}.mCSB_scrollTools .mCSB_buttonDown:hover,.mCSB_scrollTools .mCSB_buttonLeft:hover,.mCSB_scrollTools .mCSB_buttonRight:hover,.mCSB_scrollTools .mCSB_buttonUp:hover{opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_buttonDown:active,.mCSB_scrollTools .mCSB_buttonLeft:active,.mCSB_scrollTools .mCSB_buttonRight:active,.mCSB_scrollTools .mCSB_buttonUp:active{opacity:.9;filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCS-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:rgba(0,0,0,.85)}.mCS-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:rgba(0,0,0,.9)}.mCS-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:4px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px auto}.mCS-light-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px 0}.mCS-light-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -20px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -40px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px 0}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -20px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -40px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px 0}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:6px;margin:5px auto}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px 0}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -20px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -40px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px 0}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -20px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -40px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -56px}.mCS-light-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.1)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:2px}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:2px;margin:7px auto}.mCS-dark-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-rounded.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger,.mCS-rounded.mCSB_scrollTools .mCSB_dragger{height:14px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:14px;margin:0 1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger{width:14px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:14px;margin:1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:16px;height:16px;margin:-1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:4px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:16px;width:16px;margin:0 -1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:4px;margin:6px 0}.mCS-rounded.mCSB_scrollTools .mCSB_buttonUp{background-position:0 -72px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -92px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -112px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -128px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px -72px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -92px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -112px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools_vertical .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_vertical .mCSB_draggerRail{width:4px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{background-color:transparent;background-position:center}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAANElEQVQYV2NkIAAYiVbw//9/Y6DiM1ANJoyMjGdBbLgJQAX/kU0DKgDLkaQAvxW4HEvQFwCRcxIJK1XznAAAAABJRU5ErkJggg==);background-repeat:repeat-y;opacity:.3;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{height:4px;margin:6px 0;background-repeat:repeat-x}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px -72px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -92px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -112px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYV2NkIAAYSVFgDFR8BqrBBEifBbGRTfiPZhpYjiQFBK3A6l6CvgAAE9kGCd1mvgEAAAAASUVORK5CYII=)}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px -72px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -92px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -112px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-y;background-image:-moz-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to right,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-x;background-image:-moz-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to bottom,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-3d.mCSB_scrollTools_vertical .mCSB_dragger{height:70px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger{width:70px}.mCS-3d-dark.mCSB_scrollTools,.mCS-3d.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{width:8px;background-color:#000;background-color:rgba(0,0,0,.2);box-shadow:inset 1px 0 1px rgba(0,0,0,.5),inset -1px 0 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:8px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:8px;margin:4px 0;box-shadow:inset 0 1px 1px rgba(0,0,0,.5),inset 0 -1px 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:8px;margin:4px auto}.mCS-3d.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);box-shadow:inset 1px 0 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{box-shadow:inset 0 1px 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer,.mCS-3d-thick.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.mCSB_inside+.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCSB_inside+.mCS-3d-thick.mCSB_scrollTools_vertical{right:1px}.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCS-3d-thick.mCSB_scrollTools_vertical{box-shadow:inset 1px 0 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal,.mCS-3d-thick.mCSB_scrollTools_horizontal{bottom:1px;box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;box-shadow:inset 1px 0 0 rgba(255,255,255,.4);width:12px;margin:2px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4);height:12px;width:auto}.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{background-color:#000;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-thick-dark.mCSB_scrollTools{box-shadow:inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal{box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 1px 0 0 rgba(255,255,255,.4),inset -1px 0 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4),inset 0 -1px 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#777}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer{background-color:#fff;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{right:0;margin:12px 0}.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:0;margin:0 12px}.mCS-dir-rtl>.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCS-dir-rtl>.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{left:0;right:auto}.mCS-minimal-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_vertical .mCSB_dragger{height:50px}.mCS-minimal-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_horizontal .mCSB_dragger{width:50px}.mCS-minimal.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools .mCSB_draggerRail{width:6px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px}.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:6px;margin:5px 0}.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:12px}.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:12px;margin:2px 0}.mCS-light-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools .mCSB_draggerRail{width:12px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;margin:3px 5px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:6px;margin:5px 3px;position:absolute;width:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:12px;margin:2px 0}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent;border-width:1px;border-style:solid;border-color:#fff;border-color:rgba(255,255,255,.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail{border-color:#000;border-color:rgba(0,0,0,.2)}.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.6)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.6)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.dropdown-menu{border:1px solid #ddd;background-color:#fff}.dropdown-menu li{border-top:1px solid #ddd;padding:2px 5px}.dropdown-menu li:first-child{border-top:none}.dropdown-menu .active,.dropdown-menu li:hover{background-color:#6eb7db;color:#fff}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff}.dropdown-menu{list-style:none;padding:0;margin:0}.dropdown-menu a:hover{cursor:pointer}.markItUp .markItUpButton1 a{background-image:url(../images/markitup/h1.png)}.markItUp .markItUpButton2 a{background-image:url(../images/markitup/h2.png)}.markItUp .markItUpButton3 a{background-image:url(../images/markitup/h3.png)}.markItUp .markItUpButton4 a{background-image:url(../images/markitup/bold.png)}.markItUp .markItUpButton5 a{background-image:url(../images/markitup/italic.png)}.markItUp .markItUpButton6 a{background-image:url(../images/markitup/stroke.png)}.markdown .markItUpButton7 a{background-image:url(../images/markitup/list-bullet.png)}.markdown .markItUpButton8 a{background-image:url(../images/markitup/list-numeric.png)}.markdown .markItUpButton9 a{background-image:url(../images/markitup/picture.png)}.markdown .markItUpButton10 a{background-image:url(../images/markitup/link.png)}.markdown .markItUpButton11 a{background-image:url(../images/markitup/quotes.png)}.markdown .markItUpButton12 a{background-image:url(../images/markitup/code.png)}.markdown .preview-icon a{background-image:url(../images/markitup/preview.png)}.markdown .help a{background-image:url(../images/markitup/help.png)}.markItUp *{margin:0;padding:0;outline:0}.markItUp a:link,.markItUp a:visited{color:#000;text-decoration:none}.markItUpContainer{font:11px Verdana,Arial,Helvetica,sans-serif}.markItUpEditor{font:12px 'Courier New',Courier,monospace;padding:5px;height:320px;clear:both;overflow:auto}.markItUpPreviewFrame{overflow:auto;background-color:#FFF;width:99.9%;height:300px;margin:5px 0}.markItUpFooter{width:100%}.markItUpResizeHandle{overflow:hidden;width:22px;height:5px;margin-left:auto;margin-right:auto;background-image:url(../images/markitup/handle.png);cursor:n-resize}.markItUp .markItUpHeader ul{margin:0}.markItUpHeader ul li{list-style:none;position:relative;margin:3px}.markItUpHeader ul li:hover>ul{display:block}.markItUpHeader ul .markItUpDropMenu{background:url(../images/markitup/menu.png) 115% 50% no-repeat;margin-right:5px}.markItUpHeader ul .markItUpDropMenu li{margin-right:0}.markItUpHeader ul ul{display:none;position:absolute;top:18px;left:0;background:#FFF;border:1px solid #000}.markItUpHeader ul ul li{float:none;border-bottom:1px solid #000}.markItUpHeader ul ul .markItUpDropMenu{background:url(../images/markitup/submenu.png) 100% 50% no-repeat #FFF}.markItUpHeader ul .markItUpSeparator{margin:2px 10px 0;width:1px;height:16px;overflow:hidden;background-color:#CCC}.introjs-button,button{overflow:visible}.markItUpHeader ul ul .markItUpSeparator{width:auto;height:1px;margin:0}.markItUpHeader ul ul ul{position:absolute;top:-1px;left:150px}.markItUpHeader ul ul ul li{float:none}.markItUpHeader ul a{display:block;width:16px;height:16px;text-indent:-10000px;background-repeat:no-repeat;padding:3px;margin:0}.markItUpHeader ul ul a{display:block;text-indent:0;width:120px;padding:5px 5px 5px 25px;background-position:2px 50%}.markItUpHeader ul ul a:hover{color:#FFF;background-color:#000}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}mark{background:#ff0;color:#000}sub,sup{line-height:0;position:relative}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}optgroup{font-weight:700}/*! - * Pikaday - * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ - */.pika-single{display:block;position:relative;width:240px;padding:8px;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-title{position:relative;text-align:center}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;filter:alpha(opacity=0);opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.introjs-bullets ul,.introjs-button,.pika-select{display:inline-block}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-table{width:100%;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700;text-align:center}.pika-button{cursor:pointer;display:block;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.is-today .pika-button{color:#3af;font-weight:700}.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.pika-button:hover{color:#fff!important;background:#ff8000!important;box-shadow:none!important;border-radius:3px!important}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;position:absolute!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border-radius:4px;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0);filter:progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000);box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid #fff;position:absolute}.introjs-arrow.top,.introjs-arrow.top-middle,.introjs-arrow.top-right{top:-10px;border-color:transparent transparent #fff}.introjs-arrow.top-right{right:10px}.introjs-arrow.top-middle{left:50%;margin-left:-5px}.introjs-arrow.left,.introjs-arrow.right{top:10px}.introjs-arrow.right,.introjs-arrow.right-bottom{right:-10px;border-color:transparent transparent transparent #fff}.introjs-arrow.right-bottom{bottom:10px}.introjs-arrow.bottom{bottom:-10px;border-color:#fff transparent transparent}.introjs-arrow.left,.introjs-arrow.left-bottom{left:-10px;border-color:transparent #fff transparent transparent}.introjs-arrow.left-bottom{bottom:10px}.introjs-tooltip{position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{position:relative;margin:10px 0 0;text-decoration:none;font:11px/normal sans-serif;white-space:nowrap;cursor:pointer;outline:0;-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;zoom:1}.introjs-progress,.loader-active,.taskboard,.taskboard-inner,body.loading-project,h1 .date,h1 span{overflow:hidden}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-bullets{text-align:center}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0}.introjs-bullets ul li{list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{height:10px;margin:10px 0 5px;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{float:left;width:0;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.admin-membership header a,.header-with-actions .button,.kanban .kanban-settings,.save-wiki{float:right}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.master,fieldset{position:relative}body,html{width:100%;min-height:100%}*{box-sizing:border-box}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{border:0;font:inherit;font-size:100%;margin:0;padding:0;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}body{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.3}.icon{font-family:taiga}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body .master.ng-animate{-webkit-transition:0;transition:0}.drag-active{overflow-x:hidden}.master{height:100%;min-height:100%}.menu-secondary,.menu-tertiary,.wrapper{min-height:calc(100vh - 40px)}.centered{margin:1rem auto;max-width:1200px;min-width:960px;width:90%}.wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-secondary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary.filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0;-webkit-transition:all .2s linear;transition:all .2s linear;width:0}.menu-secondary.filters-bar.active{padding:2em 1em;-webkit-transition:all .2s linear;transition:all .2s linear;width:260px}.menu-secondary.filters-bar.active .filters-inner{opacity:1;-webkit-transition:all .4s ease-in;transition:all .4s ease-in}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;min-width:0;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions .action-buttons{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;margin-left:10px}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}h1 span,h2{font-size:1.6rem}h1{font-size:2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:1rem;text-transform:uppercase}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.ttf) format("truetype")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.ttf) format("truetype")}@font-face{font-family:OpenSans-Regular;src:url(../fonts/OpenSans-Regular.ttf) format("truetype")}@font-face{font-family:OpenSans-Semibold;src:url(../fonts/OpenSans-Semibold.ttf) format("truetype")}@font-face{font-family:taiga;font-style:normal;font-weight:400;src:url(../fonts/taiga.eot);src:url(../fonts/taiga.eot?) format("eot"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype")}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.5}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}.wysiwyg dl dt,strong{font-weight:700}h1 span{margin-right:.5rem;vertical-align:bottom}h1 span.green,h1 span:last-child{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#72a114}h1 .date{max-width:500px;color:#b8b8b8}h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.2;margin-bottom:1rem}p{line-height:1.5;margin:0 0 20px}p img{margin:0}em{font-style:italic}[class*=' icon-']::before,[class^=icon-]::before,[data-icon]::before{font-family:taiga!important;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal!important;font-variant:normal!important;font-weight:400!important;line-height:1;speak:none;text-transform:none!important}hr{border:solid #050505;border-width:1px 0 0;clear:both;height:0;margin:10px 0 30px}a,a:visited{text-decoration:none}a:hover,a:visited:hover{-webkit-transition:color .3s linear;transition:color .3s linear}[data-icon]::before{content:attr(data-icon)}.admin-contrib .help .alt-image,.admin-third-parties .help .alt-image,.wysiwyg dl dt{font-style:italic}.icon-bug::before{content:'a'}.icon-copy::before{content:'b'}.icon-minimize::before{content:'c'}.icon-maximize::before{content:'d'}.icon-comment::before{content:'e'}.icon-plus::before{content:'f'}.icon-attachments::before{content:'g'}.icon-edit::before{content:'h'}.icon-documents::before{content:'i'}.icon-delete::before{content:'j'}.icon-arrow-bottom::before{content:'k'}.icon-arrow-left::before{content:'l'}.icon-arrow-right::before{content:'m'}.icon-arrow-up::before{content:'n'}.icon-briefcase::before{content:'o'}.icon-caret-down::before{content:'p'}.icon-caret-up::before{content:'q'}.icon-check-square::before{content:'r'}.icon-notification-error::before{content:'s'}.icon-settings::before{content:'t'}.icon-document::before{content:'u'}.icon-warning::before{content:'v'}.icon-move::before{content:'w'}.icon-drag-v::before{content:'x'}.icon-filter::before{content:'y'}.icon-help::before{content:'z'}.icon-reload::before{content:'A'}.icon-writer::before{content:'B'}.icon-stats::before{content:'C'}.icon-floppy::before{content:'D'}.icon-warning-alt::before{content:'E'}.icon-video::before{content:'F'}.icon-bulk::before{content:'G'}.icon-vunfold::before{content:'H'}.icon-tasks::before{content:'I'}.icon-kanban::before{content:'J'}.icon-search::before{content:'K'}.icon-wiki::before{content:'L'}.icon-team::before{content:'M'}.icon-vfold::before{content:'N'}.icon-issues::before{content:'O'}.icon-iocaine::before{content:'P'}.icon-archive::before{content:'Q'}.icon-capslock::before{content:'R'}.icon-upload::before{content:'S'}.icon-github::before{content:'T'}.icon-timeline::before{content:'U'}.icon-scrum::before{content:'V'}.icon-project::before{content:'W'}.icon-heart::before{content:'X'}.icon-eye::before{content:'Y'}@-webkit-keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@-webkit-keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;flex:10}}@keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;-ms-flex:10;flex:10}}@-webkit-keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes blink{85%{opacity:1}100%{opacity:.6}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote cite,sup{font-size:.9rem}.spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32;max-height:2rem;max-width:2rem}blockquote,blockquote p{line-height:1.25rem}blockquote{margin:0 0 20px;padding:.5rem 1.25rem}blockquote cite{display:block}blockquote cite::before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}sup{vertical-align:super}.icon{vertical-align:middle}.clickable{cursor:pointer}.not-clickable{cursor:default}.draggable{cursor:move}svg{height:1rem;width:1rem}.pika-single{z-index:999999}.pika-single .pika-title{color:#444}.pika-single .is-selected .pika-button{background:#72a114;border-radius:0!important;box-shadow:inset 0 1px 3px #72a114}.pika-single .is-today .pika-button{color:#72a114}.pika-single .is-today.is-selected button{color:#fff}.pika-single .pika-button:hover{background:#9dce0a!important;border-radius:0!important;box-shadow:inset 0 1px 3px #9dce0a!important}fieldset{border:0;margin:0;padding:0;width:100%}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{border:1px solid;margin:0;padding:8px;width:100%}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{-webkit-transition:border .3s linear;transition:border .3s linear}button,button:active,button:focus{border:0;outline:0}textarea{min-height:10rem}.checksley-error-list{margin-bottom:0}.checksley-error-list li{padding:.2rem}.icon-capslock{bottom:.6rem;color:#555;display:none;position:absolute;right:1rem}.auth,.error-main{bottom:0;z-index:999;left:0}.admin-membership header:after{clear:both;content:'';display:table}.admin-membership .check input{height:40px;width:85px}.admin-roles p{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#b8b8b8}.auth .logo,.auth .tagline{color:#fff;text-align:center}.admin-attributes .admin-attributes-section{margin-bottom:2rem}.admin-attributes .admin-attributes-section .checksley-error-list{height:0;position:relative}.admin-attributes .admin-attributes-section .checksley-error-list li{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,0,0,.7);position:absolute;width:100%}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.project-values-title{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem;text-transform:uppercase}.project-values-title h2{margin:0}.auth .logo,.auth .tagline,.auth form{margin-bottom:1rem}.project-values-title h2 span{margin-left:.5rem;text-transform:none}.project-values-title a{display:inline-block}.auth{background:url(../images/bg.png) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:fixed;right:0;top:0}.invitation-main .avatar,.invitation-main .invitation-container,.kanban{-webkit-box-orient:vertical;-webkit-box-direction:normal}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.auth .logo{font-size:3rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.auth .auth-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{text-align:center;width:100%}.auth .logo-svg svg{height:8rem;width:8rem}.kanban,.taskboard{height:calc(100vh - 40px)}.auth fieldset{margin-bottom:.5rem}.auth .login-text,.auth .register-text{text-align:center}.auth .login-text a:hover,.auth .register-text a:hover{color:#9dce0a}.auth .button{color:#fff;display:block;text-align:center}.auth a:hover{color:#fff}.moustache{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moustache;animation-name:moustache;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;fill:rgba(114,161,20,.9);stroke:#9dce0a;stroke-width:1px;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transition:.3s;transition:.3s}.moustache:hover{fill:rgba(157,206,10,.9);-webkit-transition:.3s;transition:.3s}.list-itemtype-project .icon path,.list-itemtype-project .list-itemtype-track-likers.active path,.list-itemtype-project .list-itemtype-track-watchers.active path,.list-itemtype-ticket .icon path,.list-itemtype-ticket .list-itemtype-track-likers.active path,.list-itemtype-ticket .list-itemtype-track-watchers.active path,.list-itemtype-timeline .icon path,.list-itemtype-timeline .list-itemtype-track-likers.active path,.list-itemtype-timeline .list-itemtype-track-watchers.active path,.list-itemtype-user .icon path,.list-itemtype-user .list-itemtype-track-likers.active path,.list-itemtype-user .list-itemtype-track-watchers.active path{fill:currentcolor}@-webkit-keyframes moustache{0%,30%,70%,90%{-webkit-transform:rotate(0);transform:rotate(0)}10%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}@keyframes moustache{0%,30%,70%,90%{-webkit-transform:rotate(0);transform:rotate(0)}10%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}.backlog-menu{background:#f5f5f5;color:#050505;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .trans-button{color:#050505;display:inline-block;padding:.4rem 1.5rem}.backlog-menu .trans-button.active,.backlog-menu .trans-button:hover{background:#555;color:#f5f5f5}.backlog-menu .trans-button.active:hover{background:#a2a2a2}.backlog-menu .trans-button.move-to-sprint{display:none}.invitation-main,.invitation-main .invitation-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-menu .button-bulk{margin-left:.2rem}.invitation-main{background:url(../images/invitation_bg.jpg) center center no-repeat;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-size:cover;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;z-index:999}.invitation-main .invitation-form .forgot-pass{font-size:.9rem}.invitation-main .avatar .person-name,.invitation-main .invitation-text,.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.invitation-main .invitation-container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar .person-name{color:#fff}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{color:#fff;text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{color:#b8b8b8;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header,.invitation-main .register-text{color:#fff}.invitation-main .login-form,.invitation-main .register-form{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .register-text a{color:#72a114}.invitation-main .button-auth{display:block}.invitation-main .button-blackish:hover{background:#72a114}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.issues .filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:260px}.issues .filters-inner{opacity:1;padding:1rem}.kanban{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px)}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.error-main,.taskboard-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.error-main{background:url(../images/invitation_bg.jpg) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:fixed;right:0;top:0}.basic-table,.taskboard-inner{-webkit-box-orient:vertical;-webkit-box-direction:normal}.error-main .error-container{color:#fff;-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;text-align:center}.error-main .logo-svg{padding:0 32%;text-align:center;width:100%}.error-main h1{color:#fff;margin-bottom:3rem}.error-main a{color:#72a114}.error-main a:hover{color:#9dce0a}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.taskboard-inner{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%}.us-story-main-data .us-title,.us-story-main-data header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.team h2{margin:1rem 0}.team h2 span:last-child{color:#72a114}.us-story-main-data .us-title .block-desc-container,.us-story-main-data .us-title .us-related-task{font-size:.9rem}.us-story-main-data .us-title,.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{font-size:1.2rem}.us-story-main-data .us-title .us-title-text{font-size:1.6rem}.blocked-warning .blocked,.blocked-warning .icon,.issue-nav a{font-size:2rem}.blocked-warning .blocked{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.us-story-main-data .us-title,.us-story-main-data .us-title .us-number,.us-story-main-data .us-title .us-title-text{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.us-story-main-data .us-title .block-description-title,.us-story-main-data .us-title.blocked .unblock{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.card-placeholder p,.wiki .wiki-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32}.us-story-main-data{margin-bottom:1rem}.us-story-main-data header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.us-story-main-data .us-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:.5rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear}.us-story-main-data .us-title.blocked{background:red;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:middle}.us-story-main-data .us-title.blocked .us-title-text,.us-story-main-data .us-title.blocked input{margin-bottom:.5rem}.us-story-main-data .us-title.blocked .us-name,.us-story-main-data .us-title.blocked .us-number,.us-story-main-data .us-title.blocked .us-related-task{color:#fff}.us-story-main-data .us-title.blocked a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title.blocked a:hover{color:#ff8282}.us-story-main-data .us-title.blocked .unblock{color:#fff;float:right}.us-story-main-data .us-title.blocked .unblock:hover{color:#ff8282;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title p{margin-bottom:0}.us-story-main-data .us-title .us-edit-name-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.us-story-main-data .us-title .edit-subject{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.us-story-main-data .us-title input{background:#fff;-webkit-box-flex:9;-webkit-flex-grow:9;-ms-flex-positive:9;flex-grow:9}.us-story-main-data .us-title .save-container{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.us-story-main-data .us-title .us-title-text{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-bottom:0;max-width:92%}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{max-height:1.5rem;max-width:1.5rem}.us-story-main-data .us-title .us-title-text:hover .icon-edit{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.us-story-main-data .us-title .us-number{color:#b8b8b8;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;line-height:2.2rem;margin-right:.5rem}.us-story-main-data .us-title .us-name{color:#555;display:inline-block;line-height:2.2rem;padding-right:1rem;width:100%}.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{color:#b8b8b8;margin-left:.5rem}.us-story-main-data .us-title .icon-edit{opacity:0}.us-story-main-data .us-title .us-related-task{color:#b8b8b8;margin-top:.5rem}.us-story-main-data .us-title .us-related-task a{border-left:1px solid #b8b8b8;padding:0 .2rem}.us-story-main-data .us-title .us-related-task a:hover{color:#72a114}.us-story-main-data .us-title .us-related-task a:first-child{border:0}.us-story-main-data .us-title .block-description-title{color:#fff;margin-right:.5rem}.us-story-main-data .us-title .block-description{color:#fff;display:inline-block;margin-right:5rem}.basic-table,.subheader{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.blocked-warning{margin-bottom:1rem}.blocked-warning .blocked{color:red;line-height:2.5rem;margin-bottom:.5rem}.blocked-warning .icon{vertical-align:middle}.blocked-warning .block-description{color:#444;margin:0}.duty-content .edit-description,.wiki-content{margin-bottom:2rem}.issue-nav{position:absolute;right:1rem;top:1rem}.subheader{display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:1280px){.subheader{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}}.subheader .ticket-created-by{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-basis:250px;-ms-flex-preferred-size:250px;flex-basis:250px}@media (max-width:1280px){.subheader .ticket-created-by{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}}.subheader .tags-block{-webkit-box-flex:3;-webkit-flex:3;-ms-flex:3;flex:3}@media (max-width:1280px){.subheader .tags-block{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}}.duty-content{position:relative}.duty-content .in-progress{cursor:progress}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#f5f5f5;cursor:pointer}.duty-content:hover .view-description .no-description{color:#444}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#b8b8b8}.duty-content textarea{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-content .edit{color:#444}.duty-content .view-description .edit{background:#f5f5f5;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .save{top:.4rem}.duty-content .edit-description .edit{position:absolute;right:2.5rem;top:.4rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wiki .remove{font-size:.9rem;color:#b8b8b8}.wiki .wiki-title{font-size:1.6rem}.wiki .remove:hover span{color:#444;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove:hover .icon{color:red;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove .icon{color:#b8b8b8;margin-right:.2rem}.wiki-content{position:relative}.wiki-content .in-progress{cursor:progress}.wiki-content.editable:hover .wysiwyg{background:#f5f5f5;cursor:pointer}.wiki-content .view-wiki-content:hover .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .view-wiki-content .edit{background:#f5f5f5;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .icon:hover{color:#444;opacity:.3;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .preview-icon{position:absolute;right:3.5rem}.wiki-content .edit-wiki-content .action-container{position:absolute;right:1rem;top:.3rem}.wiki-content .edit-wiki-content .edit{position:absolute;right:3.5rem;top:.4rem}.wiki-content .preview{padding-top:1.8rem}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row,.card-placeholder .placeholder-avatar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.basic-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #ebebeb;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}.basic-table .row .width-1{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:4;-webkit-flex-grow:4;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:5;-webkit-flex-grow:5;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:7;-webkit-flex-grow:7;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.beta{left:0;position:absolute;top:0;z-index:9999}.button,.button-auth,.button-blackish,.button-bulk,.button-gray,.button-green,.button-red,.trans-button,a.button-gray,a.button-green{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:0 0;border:0;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;padding:.4rem 2rem;text-align:center;text-transform:uppercase;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:middle}.trans-button{font-size:1rem}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button:hover,.trans-button:hover{color:#fff;-webkit-transition:all .2s linear;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.trans-button span{-webkit-animation:loading .5s linear;animation:loading .5s linear}.admin-project-export-result .spin img,.loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.button span,.button-auth span,.button-blackish span,.button-bulk span,.button-gray span,.button-green span,.button-red span,.trans-button span{color:#fff}.button .icon,.button-auth .icon,.button-blackish .icon,.button-bulk .icon,.button-gray .icon,.button-green .icon,.button-red .icon,.trans-button .icon{color:#fff;margin-right:.3rem}.trans-button .icon,.trans-button span{color:#050505;-webkit-transition:color .2s linear;transition:color .2s linear}.trans-button.active .icon,.trans-button.active span,.trans-button:hover .icon,.trans-button:hover span{color:#72a114}.trans-button:visited{color:#050505}.submit-button{width:100%}.button-green,a.button-green{background:#72a114}.button-green.active,.button-green:hover,a.button-green.active,a.button-green:hover{background:#9dce0a;color:#fff}.button-gray,a.button-gray{background:#555}.button-gray.active,.button-gray:hover,a.button-gray.active,a.button-gray:hover{background:#9dce0a;color:#fff}.button-blackish{background:#050505;color:#f5f5f5}.button-blackish:hover{background:#050505;color:#fff}.button-red{background:#ff8282}.button-red:hover{background:red;color:#fff}.button-red .icon{color:#fff}.button-block{background:#fff;color:red}.button-block:hover{background:#ff8282;color:#fff}.button-bulk{background:#72a114;padding:.35rem .5rem}.button-bulk .icon{margin-right:0}.button-bulk:hover{background:#9dce0a}.button-auth{background:#444}.button-auth .icon,.button-auth img{font-size:1.2rem;color:#fff;margin-right:.5rem}.button-auth:hover{background:#000}.card-placeholder{background:#f0f0f0;border:1px dashed #e1e1e1;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:flex}.card-placeholder .image{background:#e1e1e1;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.card-placeholder .line{background:#e1e1e1;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{color:#555;margin:0}.check{background-color:#dcdcdc;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:500px;left:-10px;opacity:0;position:absolute;top:-10px;width:500px;z-index:999}.check input+div{background-color:#555;height:25px;-webkit-transition:all .2s linear;transition:all .2s linear;width:50%}.check input~.check-text{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff;position:absolute;top:.2rem}.check input~.check-yes{opacity:0;right:.5rem}.check input~.check-no{left:.5rem;opacity:.6}.check input:checked+div{background-color:#9dce0a;margin-left:50%;-webkit-transition:all .2s linear;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.check input:disabled{cursor:auto}.check input:disabled+div{background-color:#b8b8b8}.ticket-created-by{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}@media (max-width:1280px){.ticket-created-by{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:.5rem}}.ticket-created-by .user-avatar{-webkit-flex-basis:2rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-left:.5rem}.ticket-created-by .user-avatar img{width:100%}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block;text-align:right}.ticket-estimation .points-per-role,.wysiwyg-help{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}@media (max-width:1280px){.ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ticket-created-by .created-by{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{text-align:left}}.ticket-created-by .created-by .created-title{color:#72a114}.ticket-created-by .created-by .created-date{margin-left:.5rem}@media (max-width:1280px){.ticket-created-by .created-by .created-date{margin-left:0}}.drag-drop-help,.help-button,.help-markdown{font-size:.75rem}.wysiwyg-help{background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:-.5rem;padding:.25rem .5rem}.drag-drop-help{color:#555}.help-button:hover span,.help-markdown:hover span{-webkit-transition:color .2s linear;transition:color .2s linear}.help-button:hover .icon,.help-markdown:hover .icon{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.help-button .icon,.help-markdown .icon{margin-right:.2rem}.ticket-estimation .popover,.ticket-estimation .popover a,.ticket-estimation .popover.fix,.ticket-estimation .popover.fix a{font-size:.9rem}.ticket-estimation .popover,.ticket-estimation .popover.fix,.ticket-estimation .ticket-role-points .points,.ticket-estimation .ticket-role-points .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .points-per-role{display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.empty-burndown,.loading-bar{-webkit-box-orient:horizontal}.ticket-estimation .ticket-role-points{background:rgba(184,184,184,.2);color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.1rem;min-height:2rem;padding:.5rem 1rem;position:relative;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .ticket-role-points.clickable.active,.ticket-estimation .ticket-role-points.clickable:hover{background:rgba(157,206,10,.9);color:#f5f5f5}.ticket-estimation .ticket-role-points.clickable.active .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable.active .points,.ticket-estimation .ticket-role-points.clickable.active .role,.ticket-estimation .ticket-role-points.clickable:hover .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable:hover .points,.ticket-estimation .ticket-role-points.clickable:hover .role{color:#f5f5f5}.ticket-estimation .ticket-role-points:last-child{background:rgba(135,155,137,.5);border-bottom:0;color:#f5f5f5}.ticket-estimation .ticket-role-points:last-child .icon-arrow-bottom,.ticket-estimation .ticket-role-points:last-child .points,.ticket-estimation .ticket-role-points:last-child .role{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#f5f5f5}.ticket-estimation .ticket-role-points .icon-arrow-bottom{color:#b8b8b8;margin-left:.25rem;vertical-align:middle}.ticket-estimation .ticket-role-points .points{color:#444}.ticket-estimation .popover{background:#050505;color:#fff;display:none;left:.5rem;list-style-type:none;margin:0;padding:10px;position:absolute;top:100%;width:200px;z-index:99}.ticket-estimation .popover a{border-bottom:1px solid #444;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#050505;content:'';height:10px;left:10px;position:absolute;top:-5px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:10px}.ticket-estimation .popover li{display:inline-block;width:23%}.ticket-estimation .popover a{display:block;text-align:center}.ticket-estimation .popover a.active,.ticket-estimation .popover a:hover{background:#9dce0a;color:#fff}.ticket-estimation .popover.fix{background:#050505;color:#fff;display:none;left:-160px;list-style-type:none;margin:0;padding:10px;position:absolute;top:100%;width:200px;z-index:99}.ticket-estimation .popover.fix a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-estimation .popover.fix a:last-child{border:0}.ticket-estimation .popover.fix a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#050505;content:'';height:10px;left:90%;position:absolute;top:-5px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:10px}.single-filter{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;cursor:pointer;display:block;margin-bottom:.5rem;opacity:.5;position:relative}.single-filter:after{clear:both;content:'';display:table}.single-filter.active,.single-filter.selected,.single-filter:hover{color:#444;opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{background:#dcdcdc;display:block;width:100%}.single-filter .number{background:#c2c2c2;position:absolute;right:0;top:0}.single-filter .icon-delete{color:#444;position:absolute;right:.5rem;top:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.single-filter .icon-delete:hover{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task .avatar a,.kanban-task .task-text,.kanban-task-maximized .task-archived p,.kanban-task-maximized .task-points,.kanban-task-minimized .task-archived{font-size:.9rem}.kanban-task-minimized .icon-drag-h{font-size:1rem}.kanban-task .icon-drag-h,.kanban-task .icon-edit{font-size:1.2rem}.kanban-task .task-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.kanban-task{background:#fff8e4;border:1px solid #f1e8cd;box-shadow:none;cursor:move;margin:.2rem;position:relative}.kanban-task:last-child{margin-bottom:0}.kanban-task:hover .icon-drag-h,.kanban-task:hover .icon-edit{color:#cfc29b;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.kanban-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.kanban-task.ui-sortable-placeholder{background:#444}.kanban-task.blocked{background:red;border:1px solid #c00;color:#fff}.kanban-task.blocked a,.kanban-task.blocked span{color:#fff}.kanban-task.card-placeholder{background:#f0f0f0;border:3px dashed #e1e1e1;cursor:default}.kanban-task .kanban-tagline{border-color:#f1e8cd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.6rem}.kanban-task .kanban-tag{border-top:.3rem solid #f1e8cd;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.kanban-task .kanban-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.kanban-task .avatar-wrapper{-webkit-flex-basis:55px;-ms-flex-preferred-size:55px;flex-basis:55px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:55px}.kanban-task .avatar-wrapper img{width:100%}.kanban-task .avatar a{text-align:center}.kanban-task .avatar img{margin:0 auto}.kanban-task .avatar img:hover{border:2px solid #72a114;-webkit-transition:border .3s linear;transition:border .3s linear}.kanban-task .task-text{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 .5rem 0 .8rem}.kanban-task .task-assigned{color:#cfc29b;display:block}.kanban-task .task-num{color:#444;margin-right:.3rem}.kanban-task .loading{bottom:.5rem;position:absolute}.kanban-task .icon-drag-h,.kanban-task .icon-edit{color:#f1e8cd;opacity:0;position:absolute;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.kanban-task .icon-drag-h:hover,.kanban-task .icon-edit:hover{color:#e0cd91;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task-maximized .task-archived{background:#e8e8e8;padding:.5rem;text-align:left;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived:hover{background:#e1e1e1;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-maximized .task-archived span{color:#b8b8b8}.kanban-task-maximized .task-archived p{color:#b8b8b8;margin:0}.kanban-task-maximized .task-archived p:last-child{color:#555;margin:.5rem 0;text-align:center}.kanban-task-maximized .icon-edit,.kanban-task-maximized .loading{bottom:.2rem;right:.5rem}.kanban-task-maximized .icon-drag-h{font-size:2rem;bottom:.2rem;cursor:move;right:45%}.kanban-task-maximized .task-points{color:#e0cd91;margin:0}.kanban-task-maximized .task-points span{display:inline-block}.kanban-task-maximized .task-points span:first-child{padding-right:.2rem}.kanban-task-maximized .task-points .points-text{text-transform:lowercase}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{line-height:1.4;text-transform:none}.kanban-task-maximized .kanban-tag{border-top:.3rem solid}.kanban-task-minimized .kanban-task-inner{padding:0 .3rem}.kanban-task-minimized .task-archived{background:#e8e8e8;padding:.3rem;text-align:left}.kanban-task-minimized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-minimized .task-archived span{color:#b8b8b8}.kanban-task-minimized .task-archived .task-name{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kanban-task-minimized .task-archived p{color:#b8b8b8;margin:0}.kanban-task-minimized .task-archived p:last-child{display:none}.kanban-task-minimized .task-num{vertical-align:top}.kanban-task-minimized .task-name{display:inline-block;overflow:hidden;width:135px}.kanban-task-minimized .task-points{display:none}.kanban-task-minimized .icon-drag-h,.kanban-task-minimized .icon-edit{top:1.4rem}.kanban-task-minimized .icon-edit{bottom:.2rem;right:1rem}.kanban-task-minimized .icon-drag-h{cursor:move;right:.1rem;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.kanban-task-minimized .kanban-tag{border-top:.2rem solid}.level{background-color:#b8b8b8;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project .list-itemtype-track,.list-itemtype-ticket .list-itemtype-track,.list-itemtype-timeline .list-itemtype-track,.list-itemtype-user .extra-info,.list-itemtype-user .list-itemtype-track{font-size:.9rem}.list-itemtype-ticket h2{font-size:1rem}.list-itemtype-project h2,.list-itemtype-user h2,.loader p{font-size:1.2rem}.list-itemtype-project p,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.list-itemtype-project{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-project .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-project .list-itemtype-track-likers,.list-itemtype-project .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#72a114}.list-itemtype-project .icon svg{height:1rem;width:1rem}.list-itemtype-project h2,.list-itemtype-project p{margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-project .list-itemtype-avatar img{width:100%}.list-itemtype-project .list-itemtype-project-data-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;width:3rem}.list-itemtype-project .list-itemtype-project-members,.list-itemtype-project .list-itemtype-project-tags{-webkit-align-self:flex-end;-ms-flex-item-align:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-project .list-itemtype-project-image img{width:100%}.list-itemtype-project .list-itemtype-project-members{align-self:flex-end;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-wrap:wrap-reverse;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse;margin-top:1rem}.list-itemtype-project .list-itemtype-project-members img{border-radius:.1rem;margin-right:.3rem;width:2rem}.list-itemtype-project .list-itemtype-project-tags{align-self:flex-end;display:flex;-webkit-box-flex:3;-webkit-flex:3;-ms-flex:3;flex:3;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:.5rem}.list-itemtype-project .tag{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket h2,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user h2,.list-itemtype-user p{margin-bottom:0}.list-itemtype-ticket,.list-itemtype-timeline,.list-itemtype-user{border-bottom:1px solid #f5f5f5;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track{color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-ticket .list-itemtype-track-likers,.list-itemtype-ticket .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user,.list-itemtype-user .list-itemtype-track{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#72a114}.list-itemtype-ticket .icon svg{height:1rem;width:1rem}.list-itemtype-ticket .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-ticket .list-itemtype-avatar img{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-project{color:#b8b8b8}.list-itemtype-ticket .list-itemtype-ticket-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-id{color:#b8b8b8;margin-right:.3rem}.list-itemtype-ticket .ticket-blocked{color:red;margin-left:.3rem}.list-itemtype-user{display:flex}.list-itemtype-user .list-itemtype-track{color:#b8b8b8;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-user .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-user .list-itemtype-track-likers,.list-itemtype-user .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#72a114}.list-itemtype-user .icon svg{height:1rem;width:1rem}.list-itemtype-user .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .list-itemtype-avatar img{width:100%}.list-itemtype-user .extra-info{margin-top:.25rem}.list-itemtype-timeline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track{color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-timeline .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-timeline .list-itemtype-track-likers,.list-itemtype-timeline .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track-likers .icon,.list-itemtype-timeline .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-timeline .list-itemtype-track-likers.active,.list-itemtype-timeline .list-itemtype-track-watchers.active{color:#72a114}.list-itemtype-timeline .icon svg{height:1rem;width:1rem}.list-itemtype-timeline .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-timeline h2{margin-bottom:0}.admin-menu li,.empty-backlog .title,.empty-burndown .title,.sprints-empty .title,.taskboard-table-header .task-colum-name,.ticket-header .detail-status-inner,.ticket-header .ticket-title,.wysiwyg h1,.wysiwyg h2,.wysiwyg h3,tg-project-menu{text-transform:uppercase}.list-itemtype-timeline .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.loader p{color:#555;text-align:center}.loader{background-color:#fff;bottom:0;display:none;height:100%;left:0;opacity:0;position:fixed;right:0;top:0;z-index:-100}.loader .container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar,.notification-light{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.loading-bar{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:loadBar;animation-name:loadBar;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;background:#555;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{-webkit-animation-delay:0s;animation-delay:0s;background:#bbe831}.loading-bar .item-1{-webkit-animation-delay:1s;animation-delay:1s;background:#237400}.loading-bar .item-2{-webkit-animation-delay:2s;animation-delay:2s;background:#e43050}.loading-bar .item-3{-webkit-animation-delay:3s;animation-delay:3s;background:#810061}.loading-bar .item-4{-webkit-animation-delay:4s;animation-delay:4s;background:#618000}.loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;-webkit-transform-origin:32 32;transform-origin:32 32}.markItUpHeader ul{background:#f5f5f5;padding:.3rem}.markItUpHeader ul li{display:inline-block;float:none}.markItUpHeader ul li a{opacity:.8}.markItUpHeader ul li a:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.markItUpHeader ul .preview-icon{position:absolute;right:2.5rem}.markItUpContainer{padding:0}.markdown{position:relative}.preview .actions{background:#f5f5f5;margin-top:.5rem;min-height:2rem;padding:.3rem}.notification-light p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.notification-message-success .warning{font-size:1.2rem;color:#fff;line-height:1.2}.notification-message-error .warning{font-size:2rem;color:#fff;line-height:2.4rem}.notification-message-error .icon-notification-error{font-size:3rem;display:inline;vertical-align:sub}.notification-message-error .warning,.notification-message-success .warning{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.notification-message-success{background:rgba(157,206,10,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);opacity:1;right:-370px;top:2%;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{-webkit-animation:animSlide 2s linear both;animation:animSlide 2s linear both;opacity:1}.notification-message-success p{margin:0}@-webkit-keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}.notification-message-error{background:rgba(255,0,0,.9);top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error.inactive{-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-light p,.notification-message-error .text p{margin:0}.notification-message-error .icon-delete{color:#fff;position:absolute;right:1rem;top:1rem}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(184,184,184,.95);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;opacity:0;padding:1rem;position:absolute;top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s;width:100%;z-index:99999}.paginator ul,.summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.notification-light.inactive{opacity:0;-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s}.notification-light.active{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s;transition:all .6s}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{margin-right:1rem;width:2rem}.notification-light .close path{fill:#fff}.notification-message-light-error{background:rgba(255,0,0,.8)}.paginator{margin:2rem 0}.paginator ul{display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator .dots,.paginator a{background:#b8b8b8;color:#fff;padding:.5rem 1rem;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator a:hover{background:#050505;color:#fff;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator .active span{background:#9dce0a}.paginator .dots{background:0 0;color:#b8b8b8}.v-pagination-list{overflow:hidden}.v-pagination-next,.v-pagination-previous{background-color:#555;color:#f5f5f5;display:block;padding:.1rem 0;text-align:center;visibility:hidden;width:100%}.select-color,.select-color:after{background:#050505;position:absolute}.v-pagination-next:hover,.v-pagination-previous:hover{background-color:#050505;-webkit-transition:background .3s linear;transition:background .3s linear}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.private{display:inline-block;margin-left:.5rem;width:.5rem}.private svg{width:1rem;height:1rem}.private path{fill:#b8b8b8;-webkit-transition:fill .3s linear;transition:fill .3s linear}.select-color,.select-color a{font-size:.9rem}.select-color input{font-size:1rem}.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;border-radius:0 10px 10px 0;padding:15px}.select-color a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.select-color a:last-child{border:0}.select-color a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:15px}.select-color li{float:left;margin:0 .5rem .5rem 0}.select-color li:nth-child(7n){margin-right:0}.select-color li:nth-last-child(-n+7){margin-bottom:0}.select-color .color{background-color:#b8b8b8;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background-color:#f5f5f5;width:243px}.select-color input::-webkit-input-placeholder{color:#555}.select-color input::-moz-placeholder{color:#555}.select-color input:-moz-placeholder{color:#555}.select-color input:-ms-input-placeholder{color:#555}.select-color .selected-color{background:#b8b8b8;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.settings-nav .active{background:#fff}.summary .description{font-size:.9rem}.empty-burndown .title{font-size:1.2rem}.empty-burndown,.empty-burndown .title,.summary .description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.empty-burndown a,.summary .number{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.summary{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;padding:1em}.summary .summary-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .data .number{color:#9dce0a}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{line-height:1}.summary .stats{cursor:pointer;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .color-line,.summary .stats:hover .graph{fill:#9dce0a;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats.active .graph,.summary .stats.active svg,.summary .stats:hover svg{fill:#72a114}.summary .stats.active .color-line,.summary .stats.active .white-line{display:none}.summary .stats svg{fill:#000;height:100%;max-height:2rem;max-width:2rem;-webkit-transition:all .2s;transition:all .2s;width:100%}.summary .stats .color-line,.summary .stats .graph{fill:#858585;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats .white-line{fill:#444}.summary .stats .color-line,.summary .stats .white-line{display:block}.summary-progress-bar{background:#fff;height:30px;margin-bottom:0;margin-right:10px;padding:3px;position:relative;width:15%}.summary-progress-bar .current-progress{background:#9dce0a;height:24px}.summary-progress-bar .defined-points{background:#ff8282;height:24px;position:absolute;width:calc(100% - 6px)}.summary-progress-bar .project-points-progress{background:#fff;height:24px;position:absolute}.summary-progress-bar .closed-points-progress{background:#9dce0a;height:24px;position:absolute}.large-summary{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.large-summary .large-summary-wrapper{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.empty-burndown,.taskboard-task .taskboard-tagline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.large-summary .summary-progress-bar{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.empty-burndown,.upvote-btn{-webkit-align-content:center;-ms-flex-line-pack:center}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats-divider{margin-right:2rem}.large-summary .icon{font-size:1.4rem;margin-right:.4rem}.large-summary .icon.icon-stats{color:#72a114;float:right;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#9dce0a}.large-summary .icon.icon-stats.active:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.empty-burndown{align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(135,155,137,.15);display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{-webkit-flex-basis:5rem;-ms-flex-preferred-size:5rem;flex-basis:5rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;width:5rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.empty-burndown .title{color:#879b89;margin:0}.empty-burndown path{fill:#879b89}.empty-burndown a{-webkit-animation:blink 2s infinite;animation:blink 2s infinite}.graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.wysiwyg,.wysiwyg .codehilite{overflow:auto}.graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;-webkit-transition:none;transition:none}.tag,.tags-block .add-tag-text,.tags-block .tag{font-size:.9rem}.tags-block .icon-plus{font-size:1.2rem}.tag{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:#f5f5f5;border-radius:0 5px 5px 0;color:#444;display:inline-block;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.tag .icon-delete{color:#b8b8b8;margin-left:1rem}.tag .icon-delete:hover{color:red}.ui-autocomplete{background:#fff;border:1px solid #b8b8b8;z-index:99910}.ui-autocomplete .ui-state-focus{background:#9dce0a}.ui-autocomplete li{cursor:pointer}.ui-helper-hidden-accessible{display:none}.tags-block .tags-container{display:inline-block}.tags-block input{margin-right:.25rem;padding:.4rem;width:14rem}.tags-block input+.icon-floppy{margin-left:.5rem}.tags-block .tag{margin:0 .5rem .5rem 0;padding:.5rem}.tags-block .add-tag{color:#b8b8b8}.tags-block .add-tag:hover{color:#9dce0a}.taskboard-task .task-assigned,.taskboard-task .taskboard-text,.taskboard-task .taskboard-user-avatar a{font-size:.9rem}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit,.taskboard-task .icon-iocaine{font-size:1.2rem}.taskboard-task .task-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name,.watch-options a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.taskboard-task{background:#fff8e4;border:1px solid #f1e8cd;box-shadow:none;cursor:move;margin:.2rem;position:relative}.taskboard-task:hover .icon-drag-h,.taskboard-task:hover .icon-edit{color:#cfc29b;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.taskboard-task.ui-sortable-placeholder{background:#444}.taskboard-task .blocked{background:red;border:1px solid #c00;color:#fff}.taskboard-task .blocked a,.taskboard-task .blocked span,.taskboard-task .blocked:hover .icon-drag-h,.taskboard-task .blocked:hover .icon-edit{color:#fff}.taskboard-task.card-placeholder{background:#f0f0f0;border:3px dashed #e1e1e1;cursor:default}.taskboard-task .taskboard-tagline{border-color:#f1e8cd;display:flex;height:.6rem}.taskboard-task .taskboard-tag{border-top:.3rem solid #f1e8cd;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.taskboard-task .taskboard-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.taskboard-task .taskboard-user-avatar{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:55px}.taskboard-task .taskboard-user-avatar a{display:block;text-align:center}.taskboard-task .taskboard-user-avatar img{margin:0 auto}.taskboard-task .taskboard-user-avatar img:hover{border:2px solid #72a114;-webkit-transition:border .3s linear;transition:border .3s linear}.taskboard-task .iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.taskboard-task .icon-iocaine{background:#000;border-radius:5px;color:#fff;left:.2rem;padding:.1rem;position:absolute;top:1rem}.taskboard-task .task-assigned{color:#cfc29b;display:block}.taskboard-task .task-assigned:hover{color:#72a114}.taskboard-task .task-num{color:#444;margin-right:.5em}.taskboard-task .taskboard-text{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;padding:0 .5rem 0 1rem;word-wrap:break-word}.taskboard-task .icon{-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task .loading{bottom:.5rem;position:absolute}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit{bottom:.5rem;color:#f1e8cd;opacity:0;position:absolute}.taskboard-task .icon-drag-h:hover,.taskboard-task .icon-edit:hover{color:#cfc29b}.taskboard-task .icon-edit,.taskboard-task .loading{right:1rem}.taskboard-task .icon-drag-h{font-size:2rem;cursor:move;right:45%}.task-drag{box-shadow:1px 1px 15px 6px rgba(0,0,0,.1)}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;position:relative}.track-button .track-inner{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;background:#f5f5f5;border-radius:4px 0 0 4px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;margin-right:.1rem;min-width:140px}.track-button .track-button-counter,.watch-options a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.track-button .track-inner:hover{background:#e8e8e8;-webkit-transition:background .3s;transition:background .3s}.track-button .track-inner span{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.track-button .track-inner .icon-arrow-up{margin-left:auto;padding:0 .5rem;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.track-button:hover{color:#050505}.track-button.active .track-inner{background:rgba(157,206,10,.2)}.track-button.active .track-icon path{fill:#72a114}.track-button.watch-container{margin-right:1rem;position:relative}.track-button .track-icon{padding:.3rem .6rem .3rem .75rem}.track-button .track-icon svg{height:1.1rem;position:relative;top:2px;width:1.1rem}.track-button .track-icon path{fill:#444}.track-button .track-button-counter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;min-width:2rem}.like-button.active.is-hover .track-inner,.watch-button.active.is-hover .track-inner{background:red;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.like-button.active.is-hover path,.watch-button.active.is-hover path{fill:#ff8282}.watch-options{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;background:rgba(0,0,0,.9);border-radius:4px;margin:2.5rem 0 0;min-width:300px;padding:1rem;position:absolute;right:0;top:0;z-index:99}.watch-options.hidden{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse}.watch-options li{margin:0}.assigned-to-list,.ticket-watchers{margin-top:1rem}.watch-options li:last-child a{border:0}.watch-options a{border-bottom:1px solid rgba(184,184,184,.3);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.assigned-to-list .user-list-single,.upvote-btn{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.watch-options a.active{color:#9dce0a}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check path{fill:#9dce0a}.upvote-btn{align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#b8b8b8;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#879b89;-webkit-transition:background .3s;transition:background .3s}.upvote-btn a:hover path{fill:#879b89}.upvote-btn a.active{background:rgba(157,206,10,.2);color:#72a114;-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.active path{fill:#72a114}.upvote-btn a.is-hover{background:red;color:#f5f5f5}.upvote-btn a.is-hover svg{-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.is-hover path{fill:#ff8282}.upvote-btn svg{height:1rem;width:1rem}.assigned-to-list .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.upvote-btn span{display:block}.upvote-btn path{fill:#b8b8b8}.assigned-to-list .user-list-single{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #f5f5f5;display:flex;padding:.25rem 0;vertical-align:middle}.assigned-to-list .user-list-single:last-child{border:0}.assigned-to-list .user-list-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-name{color:#444;margin-left:.5rem}.assigned-to-list .user-list-single.selected,.assigned-to-list .user-list-single:hover{background:#f3fbe1;cursor:pointer}.assigned-to-list .user-list-single:hover{-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{background:#edfad4;cursor:pointer;margin-bottom:1rem;position:relative;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.1s;transition-delay:.1s}.assigned-to-list .user-list-single.is-active .icon-delete{opacity:1;position:absolute;right:1rem;top:1.5rem;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .user-list-single{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.25rem 0;vertical-align:middle}.ticket-watchers .user-list-single:last-child{border:0}.ticket-watchers .user-list-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-watchers .user-list-name{color:#444;margin-left:.5rem;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.ticket-watchers .user-list-single:hover .icon-delete{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .icon-delete{opacity:0;position:absolute;right:.5rem;top:0;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.ticket-watchers .icon-delete:hover{color:red;-webkit-transition:color .3s ease-in;transition:color .3s ease-in}.wysiwyg code,.wysiwyg pre{font-size:.9rem}.wysiwyg h2{font-size:1.2rem}.wysiwyg h1{font-size:2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.wysiwyg h2,.wysiwyg h3{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.wysiwyg{line-height:1.4rem;margin-bottom:2rem;padding:1rem}.wysiwyg h1{line-height:2.5rem}.wysiwyg h2{margin-bottom:.5rem}.wysiwyg ol,.wysiwyg ul{list-style-position:outside;margin-left:1rem}.wysiwyg ul{list-style-type:disc}.wysiwyg dl dt{font-size:1em;margin-top:16px;padding:0}.wysiwyg dl dd{margin-bottom:16px;padding:0 16px}.wysiwyg p,.wysiwyg table{margin-bottom:1rem}.wysiwyg a{color:#72a114}.wysiwyg a:hover{color:#9dce0a}.wysiwyg code,.wysiwyg pre{background:#5e5e5e;color:#f5f5f5;direction:ltr;font-family:'courier new',monospace;margin-bottom:1rem;overflow:auto;unicode-bidi:embed;white-space:pre}.admin-functionalities .functionality .title,.admin-membership-table .avatar .name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-membership-table .avatar figcaption span,.admin-submenu ul a span,.admin-submenu-roles .single-role,.admin-webhooks .webhook-url span,.custom-fields-table .custom-description{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wysiwyg pre{line-height:1.4rem;padding:.5rem}.wysiwyg table{border:1px solid #b8b8b8}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#b8b8b8 1px solid}.wysiwyg th{border-right:#b8b8b8 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#b8b8b8 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.wysiwyg textarea{background:#fff;max-height:none}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{color:#b8b8b8;margin-bottom:2rem}.admin-common .total{font-size:1.2rem;background-color:#f5f5f5;color:#444;padding:.3rem 1rem}.admin-common .total:hover .edit-value{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-field-options{margin-bottom:1rem;text-align:right}.custom-fields-table{margin-bottom:2em}.custom-fields-table .row{border-bottom:0;padding:.5rem 0}.custom-fields-table .table-header{border-bottom:3px solid #f5f5f5}.custom-fields-table .table-header .custom-description span,.custom-fields-table .table-header .custom-name span{padding-left:1.1rem}.custom-fields-table .table-body form:last-child .row{border:0}.custom-fields-table .table-body .row:hover{background:rgba(157,206,10,.05);cursor:move;-webkit-transition:background .2s linear;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag-v{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-fields-table .table-body form.row:hover{background:0 0;cursor:default}.custom-fields-table .table-body .custom-description{color:#b8b8b8}.custom-fields-table .single-custom-field{border-bottom:1px solid #f5f5f5;color:#555}.custom-fields-table .icon-drag-v{color:#b8b8b8;opacity:0;padding:0 .1rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .icon-drag-v:hover{color:#555;cursor:move;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{color:#555;margin-right:.5rem}.custom-fields-table .custom-name{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{max-width:100%;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.custom-fields-table .custom-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.admin-functionalities .functionality{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.3rem;margin-right:.3rem;opacity:.5;padding:1rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:top;width:32%}.admin-functionalities .functionality.active{background-color:rgba(114,161,20,.3);opacity:1}.admin-functionalities .functionality .icon{font-size:3rem;-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;margin:0 auto;min-width:60px}.admin-functionalities .functionality .desc{text-align:center;width:100%}.admin-functionalities .functionality .activate-input{display:none}.admin-functionalities .functionality .activate-input+label{color:#fff;cursor:pointer;display:block;text-align:center}.admin-functionalities .functionality .title{display:block}.admin-functionalities .functionality select{margin-top:1rem}.admin-functionalities .videoconference-attributes select{margin-bottom:.5rem}.admin-functionalities .button-green{color:#fff;display:block;text-align:center}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.admin-membership-table .avatar figcaption{margin-left:1rem;width:75%}.admin-membership-table .avatar figcaption span{width:100%}.admin-membership-table .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:35px}.admin-membership-table .avatar .email,.admin-membership-table .avatar .name{display:block;width:100%}.admin-membership-table .avatar .email{color:#b8b8b8}.admin-membership-table .header-role,.admin-membership-table .header-status{padding-left:.5rem}.admin-membership-table .row-role{padding-right:1rem}.admin-membership-table .row-status{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.admin-membership-table .active,.admin-membership-table .resend{padding:.4rem .5rem}.admin-membership-table .active{background-color:#f5f5f5}.admin-membership-table .resend{background-color:#72a114;color:#fff}.admin-membership-table .resend:hover{background-color:#9dce0a;color:#fff;-webkit-transition:background-color .3s linear;transition:background-color .3s linear}.admin-membership-table .delete{font-size:1.2rem;color:#b8b8b8}.admin-membership-table .delete:hover{color:red}.admin-membership-table .pending{color:#ff8282}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-webkit-flex-basis:210px;-ms-flex-preferred-size:210px;flex-basis:210px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.admin-menu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #dcdcdc}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.admin-project-export-result .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;-webkit-transform-origin:32 32;transform-origin:32 32}.project-details .loading-spinner,.ticket-assigned-to .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.admin-project-export-buttons{margin:2rem 0 1rem}.admin-project-export-result{margin-top:1rem}.admin-project-export-result .spin{margin:0 auto;width:2.5rem}.admin-project-export-result .spin img{width:100%}.admin-project-export-result h3{font-size:1.2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin:.5rem;padding:.5rem;text-align:center}.admin-roles .general-category,.admin-roles .role-name,.project-details .looking-for-people,.project-details label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-project-export-result p{color:#b8b8b8;margin:.5rem 0;text-align:center}.project-details .delete-project:hover,.project-details .use-default-image:hover{color:red}.project-details .delete-project,.project-details .image-help,.project-details .private-or-public,.project-details .use-default-image{font-size:.75rem}.project-details .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;border:0;-webkit-transform-origin:center center;transform-origin:center center}.project-details form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-details fieldset{margin-bottom:1rem}.project-details label{display:block;margin-bottom:.2rem}.project-details .project-details-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.project-details .project-details-image .image{width:100%}.project-details .image-container{position:relative;margin-bottom:0}.project-details .loading-overlay{display:none}.project-details .loading-overlay.active{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.project-details .image-help{line-height:1rem;margin-bottom:.5rem;text-align:center}.project-details .use-default-image{text-align:center}.project-details .project-details-form-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.project-details form{display:block}}.project-details .looking-for-people{border-bottom:1px solid #f5f5f5;border-top:1px solid #f5f5f5;padding:1rem 0}.project-details .looking-for-people-selector{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-details .looking-for-people-selector svg{width:1rem;height:1rem;fill:#b8b8b8;margin-left:.5rem}.project-details .looking-for-people-selector .check{margin-left:auto}.project-details .looking-for-people-reason{display:block;margin-top:1rem}.project-details .looking-for-people-reason.ng-hide-remove-active{-webkit-animation:dropdownFade .3s;animation:dropdownFade .3s}.project-details .looking-for-people-reason.ng-hide-add-active{-webkit-animation:dropdownFade .2s reverse;animation:dropdownFade .2s reverse;-webkit-animation-delay:.1s;animation-delay:.1s}.project-details .delete-project{display:block;margin-top:1rem;text-align:right}.project-details .private-or-public{color:#b8b8b8;margin-bottom:2rem}.project-details .private-or-public svg{width:1.1rem;height:1.1rem;fill:#b8b8b8;margin-right:.5rem;vertical-align:middle}.project-privacy-settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.project-privacy-settings .privacy-option{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-transition:.2 linear;transition:.2 linear}.project-privacy-settings .privacy-option:first-child{margin-right:.5rem}.project-privacy-settings input[type=radio],.project-privacy-settings input[type=text]{display:none}.project-privacy-settings label{background:#f5f5f5;color:#444;text-align:center;-webkit-transition:all .2s linear;transition:all .2s linear}.project-privacy-settings label:hover{background:rgba(157,206,10,.4);color:#444}.project-privacy-settings label:hover svg{fill:#444}.project-privacy-settings label svg{width:1.1rem;height:1.1rem;fill:#444;margin-left:.5rem;vertical-align:middle}.project-privacy-settings .privacy-project:checked+label{background:#9dce0a;color:#fff}.project-privacy-settings .privacy-project:checked+label svg{width:1.1rem;height:1.1rem;fill:#fff}.project-privacy-settings .privacy-project:checked~input[type=text]{display:block}.admin-roles .general-category{font-size:.9rem}.admin-roles .edit-value{font-size:1rem}.admin-roles .role-name{font-size:2rem;color:#444}.admin-roles .edit-value{color:#b8b8b8;cursor:pointer;margin-left:.5rem;opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-roles .edit-role{background-color:#f5f5f5;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .edit-role .icon-floppy{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .edit-role .icon-floppy:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .any-computable-role{background:red;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category .check{margin-left:.5rem}.admin-roles .general-category .check input{height:40px;width:85px}.admin-submenu-roles .single-role{max-width:175px;display:inline-block}.admin-submenu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.admin-contrib .help .alt-image,.admin-contrib .help code,.admin-contrib .select-input-text .help-copy,.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-body span,.admin-webhooks .history-single-response-header a{font-size:.9rem}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#8fa291;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a.active{background:#a3b2a4;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a span{display:block;max-width:85%}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#050505}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child,.admin-webhooks .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body .response-container,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-webhooks .table-header{border-bottom:1px solid #b8b8b8}.admin-webhooks .table-body .webhook-service{color:#555}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #f5f5f5}.admin-webhooks .webhooks-options{margin-bottom:1rem;text-align:right}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.admin-webhooks .webhook-url{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.admin-webhooks .webhook-url span{max-width:65%;color:#b8b8b8;display:inline-block;vertical-align:middle}.admin-contrib .help code,.admin-third-parties .help code{direction:ltr;line-height:1.4rem;unicode-bidi:embed;white-space:pre}.admin-webhooks .webhook-url a{color:#72a114;margin-left:.5rem}.admin-webhooks .webhook-url a:hover{color:#9dce0a}.admin-webhooks .webhook-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;min-width:100px;text-align:center}.admin-webhooks .webhook-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.admin-webhooks .webhook-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .webhooks-history.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #f5f5f5;margin-left:22%}.admin-webhooks .history-single{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(157,206,10,.1);-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single.history-single-open:hover{background:0 0}.admin-webhooks .history-single.history-single-open .icon-arrow-bottom{-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:-webkit-transform .3s linear;transition:-webkit-transform .3s linear;transition:transform .3s linear;transition:transform .3s linear,-webkit-transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s linear;transition:-webkit-transform .3s linear;transition:transform .3s linear;transition:transform .3s linear,-webkit-transform .3s linear}.admin-webhooks .history-response-icon{background:#555;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#9dce0a}.admin-webhooks .history-response-icon.history-error{background:red}.admin-webhooks .history-single-response{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header a,.admin-webhooks .history-single-response-header span:first-child{color:#b8b8b8}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .history-single-request-header .icon,.admin-webhooks .history-single-response-header .icon{margin-right:.3rem;vertical-align:middle}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-response-body .response-container{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin-bottom:.5rem}.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-response-body span{color:#b8b8b8;-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{border:0;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.admin-contrib h2,.admin-contrib label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-contrib .help h3,.admin-contrib .help ol span{font-family:opensans-semibold}.admin-contrib form{margin:1rem 0;max-width:700px;width:100%}.admin-contrib h2{font-size:1.2rem;margin-bottom:0}.admin-contrib fieldset{border-bottom:1px solid #f5f5f5;margin-bottom:1rem;padding-bottom:1rem}.admin-contrib .contrib-input{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.admin-contrib .contrib-test{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:7.5rem;-ms-flex-preferred-size:7.5rem;flex-basis:7.5rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-left:.5rem;text-align:center}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .contrib-form-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-contrib .select-input-text .help-copy{opacity:0}.admin-contrib .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-contrib .check-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0}.admin-contrib .help{margin-top:2rem}.admin-contrib .help h3{margin-bottom:1rem}.admin-contrib .help ol{padding:0 0 0 2rem}.admin-contrib .help .img{margin-bottom:1rem}.admin-contrib .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-contrib .help .code-info{padding-left:1rem}.admin-contrib .help .code-info li{margin-bottom:.5rem}.admin-contrib .help .code-info span{font-family:opensans-semibold}.default-values fieldset{margin-bottom:1rem}.default-values fieldset:last-child{margin-top:1.5rem}.default-values label,.default-values select{display:inline-block;width:49.7%}.default-values a{color:#fff;display:block;text-align:center}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field .icon{margin-right:.3rem}.project-csv .field-with-options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row .icon,.project-values-settings a{font-size:1.2rem}.admin-third-parties .help .alt-image,.admin-third-parties .help code,.admin-third-parties .select-input-text .help-copy,.backlog-table-body .doom-line span,.backlog-table-body .pop-points,.backlog-table-body .pop-points a,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open a,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-body .pop-role,.backlog-table-body .pop-role a,.backlog-table-body .pop-status,.backlog-table-body .pop-status a,.backlog-table-body .row,.backlog-table-body .tags-block .tag,.backlog-table-header .pop-points,.backlog-table-header .pop-points a,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open a,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom a,.backlog-table-header .pop-role,.backlog-table-header .pop-role a,.backlog-table-header .pop-status,.backlog-table-header .pop-status a,.backlog-table-header .row,.login-form-container .forgot-pass,.register-form-container .register-text{font-size:.9rem}.project-values-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{color:#b8b8b8;opacity:0}.project-values-row .icon:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.project-values-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #f5f5f5}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-header .points,.login-form-container .remember-me+label{cursor:pointer}.project-values-body .project-values-row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.project-values-name{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.project-values-value{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{color:#555;margin-right:.5rem}.project-values-settings a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.project-values-settings a:hover .icon-delete{color:red}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.admin-third-parties .help h3,.admin-third-parties .help ol span{font-family:opensans-semibold}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.admin-third-parties fieldset{margin-bottom:1rem}.admin-third-parties label{display:block;margin-bottom:.2rem}.admin-third-parties textarea{height:10rem}.admin-third-parties .submit-button{color:#fff;display:block;text-align:center}.cancel-account p,.change-email-form p,.change-password-text{color:#444;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-third-parties .help{margin-top:2rem}.cancel-account form,.change-email-form form{margin-top:1rem}.admin-third-parties .help h3{margin-bottom:1rem}.admin-third-parties .help ol{padding:0 0 0 2rem}.admin-third-parties .help .img{margin-bottom:1rem}.admin-third-parties .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-third-parties .help .code-info li,.cancel-account p{margin-bottom:.5rem}.admin-third-parties .help .code-info{padding-left:1rem}.admin-third-parties .help .code-info span{font-family:opensans-semibold}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-email-form p{margin-bottom:.5rem}.change-password-form-container .token-change-password{position:relative}.change-password-form-container input:focus+.get-token{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.change-password-form-container .get-token{font-size:.9rem;color:#b8b8b8;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.change-password-form-container .get-token:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.login-form-container .forgot-pass{color:#555;opacity:1;position:absolute;right:1rem;top:.6rem;-webkit-transition:all .3s linear;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.login-form-container .remember-me{vertical-align:top}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin-bottom:1rem;text-align:center}.backlog-table-header .backlog-table-title{font-size:1rem}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a,.empty-backlog .title{font-size:1.2rem}.backlog-table-body .doom-line span{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.backlog-table-body .pop-points,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-body .user-story-name a,.backlog-table-header .pop-points,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-role,.backlog-table-header .pop-status,.empty-backlog{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.backlog-table-body,.backlog-table-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.backlog-table-body.show-tags .tags-block,.backlog-table-header.show-tags .tags-block{display:block}.backlog-table-body .row,.backlog-table-header .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-subtitle:hover,.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-subtitle:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-subtitle .input,.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-subtitle .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-webkit-flex-basis:25px;-ms-flex-preferred-size:25px;flex-basis:25px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .votes,.backlog-table-body .backlog-table-title .votes,.backlog-table-body .row .votes,.backlog-table-header .backlog-table-subtitle .votes,.backlog-table-header .backlog-table-title .votes,.backlog-table-header .row .votes{color:#555;-webkit-flex-basis:65px;-ms-flex-preferred-size:65px;flex-basis:65px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .backlog-table-subtitle .votes.inactive,.backlog-table-body .backlog-table-title .votes.inactive,.backlog-table-body .row .votes.inactive,.backlog-table-header .backlog-table-subtitle .votes.inactive,.backlog-table-header .backlog-table-title .votes.inactive,.backlog-table-header .row .votes.inactive{color:#b8b8b8}.backlog-table-body .backlog-table-subtitle .votes.is-voted,.backlog-table-body .backlog-table-title .votes.is-voted,.backlog-table-body .row .votes.is-voted,.backlog-table-header .backlog-table-subtitle .votes.is-voted,.backlog-table-header .backlog-table-title .votes.is-voted,.backlog-table-header .row .votes.is-voted{color:#9dce0a}.backlog-table-body .backlog-table-subtitle .user-stories,.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-subtitle .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{overflow:hidden;width:100%}.backlog-table-body .backlog-table-subtitle .status,.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-subtitle .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .points,.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-subtitle .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-webkit-flex-basis:125px;-ms-flex-preferred-size:125px;flex-basis:125px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .points,.backlog-table-body .status,.backlog-table-header .points,.backlog-table-header .status{position:relative;text-align:right}.backlog-table-body .points .popover a,.backlog-table-body .status .popover a,.backlog-table-header .points .popover a,.backlog-table-header .status .popover a{text-align:left;width:100%}.backlog-table-body .points .popover .point,.backlog-table-body .status .popover .point,.backlog-table-header .points .popover .point,.backlog-table-header .status .popover .point,.empty-backlog,.sprints .loading,.sprints .sprint-table .sprint-empty{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{color:#b8b8b8;margin-left:.2rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-status a:last-child,.backlog-table-header .pop-status a:last-child{border:0}.backlog-table-body .pop-status a:hover,.backlog-table-header .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-status a:hover.point,.backlog-table-header .pop-status a:hover.point{color:#fff}.backlog-table-body .pop-status:after,.backlog-table-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-status.fix,.backlog-table-header .pop-status.fix{bottom:0;top:auto}.backlog-table-body .pop-role,.backlog-table-header .pop-role{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-role a:last-child,.backlog-table-header .pop-role a:last-child{border:0}.backlog-table-body .pop-role a:hover,.backlog-table-header .pop-role a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-role a:hover.point,.backlog-table-header .pop-role a:hover.point{color:#fff}.backlog-table-body .pop-role:after,.backlog-table-header .pop-role:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#9dce0a;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{background:#050505;bottom:10px;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px 3rem 10px 10px;position:absolute;width:150px;z-index:99}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points a:last-child,.backlog-table-header .pop-points a:last-child{border:0}.backlog-table-body .pop-points a:hover,.backlog-table-header .pop-points a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points a:hover.point,.backlog-table-header .pop-points a:hover.point{color:#fff}.backlog-table-body .pop-points:after,.backlog-table-header .pop-points:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{border-bottom:1px solid #444;color:#fff;padding:10px 2px}.backlog-table-body .pop-points-open a:last-child,.backlog-table-header .pop-points-open a:last-child{border:0}.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open a:hover.point,.backlog-table-header .pop-points-open a:hover.point{color:#fff}.backlog-table-body .pop-points-open:after,.backlog-table-header .pop-points-open:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{background:#050505;bottom:0;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:auto;width:200px;z-index:99}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open.pop-bottom a:last-child,.backlog-table-header .pop-points-open.pop-bottom a:last-child{border:0}.backlog-table-body .pop-points-open.pop-bottom a:hover,.backlog-table-header .pop-points-open.pop-bottom a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open.pop-bottom a:hover.point,.backlog-table-header .pop-points-open.pop-bottom a:hover.point{color:#fff}.backlog-table-body .pop-points-open.pop-bottom:after,.backlog-table-header .pop-points-open.pop-bottom:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open li,.backlog-table-header .pop-points-open li{display:inline-block;width:23%}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{display:block;text-align:center}.backlog-table-body .user-story-name,.sprints .sprint-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-table-body .pop-points-open a.active,.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a.active,.backlog-table-header .pop-points-open a:hover{background:#9dce0a;color:#fff}.backlog-table-header .backlog-table-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:2px solid #b8b8b8;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:30px}.backlog-table-header .header-points span{color:#b8b8b8}.backlog-table-body .row{border-bottom:1px solid #ebebeb;cursor:move;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag-v,.backlog-table-body .row:hover .us-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .is-checked,.backlog-table-body .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body input:checked{color:#9dce0a;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.backlog-table-body .user-story-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{display:inline-block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.backlog-table-body .user-story-name span{line-height:1.5}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff8282;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:red;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .blocked a{color:#fff!important}.backlog-table-body .blocked .icon,.backlog-table-body .blocked .icon:hover,.backlog-table-body .blocked a:hover{color:#fff}.backlog-table-body .doom-line{background:red;margin:.2rem 0;padding:.6rem 0;position:relative;width:100%}.backlog-table-body .doom-line span{color:#fff;position:absolute;right:.5rem;top:-3px}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;width:30px}.backlog-table-body .icon-drag-v:hover,.backlog-table-body .us-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .us-settings{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 0 0 2rem;opacity:0}.backlog-table-body .icon-drag-v{cursor:move;opacity:0;padding:.1rem .5rem 0 0}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.empty-backlog{padding:2rem}.empty-backlog img{margin-bottom:1rem}.empty-backlog .title{margin-bottom:.5rem}.empty-backlog a{color:#72a114}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint .description{font-size:.75rem}.sprints .filter-closed-sprints,.sprints .sprint-table .column-us,.sprints .us-item-row .user-story-name{font-size:.9rem}.sprints .sprint .number,.sprints .sprint .sprint-date,.sprints .sprint-name a,.sprints-empty .title{font-size:1.2rem}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint-header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#72a114;padding:.25rem .25rem 0;-webkit-transition:background .2s;transition:background .2s}.sprints .add-sprint:hover{background:#9dce0a}.sprints .add-sprint svg{height:1.4rem;max-height:1.4rem;max-width:1.5rem;width:1.5rem}.sprints .add-sprint path{fill:#f5f5f5}.sprints .filter-closed-sprints{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading-spinner{border:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;-webkit-transform-origin:center center;transform-origin:center center}.sprints .sprint-name a{max-width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;margin-right:3px}.sprints .sprint{margin-bottom:2rem;overflow:hidden}.sprints .sprint header{position:relative}.sprints .sprint:hover .icon-edit{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.sprints .sprint .icon{display:inline-block}.sprints .sprint .icon-arrow-up{-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:baseline}.sprints .sprint .icon-arrow-up.active{-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.sprints .sprint .icon-arrow-up:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.sprints .sprint .icon-edit{color:#b8b8b8;opacity:0;position:absolute;right:0;top:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;vertical-align:baseline}.sprints .sprint .icon-edit:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.sprints .sprint .description{line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{color:#b8b8b8;-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1}.sprints .sprint .sprint-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.sprints .sprint ul{margin:0}.sprints .sprint li{display:inline-block}.sprints .sprint li:first-child{margin-right:3px}.sprints .sprint-progress-bar{background:#b8b8b8;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#72a114;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table .sprint-empty{background:#e6e6e6;border:2px dashed #d2d2d2;color:#555;padding:1rem}.sprints .sprint-table .row{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:#d7d7d7;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .row.readonly,.taskboard-table .taskboard-task.readonly{cursor:auto}.sprints .sprint-table .row:last-child{border-bottom:0}.sprints .sprint-table .row.sortable-placeholder{background:#d7d7d7;height:40px}.sprints .sprint-table .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .column-us{-webkit-flex-flow:3;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{max-width:230px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.sprints .sprint-table .us-name.closed{color:#c5c5c5}.sprints .sprint-table .us-name.blocked{color:red}.sprints .sprint-table .column-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#c5c5c5}.sprints .sprint-table .column-points.blocked{color:red}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.sprints .us-item-row .icon-drag-v,.sprints .us-item-row .popover,.sprints .us-item-row .status,.sprints .us-item-row .tags-block,.sprints .us-item-row .us-settings,.sprints .us-item-row input,.taskboard-table-body .column-fold .taskboard-task .icon,.taskboard-table-body .column-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .column-fold .taskboard-task .taskboard-text,.taskboard-table-body .row-fold .taskboard-task .icon,.taskboard-table-body .row-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .row-fold .taskboard-task .taskboard-text{display:none}.sprints .us-item-row .user-story-name{line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#b8b8b8}.sprint-closed .sprint-progress-bar .current-progress{background:#9f9f9f}.sprint-closed .button-gray{background:#b8b8b8}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{margin-bottom:.5rem}.sprints-empty a{color:#72a114}.taskboard-userstory-box .points-value{font-size:.9rem}.taskboard-table-header .task-colum-name,.taskboard-table-header .task-colum-name .icon{font-size:1rem}.taskboard-table-body .column-fold .taskboard-task,.taskboard-table-body .row-fold .taskboard-task{background:0 0;border:0;margin:0;min-height:0}.category-config,.ticket-assigned-to{border-bottom:1px solid #b8b8b8}.category-config:first-child,.ticket-assigned-to{border-top:1px solid #b8b8b8}.taskboard-table-body .column-fold .taskboard-task .taskboard-task-inner,.taskboard-table-body .row-fold .taskboard-task .taskboard-task-inner{padding:.2rem}.taskboard-table-body .column-fold .taskboard-task .avatar,.taskboard-table-body .row-fold .taskboard-task .avatar{height:35px;width:35px}.taskboard-table-body .column-fold .taskboard-task.ui-sortable-helper,.taskboard-table-body .row-fold .taskboard-task.ui-sortable-helper{box-shadow:none}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .row-fold .task-column,.taskboard-table-body .task-column.column-fold,.taskboard-table-body .task-column.row-fold{-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .column-fold .avatar-task-link,.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table,.taskboard-table-header .taskboard-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;overflow:hidden}.taskboard-table{display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;width:100%}.taskboard-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:flex;position:absolute}.taskboard-table-header .task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-header .task-colum-name .icon:hover{color:#72a114}.taskboard-table-header .task-colum-name .icon.hfold,.taskboard-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.taskboard-table-header .task-colum-name.column-fold{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.3rem 0}.taskboard-table-header .task-colum-name.column-fold span{display:none}.taskboard-table-header .task-colum-name.column-fold .hfold,.taskboard-table-header .task-colum-name.column-fold .hunfold{margin:0}.taskboard-table-body{height:100%;overflow:auto;width:100%}.taskboard-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;width:300px}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .column-fold .taskboard-task{max-width:40px;width:40px}.taskboard-table-body .task-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;min-height:10rem;width:100%}.taskboard-table-body .avatar-task-link,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .icon-plus,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .task-row:hover .new-task{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(255,0,0,.6)}.taskboard-table-body .task-row.blocked .points-value,.taskboard-table-body .task-row.blocked .points-value:hover,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a:hover{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(255,0,0,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-table-body .taskboard-userstory-box .icon{color:#b8b8b8;position:absolute;right:.5rem;top:.7rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-body .taskboard-userstory-box .icon:hover{color:#72a114}.taskboard-table-body .taskboard-userstory-box .icon.icon-plus{right:2rem}.taskboard-table-body .taskboard-userstory-box .icon.icon-vfold,.taskboard-table-body .taskboard-userstory-box .icon.icon-vunfold{left:0;right:inherit}.taskboard-table-body .avatar-assigned-to{display:block}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .tag-list{display:none;margin-bottom:1rem}.taskboard-userstory-box .us-title{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{color:#b8b8b8}.taskboard-userstory-box .points-value span{margin-right:.1rem}.points-list a{color:#72a114;margin-left:.5rem}.points-list a:hover span{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.points-list span{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.ticket-assigned-to{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:1rem 0;position:relative}.ticket-assigned-to:hover .assigned-to .icon-delete{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;-webkit-transform-origin:32 32;transform-origin:32 32;margin:1rem auto;max-height:2rem;max-width:2rem}.filters-inner .loading .loading-spinner,.lightbox-generic-loading .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.ticket-assigned-to .user-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;position:relative}.ticket-assigned-to .user-avatar img{width:100%}.ticket-assigned-to .user-avatar.is-iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.ticket-assigned-to .user-avatar .iocaine-symbol{left:-.5rem;position:absolute;top:-.75rem;z-index:9}.ticket-assigned-to .user-avatar .iocaine-symbol svg{background:#444;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.ticket-assigned-to .assigned-to{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-to .assigned-to .assigned-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block;margin:.2rem 0 .25rem}.ticket-assigned-to .assigned-to .assigned-to-options{display:inline-block}.category-config .category-item,.category-config .resume{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.ticket-assigned-to .assigned-to .assign-to-me,.ticket-assigned-to .assigned-to .user-assigned{color:#72a114;cursor:default}.ticket-assigned-to .assigned-to .assign-to-me:hover,.ticket-assigned-to .assigned-to .user-assigned:hover{cursor:pointer}.ticket-assigned-to .assigned-to .assign-to-me .icon,.ticket-assigned-to .assigned-to .user-assigned .icon{vertical-align:middle}.ticket-assigned-to .assigned-to .assign-to-me>span,.ticket-assigned-to .assigned-to .user-assigned>span{max-width:80%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.ticket-assigned-to .assigned-to .icon-delete{color:#b8b8b8;opacity:0;position:absolute;right:0;top:2rem}.ticket-assigned-to .assigned-to .icon-delete:hover{color:red}.category-config .resume{-webkit-box-align:space-between;-webkit-align-items:space-between;-ms-flex-align:space-between;align-items:space-between;cursor:pointer;display:flex;padding:1rem;position:relative}.category-config .resume-title{width:280px}.category-config .count{color:#b8b8b8;float:left;padding-right:5px}.category-config .summary-role{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#b8b8b8;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#72a114}.category-config .summary-role .role-summary-single.inactive{background:#555}.category-config .icon{font-size:2rem;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;text-align:right}.category-config .category-items{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden;background-color:#f5f5f5;width:100%}.category-config .category-items.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.colors-table .row,.duty-custom-fields .custom-fields-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #f5f5f5}.colors-table .icon,.colors-table .icon-check-square{font-size:1.2rem}.colors-table .table-header:hover{background:0 0}.colors-table .table-header .row{padding-left:50px}.colors-table form:last-child .row{border:0}.colors-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.colors-table .row.edition .current-color,.duty-custom-fields form label{cursor:pointer}.colors-table .row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.colors-table .row:last-child{border:0}.colors-table .row.edition,.colors-table .row.new-value{padding-left:50px}.colors-table .row.hidden{display:none}.colors-table .row .color-column{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100px;position:relative}.colors-table .row .is-archived-column,.colors-table .row .is-closed-column,.colors-table .row .options-column,.colors-table .row .status-wip-limit{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.colors-table .row .status-name{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px;position:relative}.colors-table .row .status-name span{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.duty-custom-fields .custom-field-value.js-value-view-mode,.lightbox-generic-ask .subtitle{white-space:pre-line}.colors-table .row .status-slug{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px}.colors-table .row .options-column{max-width:100px;opacity:0;text-align:right}.colors-table .row .is-archived-column{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row .is-closed-column{max-width:130px;text-align:center}.colors-table .row .status-wip-limit{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#b8b8b8;border-radius:2px;height:40px;width:40px}.activity-single .activity-user img,.duty-custom-fields form input{width:100%}.colors-table .icon{color:#b8b8b8;margin-right:1rem;opacity:0}.colors-table .icon.icon-check-square,.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.colors-table .icon:hover{color:#72a114;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.colors-table .icon-delete:hover{color:red}.colors-table .icon-check-square{color:#72a114}.duty-custom-fields .custom-field-data .custom-field-description{font-size:.9rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom{font-size:1.2rem;cursor:pointer;-webkit-transform:rotate(-90deg);transform:rotate(-90deg);-webkit-transition:-webkit-transform .2s linear;transition:-webkit-transform .2s linear;transition:transform .2s linear;transition:transform .2s linear,-webkit-transform .2s linear}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields{margin-bottom:2rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom.open{-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .2s linear;transition:-webkit-transform .2s linear;transition:transform .2s linear;transition:transform .2s linear,-webkit-transform .2s linear}.duty-custom-fields .custom-fields-body{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.duty-custom-fields .custom-fields-body.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.duty-custom-fields .custom-field-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;padding:1rem}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-single .custom-field-options{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-custom-fields .custom-field-single .custom-field-options a{color:#b8b8b8}.duty-custom-fields .custom-field-single .custom-field-options a:hover{color:#72a114}.duty-custom-fields .custom-field-data{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px}.duty-custom-fields .custom-field-data .custom-field-name{display:block}.duty-custom-fields .custom-field-data .custom-field-description{color:#888;display:block;line-height:.9rem}.duty-custom-fields .custom-field-options{margin:0}.duty-custom-fields .custom-field-value{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff8282}.external-reference{font-size:.9rem;color:#b8b8b8;margin-top:.5rem}.external-reference a{border-left:1px solid #b8b8b8;padding:0 .2rem;-webkit-transition:color .3s linear;transition:color .3s linear}.external-reference a:hover{color:#72a114}.external-reference a:first-child{border:0}.activity-single .comment-restore,.activity-single .date,.activity-single .deleted-comment,.activity-single.deleted-comment,.change-entry .activity-fromto,.more-activity,.more-comments,.show-more-comments{font-size:.9rem}.activity-single .deleted-comment .comment-body p,.activity-single.deleted-comment .comment-body p{font-size:1rem}.history-tabs{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.change-entry .activity-changed{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.history{margin-bottom:1rem}.changes-title{display:block;padding:.5rem}.changes-title:hover .icon{color:#72a114;-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.changes-title .icon{color:#444;float:right;-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:all .2s linear;transition:all .2s linear}.main-nav a:hover .helper::after,.related-tasks-body .pop-status:after{-webkit-transform:rotate(45deg);content:''}.change-entry{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.change-entry:last-child{border-bottom:0}.change-entry .activity-changed,.change-entry .activity-fromto{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.history-tabs{border-bottom:3px solid #b8b8b8;margin-bottom:0;padding:.5rem 0}.history-tabs li{font-size:1.2rem;display:inline-block}.history-tabs li:first-child{border-right:1px solid #b8b8b8}.history-tabs a{color:#b8b8b8;padding:0 2rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs a.active{color:#444}.history-tabs a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs .icon{margin-right:.5rem}.add-comment .in-progress{cursor:progress}.add-comment:after{clear:both;content:'';display:table}.add-comment.active .button-green{display:block;margin-top:.5rem}.add-comment.active textarea{height:6rem;-webkit-transition:height .3s ease-in;transition:height .3s ease-in}.add-comment.active .help-markdown{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.add-comment.active .preview-icon{opacity:1;position:absolute;right:1rem}.add-comment .help-markdown,.add-comment .preview-icon,.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave.ng-leave-active:last-child{opacity:0}.add-comment textarea{background:#fff;height:5rem;min-height:41px}.add-comment .save-comment{color:#fff;float:right}.add-comment .button-green{display:none}.more-comments,.show-more-comments{color:#b8b8b8;display:block;border-bottom:1px solid #b8b8b8}.add-comment .edit,.add-comment .preview-icon{position:absolute;right:1rem}.show-more-comments{border-top:1px solid #b8b8b8;padding:1rem 0 1rem 1rem}.show-more-comments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.more-comments{padding:1rem}.more-comments .prev-comments-num{color:#72a114;margin-left:.5rem}.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{-webkit-transition:all .3s ease-in;transition:all .3s ease-in}.comment-list.activeanimation .comment-single.ng-enter.ng-enter-active:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{opacity:1}.activity-single{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:2rem 0;position:relative}.activity-single:hover .comment-delete,.activity-single:hover .comment-restore{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.activity-single:first-child{margin-top:0}.activity-single:last-child{border-bottom:0}.activity-single .deleted-comment,.activity-single.deleted-comment{color:#b8b8b8;padding:.5rem}.activity-single .deleted-comment a,.activity-single.deleted-comment a{color:#b8b8b8;margin-left:.3rem}.activity-single .deleted-comment a:hover,.activity-single.deleted-comment a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .deleted-comment img,.activity-single.deleted-comment img{-webkit-filter:grayscale(100%);filter:grayscale(100%);opacity:.5}.activity-single .deleted-comment .comment-body,.activity-single.deleted-comment .comment-body{display:none;margin:.2rem 0 .5rem}.activity-single .activity-username,.activity-single .username{margin-bottom:.5rem;color:#72a114}.activity-single .comment-restore{color:#b8b8b8;position:absolute;right:0;top:.4rem}.activity-single .comment-restore .icon{vertical-align:baseline}.activity-single .comment-restore:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .activity-user{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.activity-single .activity-content{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:calc(100% - 80px)}.activity-single .changes{background:#f5f5f5}.activity-single .changes .change-entry{display:none}.activity-single .changes .change-entry.active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.activity-single .date{color:#b8b8b8;margin-left:1rem}.activity-single .wysiwyg{margin-bottom:0}.activity-single .comment-delete{color:red;opacity:0;position:absolute;right:0;top:2rem;-webkit-transition:all .2s linear;transition:all .2s linear}.activity-single .comment-delete:hover{color:#ff8282;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single.activity .change-entry{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.more-activity{border-bottom:1px solid #b8b8b8;color:#b8b8b8;display:block;padding:1rem}.more-activity .prev-activity-num{color:#72a114;margin-left:.5rem}.lightbox{background:rgba(255,255,255,.98);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox-generic-form label{font-size:.75rem}.lightbox-add-member .help-text,.lightbox-delete-account .newsletter input+label,.lightbox-sprint-add-edit .delete-sprint,.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem}.lightbox-select-user .more-watchers{font-size:1rem}.lightbox-add-member .add-member-wrapper .icon-delete,.lightbox-add-member .icon,.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-size:1.2rem}.lightbox h2{font-size:1.6rem}.lightbox .close,.lightbox-add-member .icon-delete{font-size:2rem}.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress,.lightbox-select-user .more-watchers{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.lightbox h2,.lightbox-delete-account .newsletter input+label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox .close{color:#555;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.lightbox-add-member .add-member-wrapper fieldset,.lightbox-generic-form fieldset{position:relative}.lightbox-add-member .checksley-error-list,.lightbox-generic-form .attachment-delete{right:.5rem}.lightbox .close:hover{color:#72a114}.open.lightbox{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.lightbox{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox-generic-loading .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32}.lightbox-generic-form form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form textarea{min-height:4.5rem;resize:vertical}.lightbox-generic-form label{background:#f5f5f5;border:1px solid #b8b8b8;color:#444;cursor:pointer;display:block;padding:7px 30px;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#444;vertical-align:middle}.lightbox-generic-form .settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-add-member .button,.lightbox-add-member .extra-text{margin-top:1rem}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#9dce0a;border:1px solid #72a114}.lightbox-generic-form .settings .blocked:hover{background:#ff8282;border:1px solid red}.lightbox-generic-form .settings .client-requirement input:checked+label,.lightbox-generic-form .settings .iocaine-flag input:checked+label,.lightbox-generic-form .settings .team-requirement input:checked+label{background:#72a114;border:1px solid #72a114;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:red;border:1px solid red;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-form .attachments{margin-bottom:0}.lightbox-generic-form .attachment-body{max-height:7.5rem;overflow-y:auto}.lightbox-generic-form .attachment-delete svg{fill:#b8b8b8;height:1.25rem;width:1.25rem}.lightbox-generic-form .attachment-delete:hover svg{fill:red}.lightbox-generic-bulk form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-search form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-search fieldset{margin-bottom:1rem}.lightbox-add-member .add-member-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.lightbox-add-member .add-member-wrapper:last-child,.lightbox-add-member fieldset{margin-bottom:0}.lightbox-add-member .add-member-wrapper fieldset:first-child{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.lightbox-add-member .add-member-wrapper fieldset:last-child{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.lightbox-add-member select{width:80%}.lightbox-add-member .icon{margin-left:.5rem}.lightbox-add-member .icon-delete:hover{color:red}.lightbox-add-member .help-text{padding:.5rem 1rem}.lightbox-add-member .checksley-error-list li{display:none}.lightbox-add-member .checksley-error-list li:first-child{display:block}.lightbox-sprint-add-edit form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{color:#555;opacity:1;position:absolute;right:1rem;top:.7rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-sprint-add-edit .dates div{float:left;margin-right:1%;position:relative;width:49%}.lightbox-sprint-add-edit .dates div:last-child{margin:0;width:50%}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint{color:#444;display:block;margin-top:1rem;text-align:right}.lightbox-sprint-add-edit .delete-sprint a{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-sprint-add-edit .delete-sprint a:hover{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-generic-ask form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:420px}.lightbox-generic-ask .message,.lightbox-generic-ask .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-generic-ask .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-generic-ask .options a{padding:8px 0;text-align:center;width:100%}.lightbox-ask-choice{text-align:center}.lightbox-ask-choice form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.lightbox-ask-choice .question,.lightbox-ask-choice .subtitle{display:block;line-height:1.5rem;text-align:center}.lightbox-ask-choice .replacement,.lightbox-ask-choice .replacement span{display:block}.lightbox-ask-choice .choices{margin-bottom:2rem}.lightbox-ask-choice .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-account form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-account .question,.lightbox-delete-account .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-account .newsletter{margin:1rem 0;text-align:center}.lightbox-delete-account .newsletter input,.lightbox-delete-account .options a:first-child,.lightbox-delete-project .options a:first-child{margin-right:.5rem}.lightbox-delete-account .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-project .question,.lightbox-delete-project .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-project .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-delete-project .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-generic-error section,.lightbox-generic-loading section,.lightbox-generic-success section{-webkit-flex-basis:500px;-ms-flex-preferred-size:500px;flex-basis:500px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:500px}.lightbox-generic-error h2,.lightbox-generic-loading h2,.lightbox-generic-success h2{line-height:2rem}.lightbox-generic-error p,.lightbox-generic-loading p,.lightbox-generic-success p{text-align:center}.lightbox-generic-loading .spin{margin:1rem auto;width:5rem}.lightbox-generic-loading .spin img{max-height:100%;max-width:100%;width:100%}.lightbox-generic-loading .progress-bar-wrapper{background:#e8e8e8;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#9dce0a;height:24px;position:absolute;-webkit-transition:width .1s linear;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#e8e8e8;bottom:35px;color:#555;padding:.3rem;position:absolute;-webkit-transition:left .1s linear;transition:left .1s linear}.lightbox-create-issue form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row fieldset{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem;width:30%}.lightbox-create-issue .fieldset-row fieldset:last-child{margin:0}.lightbox-block textarea,.lightbox-create-issue textarea{margin-bottom:1rem;max-height:12rem;min-height:8rem}.lightbox-block .form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-select-user .form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single.selected,.lightbox-select-user .user-list-single:hover{background:#f3fbe1;cursor:pointer}.lightbox-select-user .user-list-single:hover{-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.lightbox-select-user .more-watchers{padding:.5rem;text-align:center}.lb-create-edit-userstory .points-per-role{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0}.featured-project .project-card-inner,.highlighted .highlighted-projects-container,.highlighted .most-active,.highlighted .most-liked,.kanban-table,.wiki-summary .wiki-user-modification{-webkit-box-orient:vertical;-webkit-box-direction:normal}.lb-create-edit-userstory .ticket-role-points{margin:.1rem;min-width:20%}.lb-create-edit-userstory .ticket-role-points:first-child{margin-left:0}.lb-create-edit-userstory .ticket-role-points:nth-child(4n+4){margin-right:0}.lb-create-edit-userstory .ticket-role-points:last-child{margin:.1rem 0;min-width:100%}.main-nav a:hover .helper{font-size:.9rem}.main-nav .item{font-size:1.2rem}tg-project-menu{background-position:0 -300px;display:inline-block;min-height:95%;min-width:50px;padding:1rem 0;position:relative;z-index:9}.main-nav a,.main-nav span{display:block}tg-project-menu .menu.menu-fixed{position:fixed;top:1rem}.main-nav{list-style:none;padding:0;position:relative;text-align:center}.related-tasks-body .row,.related-tasks-body .status{text-align:left;position:relative}.main-nav a{color:#fff;padding:.75rem .8rem;position:relative}.main-nav a:hover{background:rgba(0,0,0,.2);color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.main-nav a:hover .helper{-webkit-animation:slideLeft .2s ease-in-out both;animation:slideLeft .2s ease-in-out both;background:-webkit-linear-gradient(left,#000 0,rgba(0,0,0,.8) 100%);background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;padding:.4rem 1rem;position:absolute;top:calc(50% - 1rem);-webkit-transition:all .2s;transition:all .2s;white-space:nowrap;z-index:99}.main-nav a:hover .helper::after{background:#050505;height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);transform:rotate(45deg);width:12px;z-index:98}.main-nav svg{height:1.5rem;width:1.5rem}.main-nav svg path{opacity:1}.main-nav .helper{display:none}.main-nav .icon{font-size:1.5rem;line-height:2.2rem}.main-nav .active{background:rgba(0,0,0,.2);color:#9dce0a}.main-nav .active svg path{fill:#9dce0a;opacity:1}@-webkit-keyframes slideLeft{0%{opacity:0}100%{opacity:1}}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.related-tasks-body .pop-status,.related-tasks-body .pop-status a,.related-tasks-body .row{font-size:.9rem}.related-tasks-body .task-name input,.related-tasks-header .related-tasks-title{font-size:1rem}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine,.related-tasks-body .task-settings a{font-size:1.2rem}.related-tasks-body .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.related-tasks-header .related-tasks-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-tasks{margin-bottom:2rem;position:relative}.related-tasks-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-tasks-header .add-button{background:#444;border:0;display:inline-block;padding:.5rem;-webkit-transition:background .25s;transition:background .25s}.related-tasks-header .add-button.is-active,.related-tasks-header .add-button:hover{background:#9dce0a}.related-tasks-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-tasks-body{width:100%}.related-tasks-body .row{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.5rem 0 .5rem .5rem;width:100%}.related-tasks-body .row:hover{background:0 0}.related-tasks-body .row:hover .task-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .row:last-child{border:0}.related-tasks-body .row .tasks{overflow:hidden;width:100%}.related-tasks-body .row .status{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100px}.related-tasks-body .row .assigned-to{cursor:pointer;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.related-tasks-body .related-task-create-form{padding:0}.related-tasks-body .related-task-create-form.active{padding:.5rem 0 .5rem .5rem}.related-tasks-body .status:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.related-tasks-body .status .not-clickable:hover{color:#444}.related-tasks-body .status .popover a{text-align:left;width:100%}.related-tasks-body .status .popover .point{text-align:center}.related-tasks-body .status .icon{color:#b8b8b8;margin-left:.2rem;opacity:0}.related-tasks-body .pop-status{background:#050505;color:#fff;display:none;left:40%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.related-tasks-body .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.related-tasks-body .avatar,.related-tasks-body .task-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.related-tasks-body .blocked .icon,.related-tasks-body .blocked .icon:hover,.related-tasks-body .blocked a,.related-tasks-body .blocked a:hover,.related-tasks-body .blocked:hover .icon,.related-tasks-body .blocked:hover .icon:hover,.related-tasks-body .blocked:hover a,.related-tasks-body .blocked:hover a:hover,.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#050505;height:15px;position:absolute;transform:rotate(45deg);width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .task-name{display:flex;position:relative}.related-tasks-body .task-name a{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-name input{margin-right:1rem;padding:3px;width:85%}.related-tasks-body .task-name.loading{margin:0;padding:8px;text-align:center;width:100%}.related-tasks-body .task-name.loading span{-webkit-animation:loading .5s linear,spin 1s linear infinite;animation:loading .5s linear,spin 1s linear infinite}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:#ff8282;color:#fff}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .iocaine,.related-tasks-body .iocaine:hover{background:rgba(157,206,10,.3)}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine{display:inline-block;margin-right:.5rem;vertical-align:top}.related-tasks-body .task-settings{margin:0 0 0 2rem;opacity:0;position:absolute;right:0;top:0;width:10%}.related-tasks-body .task-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .task-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .assigned-to{position:relative;text-align:left}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .task-assignedto figcaption{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-assignedto .icon{opacity:0;position:absolute;right:.5rem;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex}.related-tasks-body .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-data-container,.ticket-header .detail-status,.ticket-header .pop-status,.ticket-header .pop-status a,.ticket-status .priority-data .pop-priority,.ticket-status .priority-data .pop-priority a,.ticket-status .severity-data .pop-severity,.ticket-status .severity-data .pop-severity a,.ticket-status .type-data .pop-type,.ticket-status .type-data .pop-type a,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-size:.9rem}.ticket-header .ticket-title{font-size:1.6rem;vertical-align:sub}.ticket-header .pop-status,.ticket-header .ticket-title,.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .type-data .pop-type,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-header{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1.5rem 0 2rem;position:relative}.ticket-header .detail-status{display:inline-block;margin-left:.25rem;position:relative}.ticket-header .detail-status .icon-arrow-bottom{margin-left:.25rem}.ticket-header .detail-status-inner{color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.15rem .25rem}.ticket-header .pop-status{background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;position:absolute;top:1.25rem;width:150px;z-index:99;padding:0;text-transform:none}.ticket-header .pop-status a{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #444;color:#fff;display:block;padding:.5rem 1rem}.ticket-header .pop-status a:last-child{border:0}.ticket-header .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-header .pop-status a:hover.point{color:#fff}.ticket-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-header .pop-status a:hover{background:rgba(157,206,10,.2)}.ticket-data-container{margin-bottom:1rem}.ticket-data-container .icon{margin-left:.25rem}.ticket-status:last-child{margin:0}.ticket-status .level{display:inline-block;margin-right:.5rem;vertical-align:top}.filters h1,.filters h1 a{vertical-align:baseline}.ticket-status .level-name{color:#c2c2c2;float:right;text-transform:lowercase}.ticket-status .clickable:hover{background:#dcdcdc;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .type-data{background:#e8e8e8;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .type-data .pop-type{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .type-data .pop-type a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .type-data .pop-type a:last-child{border:0}.ticket-status .type-data .pop-type a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-status .severity-data{background:#e8e8e8;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .severity-data .pop-severity{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .severity-data .pop-severity a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .severity-data .pop-severity a:last-child{border:0}.ticket-status .severity-data .pop-severity a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-status .priority-data{background:#e8e8e8;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .priority-data .pop-priority{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .priority-data .pop-priority a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .priority-data .pop-priority a:last-child{border:0}.ticket-status .priority-data .pop-priority a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-detail-settings img,.ticket-detail-settings svg{max-height:1.25rem;max-width:1.25rem;width:100%}.ticket-watch-buttons{margin-bottom:1rem}.ticket-watch .ticket-watch-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.ticket-watch .ticket-watch-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ticket-watch .track-icon{position:relative;top:2px}.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{background:#b8b8b8;color:#fff;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:.25rem;text-align:center;text-transform:uppercase;-webkit-transition:background .25s;transition:background .25s}.ticket-watch .add-watcher path,.ticket-watch .ticket-watch-button path{fill:#fff}.ticket-watch .add-watcher:hover,.ticket-watch .ticket-watch-button:hover{background:#9dce0a}.ticket-watch .add-watcher.is-hover,.ticket-watch .ticket-watch-button.is-hover{background:red;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.ticket-watch .add-watcher.is-hover svg,.ticket-watch .ticket-watch-button.is-hover svg{fill:#ff8282}.ticket-watch .add-watcher.active,.ticket-watch .ticket-watch-button.active{background:#9dce0a}.ticket-watch .add-watcher.active:hover,.ticket-watch .ticket-watch-button.active:hover{background:#ff8282}.ticket-watch .add-watcher.active svg,.ticket-watch .ticket-watch-button.active svg{fill:#fff}.ticket-watch .ticket-watch-button{margin-right:.25rem}.wizard-create-project .create-step1 fieldset:first-child,.wizard-create-project .wizard-action a:first-child{margin-right:.5rem}.ticket-detail-settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-top:2rem}.ticket-detail-settings .button-delete,.ticket-detail-settings .item-block,.ticket-detail-settings .item-unblock,.ticket-detail-settings .promote-button,.ticket-detail-settings label{background:#b8b8b8;display:inline-block;margin-right:.5rem;padding:1rem;-webkit-transition:background .2s linear;transition:background .2s linear;-webkit-transition-delay:.1s;transition-delay:.1s}.ticket-detail-settings .button-delete:hover,.ticket-detail-settings .item-block:hover,.ticket-detail-settings .item-unblock:hover,.ticket-detail-settings .promote-button:hover,.ticket-detail-settings label:hover{background:#555}.ticket-detail-settings .button-delete.editable,.ticket-detail-settings .item-block.editable,.ticket-detail-settings .item-unblock.editable,.ticket-detail-settings .promote-button.editable,.ticket-detail-settings label.editable{cursor:pointer}.ticket-detail-settings .button-delete+input,.ticket-detail-settings .item-block,.ticket-detail-settings .item-block+input,.ticket-detail-settings .item-unblock,.ticket-detail-settings .item-unblock+input,.ticket-detail-settings .promote-button+input,.ticket-detail-settings label+input{display:none}.ticket-detail-settings .item-block.is-active,.ticket-detail-settings .item-unblock.is-active{display:inline-block}.ticket-detail-settings .item-unblock{background:#ff8282}.ticket-detail-settings .item-unblock:hover{background:red}.ticket-detail-settings .button-delete{background:#ff8282}.ticket-detail-settings .button-delete:hover{background:red}.ticket-detail-settings svg{fill:#fff;height:100%}.single-project .track-container .icon path,.single-project .track-container .list-itemtype-track-likers.active path,.single-project .track-container .list-itemtype-track-watchers.active path{fill:currentcolor}.wizard-create-project{background:url(../images/invitation_bg.jpg) center center no-repeat;bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910;background-size:cover;color:#fff;text-align:center}.wizard-create-project p{font-size:.9rem}.wizard-create-project .close{font-size:2rem;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.open.wizard-create-project{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.wizard-create-project{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.wizard-create-project fieldset{margin-bottom:1rem}.wizard-create-project .button-gray,.wizard-create-project .button-green{display:block;padding:12px;text-align:center}.wizard-create-project form{width:500px}.wizard-create-project .title{text-align:center;width:100%}.wizard-create-project h1,.wizard-create-project p{color:#fff}.wizard-create-project h1{line-height:1.5rem}.wizard-create-project p{opacity:.8}.wizard-create-project input,.wizard-create-project select,.wizard-create-project textarea{background:rgba(255,255,255,.7)}.wizard-create-project input::-webkit-input-placeholder,.wizard-create-project select::-webkit-input-placeholder,.wizard-create-project textarea::-webkit-input-placeholder{color:#444}.wizard-create-project input::-moz-placeholder,.wizard-create-project select::-moz-placeholder,.wizard-create-project textarea::-moz-placeholder{color:#444}.wizard-create-project input:-moz-placeholder,.wizard-create-project select:-moz-placeholder,.wizard-create-project textarea:-moz-placeholder{color:#444}.wizard-create-project input:-ms-input-placeholder,.wizard-create-project select:-ms-input-placeholder,.wizard-create-project textarea:-ms-input-placeholder{color:#444}.wizard-create-project .close{color:#fff}.wizard-create-project .close:hover{color:#ff8282}.wizard-create-project .wizard-step{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out;-webkit-animation-direction:alternate-reverse;animation-direction:alternate-reverse;display:none}.wizard-create-project .wizard-step.active{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out}.wizard-create-project .wizard-step.active.create-step1,.wizard-create-project .wizard-step.active.create-step2,.wizard-create-project .wizard-step.active.create-step3{display:block}.wizard-create-project .wizard-action div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .wizard-action a{color:#fff;display:inline-block;-webkit-flex-basis:40%;-ms-flex-preferred-size:40%;flex-basis:40%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 .template-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .create-step1 fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 input{display:none}.wizard-create-project .create-step1 input:checked+label{background:rgba(157,206,10,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label{background:rgba(245,245,245,.7);cursor:pointer;display:block;margin-bottom:1rem;padding:1rem;text-align:center;-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label:hover{background:rgba(114,161,20,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label .icon{font-size:3rem;color:#fff}.wizard-create-project .create-step1 h2{color:#fff;margin:.5rem 0 0;text-transform:uppercase}.wizard-create-project .create-step1 p{text-align:center}.wizard-create-project .progress-bar{bottom:0;height:.5rem;left:0;position:absolute;width:100%}.wizard-create-project .step1 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:25%}.wizard-create-project .step1 .progress-state span:nth-child(1){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .step2 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:75%}.wizard-create-project .step2 .progress-state span:nth-child(1),.wizard-create-project .step2 .progress-state span:nth-child(2){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .progress-state{position:absolute;width:100%}.wizard-create-project .progress-state span{color:rgba(255,255,255,.5);display:inline-block;margin-left:-100px;position:absolute;text-align:center;top:-2rem;-webkit-transition:all 1s ease-in;transition:all 1s ease-in;width:200px}.wizard-create-project .progress-state span:nth-child(1){left:25%}.wizard-create-project .progress-state span:nth-child(2){left:75%}.wizard-create-project .progress-bar-wrapper{background:rgba(255,255,255,.3);height:.5rem}.wizard-create-project .bar{background:rgba(157,206,10,.9);height:.5rem;left:0;position:absolute;top:0;width:0}.create-project{background:url(../images/bg.png) center center no-repeat;background-size:cover;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;bottom:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.create-project .tagline{font-size:2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#fff;line-height:2rem;text-transform:uppercase}.introjs-tooltip p,.single-project .description,.single-project .looking-for-people p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project fieldset{margin-bottom:1rem}.create-project .create-project-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.create-project h1{color:#fff;text-align:center}.create-project .logo,.create-project .tagline{margin-bottom:1rem;text-align:center}.create-project form{margin-bottom:2rem}.create-project input{background:#fff}.create-project input::-webkit-input-placeholder{color:#b8b8b8}.create-project input::-moz-placeholder{color:#b8b8b8}.create-project input:-moz-placeholder{color:#b8b8b8}.create-project input:-ms-input-placeholder{color:#b8b8b8}.create-project .button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.create-project .button:hover{background:#9dce0a}.create-project a:hover{color:#fff}.filters h2 .icon-arrow-right{font-size:1rem}.filters-inner .loading .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32;max-height:1rem;max-width:1rem}.profile .timeline-wrapper .spin img,.user-profile .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.filters h1 .icon{margin:0}.filters h2 .icon-arrow-right,.issues-table .subject span,.single-project h1{vertical-align:middle}.filters h2{font-size:1.2rem;margin-top:1rem}.filters input{background:#444;color:#fff}.filters input::-webkit-input-placeholder{color:#b8b8b8}.filters input::-moz-placeholder{color:#b8b8b8}.filters input:-moz-placeholder{color:#b8b8b8}.filters input:-ms-input-placeholder{color:#b8b8b8}.filters .icon-search{color:#b8b8b8;position:absolute;right:.7rem;top:.7rem}.filters-inner{opacity:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}.filters-inner .loading{margin:0;padding:8px;text-align:center;width:100%}.filters-applied{margin-top:.5rem}.filters-step-cat .save-filters{color:#fff;display:block;text-align:center}.filters-step-cat .my-filter-name{background:#444;color:#f5f5f5;width:100%}.filters-step-cat .my-filter-name::-webkit-input-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name::-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-ms-input-placeholder{color:#b8b8b8}.filters-cats{margin-top:2rem}.filters-cats li{border-bottom:1px solid #b8b8b8;text-transform:uppercase}.filters-cats .custom-filters .title{color:#72a114}.filters-cats a{color:#444;display:block;padding:.5rem 0 .5rem .5rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.filters-cats .icon{color:#444;float:right;opacity:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-overlay{background:-webkit-radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background-color:#f5f5f5}.introjs-helperLayer{border:1px solid rgba(157,206,10,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(68,68,68,.2)}.introjs-bullets ul li a.active{background:#9dce0a}.introjs-button{background-color:#72a114;background-image:none;border:0;border-radius:0;color:#fff;margin-top:10px;padding:.3rem .8rem;text-shadow:none}.introjs-button:focus,.introjs-button:hover{background:#9dce0a;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .looking-for-people h3,.single-project .looking-for-people p,.single-project .track-container .list-itemtype-track{font-size:.9rem}.single-project .description,.single-project .title{font-size:1rem}.single-project .single-project-intro{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.single-project .project-logo{margin-right:1rem;width:6rem}.single-project .project-logo img{width:100%}.single-project .single-project-title-wrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.single-project .intro-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem}.single-project .intro-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project h1{color:#72a114;display:inline-block;line-height:1.2;margin-bottom:0}.single-project .like-watch-container{margin-left:auto}.single-project .track-buttons-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.single-project .track-container .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.single-project .track-container .list-itemtype-track-likers,.single-project .track-container .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .track-container .list-itemtype-track-likers .icon,.single-project .track-container .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.single-project .project-data,.single-project .title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#72a114}.single-project .track-container .icon svg{height:1rem;width:1rem}.single-project .description{margin:0}.single-project .project-data{display:flex}.single-project .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem}.single-project .single-project-tags{margin-bottom:1rem;margin-top:1rem}.single-project .timeline{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-shrink:3;-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;max-width:960px;width:0}.single-project .looking-for-people img{width:100%}.single-project .involved-data{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-organization,.single-project .involved-team{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-organization li,.single-project .involved-team li{-webkit-flex-basis:24%;-ms-flex-preferred-size:24%;flex-basis:24%;margin-right:.14rem}.single-project .involved-organization li:nth-child(4n),.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-organization a,.single-project .involved-team a{display:block}.single-project .involved-organization img,.single-project .involved-team img{border-radius:.2rem;width:100%}.issues-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table .pop-status,.issues-table .pop-status a,.issues-table .table-main{font-size:.9rem}.issues-table .title{font-size:1rem}.empty-issues .title{font-size:1.2rem;text-transform:uppercase}.empty-issues p,.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.issues-table .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8}.issues-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .avatar,.kanban-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.issues-table .row.is-blocked{background:#ffe8e8}.issues-table .row.is-blocked .blocked-text{color:red;margin-right:.5rem}.issues-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#555}.issues-table .table-main{border-bottom:1px solid #ebebeb}.issues-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-webkit-flex-basis:60%;-ms-flex-preferred-size:60%;flex-basis:60%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes{color:#555;-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes.inactive{color:#b8b8b8}.issues-table .votes.is-voted{color:#9dce0a}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field{-webkit-box-flex:0;-webkit-flex:0 0 160px;-ms-flex:0 0 160px;flex:0 0 160px;max-width:160px}.issues-table .issue-assignedto{cursor:pointer;position:relative}.issues-table .issue-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .issue-assignedto figcaption{max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.issues-table .issue-assignedto .icon{opacity:0;position:absolute;right:0;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .pop-status{background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99}.issues-table .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.search-filter,.search-result-table{border-top:1px solid #f5f5f5}.issues-table .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.issues-table .pop-status.fix{bottom:0;top:auto}@media (max-width:1280px){.issues-table .created-field,.issues-table .level-field{display:none}}.empty-issues{margin-top:4rem;text-align:center}.empty-issues img{margin-bottom:1rem}.empty-issues p,.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem}.kanban-table-body,.kanban-table-header .task-colum-name,.kanban-table-header .task-colum-name .icon{font-size:1rem}.kanban-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table .vfold.task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold .kanban-task,.kanban-table .vfold.task-colum-name .icon-bulk,.kanban-table .vfold.task-colum-name .icon-closed-eye,.kanban-table .vfold.task-colum-name .icon-open-eye,.kanban-table .vfold.task-colum-name .icon-plus,.kanban-table .vfold.task-colum-name .icon-vfold,.kanban-table .vfold.task-colum-name .icon-vunfold,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1;max-width:30px;min-height:2.5rem;min-width:30px;width:30px}.kanban-table .readonly{cursor:auto}.kanban-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.kanban-table-header .kanban-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.kanban-table-header .task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem .5rem .5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name span{max-width:65%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kanban-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.kanban-table-header .task-colum-name .icon.hfold,.kanban-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.kanban-table-header .icon-closed-eye,.kanban-table-header .icon-open-eye{display:inline-block}.kanban-table-header .icon-closed-eye svg,.kanban-table-header .icon-open-eye svg{fill:#b8b8b8;height:1.1rem;margin-top:.25rem;width:1.1rem}.kanban-table-header .icon-closed-eye:hover svg,.kanban-table-header .icon-open-eye:hover svg{fill:#72a114}.kanban-table-header .icon-open-eye .svg-eye-closed{display:none}.kanban-table-header .icon-closed-eye .svg-eye-closed,.kanban-table-header .icon-open-eye .svg-eye-open{display:block}.kanban-table-header .icon-closed-eye .svg-eye-open{display:none}.kanban-table-body,.kanban-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.kanban-table-body{display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;overflow-y:auto;widows:300px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#b8b8b8;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#050505}.kanban-table-body .task-column .kanban-wip-limit{background:red;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-inner{display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.search-filter{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:0;z-index:9}.search-filter a{background:#fff;color:#b8b8b8;display:inline-block;margin-right:1rem;padding:1rem 1.25rem}.search-filter .icon,.search-filter a:hover .icon{margin-right:.4rem}.search-filter .name,.search-filter a:hover .name{padding-left:5px}.search-filter a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.search-filter a.active{border-left:1px solid #f5f5f5;border-right:1px solid #f5f5f5;color:#444;position:relative;top:1px}.search-filter a.active .icon{color:#9dce0a}.search-in input{background:#444;color:#fff}.search-in input::-webkit-input-placeholder{color:#b8b8b8}.search-in input::-moz-placeholder{color:#b8b8b8}.search-in input:-moz-placeholder{color:#b8b8b8}.search-in input:-ms-input-placeholder{color:#b8b8b8}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{color:#b8b8b8}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #f5f5f5}.search-result-table .user-story-name .icon{font-size:1rem;color:#b8b8b8}.empty-search-results .title{font-size:1.2rem;text-transform:uppercase}.empty-search-results p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.search-result-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.search-result-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row .ref{-webkit-flex-basis:30px;-ms-flex-preferred-size:30px;flex-basis:30px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .status{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.search-result-table .user-story-name span{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-table .user-story-name .icon:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.search-result-table .points,.search-result-table .status{position:relative}.search-result-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.search-result-table .avatar img{width:35px}.search-result-table .avatar .avatar-caption{display:block;margin-left:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:80px}.empty-search-results{margin-top:4rem;text-align:center}.empty-search-results img{margin-bottom:1rem}.empty-search-results p{margin:0}.team-filters nav li{font-size:1.6rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.table-team .team-header,.team-filters nav li:last-child{border-bottom:0}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters nav a{display:block;padding:1rem 0 1rem 1rem}.team-filters nav a.active,.team-filters nav a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.team-filters nav .active,.team-filters nav a.active.icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.team-filters nav .icon{color:#050505;float:right;opacity:0}.table-team .leave-project,.table-team .popover,.table-team .popover a{font-size:.9rem}.table-team .attribute .points{font-size:1.6rem}.table-team .attribute,.table-team .attribute .points,.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.policy-table .policy-table-header,.table-team .avatar .name,.table-team .team-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.table-team .row{padding:.5rem}.table-team .username{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:6;-webkit-flex:6;-ms-flex:6;flex:6;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{color:#050505;font-size:1.8rem}.table-team .attribute .points{color:#444}.table-team .attribute .top{color:#9dce0a;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{color:#b8b8b8;display:block}.table-team .leave-project .icon{margin-right:.2rem}.table-team .leave-project:hover .icon{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .hero{width:100%}.table-team .hero .row{background:#f5f5f5;border-bottom:0;margin:1rem 0}.table-team .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.table-team .avatar img{-webkit-flex-basis:66px;-ms-flex-preferred-size:66px;flex-basis:66px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:66px}.table-team .avatar figcaption{margin-left:1rem;width:65%}.table-team .avatar figcaption span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.table-team .avatar .name,.table-team .avatar .position{display:block;width:100%}.table-team .avatar .position{color:#b8b8b8}.table-team .popover{background:#050505;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99}.table-team .popover a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#050505;bottom:-5px;content:'';height:15px;left:50%;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:15px}.policy-table .policy-table-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{border-bottom:2px solid #b8b8b8}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none,.policy-table .policy-table-project{padding:1rem}.policy-table .policy-table-project{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#72a114;-webkit-transition:background .3s linear;transition:background .3s linear}.policy-table label{background:#b8b8b8;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#9dce0a;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear}.user-change-password fieldset{margin-bottom:1rem;width:50%}.user-change-password fieldset:last-child{margin-top:2rem}.user-change-password label{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;display:block;margin-bottom:.5rem}.user-change-password .button-green{color:#fff;display:block;padding:12px;text-align:center}.user-profile .image-help,.user-profile .use-default-image{font-size:.75rem}.user-profile .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;border:0;-webkit-transform-origin:center center;transform-origin:center center}.user-profile{max-width:780px}.user-profile form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.user-profile fieldset{margin-bottom:1rem}.user-profile label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.user-profile .project-details-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.user-profile .project-details-image .image,.user-profile .submit-button,.wiki-nav li .loading{width:100%}.user-profile .image-container{position:relative;margin-bottom:0}.user-profile .loading-overlay{display:none}.user-profile .loading-overlay.active{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.user-profile .image-help{line-height:1rem;margin-bottom:.5rem;text-align:center}.user-profile .use-default-image{text-align:center}.user-profile .use-default-image:hover{color:red}.user-profile .project-details-form-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.user-profile form{display:block}}.user-profile .delete-account{font-size:.9rem;display:block;margin-top:1rem}.wiki-nav li input{font-size:1rem}.attachment-list .attachment-settings .editable-settings,.attachment-list .attachment-settings .settings,.attachment-list .icon-delete,.wiki-nav li{font-size:1.2rem}.wiki-nav li{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.wiki-nav li:hover .icon{opacity:1;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li a{display:block;padding:1rem 0 1rem 1rem}.wiki-nav li a span{cursor:pointer}.wiki-nav li .icon{color:#050505;float:right;opacity:0;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li input{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background:#444;color:#f5f5f5}.wiki-nav li input::-webkit-input-placeholder{color:#b8b8b8}.wiki-nav li input::-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-ms-input-placeholder{color:#b8b8b8}.wiki-nav li .loading{margin:0;padding:8px;text-align:center}.wiki-nav .add-button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.wiki-summary .wiki-user-modification,.wiki-summary div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.wiki-summary .username{font-size:1.2rem;color:#9dce0a;white-space:nowrap}.wiki-summary{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary div{display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:1rem}.wiki-summary .number{line-height:2rem;top:0}.wiki-summary .wiki-user-modification{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary figure{margin-right:.3rem;width:32px}.attachment-gallery{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.attachment-gallery .single-attachment{margin-bottom:.5rem;margin-right:.5rem;max-width:200px}.attachment-gallery .single-attachment:hover .icon-delete{opacity:1}.attachment-gallery .single-attachment .attachment-image{display:inline-block}.attachment-gallery .single-attachment img{height:150px;margin-bottom:.2rem;width:200px}.attachment-gallery .single-attachment img:hover{-webkit-filter:saturate(150%) hue-rotate(60deg);filter:saturate(150%) hue-rotate(60deg);-webkit-transition:all .3s cubic-bezier(.01,.7,1,1);transition:all .3s cubic-bezier(.01,.7,1,1)}.attachment-gallery .single-attachment.deprecated img{opacity:.5}.attachment-gallery .single-attachment.deprecated .attachment-name{color:#b8b8b8}.attachment-gallery .single-attachment .attachment-data{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.attachment-gallery .single-attachment .attachment-name{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;max-width:175px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block}.attachments-empty,.attachments-header .attachments-title,.live-announcement-inner .title,.live-announcement-inner .warning a,.single-attachment .attachment-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.attachment-gallery .single-attachment .icon-delete{color:#ff8282;margin-left:auto;opacity:0;-webkit-transition:opacity .3s ease-in;transition:opacity .3s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.attachment-gallery .single-attachment .icon-delete:hover{color:red}.attachment-gallery .single-attachment .loading-container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:150px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0 .5rem .5rem 0;width:200px}.attachment-gallery .single-attachment .loading-spinner{margin:0 auto;max-height:3rem;max-width:3rem}.attachment-list .single-attachment{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;position:relative}.attachment-list .single-attachment:hover .settings{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.attachment-list .single-attachment.deprecated,.attachment-list .single-attachment.deprecated .attachment-name a{color:#b8b8b8}.attachment-list .attachment-name{max-width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding-right:1rem}.attachment-list .attachment-comments,.attachment-list .editable-attachment-comment{-webkit-box-flex:2;-webkit-flex:2;-ms-flex:2;flex:2;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;margin-right:.5rem}.attachment-list .attachment-comments span,.attachment-list .editable-attachment-comment span{color:#555}.attachment-list .attachment-size{-webkit-flex-basis:125px;-ms-flex-preferred-size:125px;flex-basis:125px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.attachment-list .attachment-settings{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:10%;-ms-flex-preferred-size:10%;flex-basis:10%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin-left:auto}.attachment-list .attachment-settings .editable-settings,.attachment-list .attachment-settings .settings{color:#b8b8b8}.attachment-list .attachment-settings .editable-settings:hover,.attachment-list .attachment-settings .settings:hover{color:#72a114}.attachment-list .attachment-settings .settings{opacity:0}.attachment-list .attachment-settings .editable-settings{opacity:1}.attachment-list .attachment-settings .icon-delete:hover{color:red}.attachment-list .attachment-settings .icon-drag-v{cursor:move}.attachment-list .icon-delete{color:#b8b8b8}.attachment-list .icon-delete:hover{color:red}.attachment-list .editable-attachment-deprecated{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:1rem}.attachment-list .editable-attachment-deprecated span{color:#b8b8b8}.attachment-list .editable-attachment-deprecated input{margin-right:.2rem;vertical-align:middle}.attachment-list .editable-attachment-deprecated input:checked+span{color:#444}.attachment-list .percentage{background:rgba(114,161,20,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.more-attachments,.single-attachment{font-size:.9rem}.attachments-header .attachments-title{font-size:1rem;color:#444;padding:0 1rem}.more-attachments span,.single-attachment .attachment-size{color:#b8b8b8}.attachments{margin-bottom:2rem}.attachments-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.attachments-header .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.attachments-header label{cursor:pointer;margin-left:1rem}.attachments-header label.add-attachment-button{background:#555;border:0;display:inline-block;padding:.5rem;-webkit-transition:background .25s;transition:background .25s}.attachments-header label.add-attachment-button:hover{background:#9dce0a}.attachments-header label svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.attachments-header button{background:0 0;margin-right:.2rem}.attachments-header button.is-active svg,.attachments-header button:hover svg{fill:#9dce0a}.attachments-header button svg{fill:#b8b8b8;height:1.6rem;margin-bottom:-.2rem;width:1.6rem}.attachments-header input{display:none}.attachments-empty{font-size:1.2rem;border:3px dashed #f5f5f5;color:#b8b8b8;margin-top:.5rem;padding:1rem;text-align:center}.single-attachment.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.single-attachment.sortable-placeholder{background:#f5f5f5;height:40px}.single-attachment .attachment-name{padding-right:1rem}.single-attachment .attachment-name .icon{margin-right:.25rem}.single-attachment .attachment-name svg{height:1.2rem;width:1.2rem}.more-attachments{border-bottom:1px solid #b8b8b8;display:block;padding:1rem 0 1rem 1rem}.live-announcement,.live-announcement-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.more-attachments .more-attachments-num{color:#72a114;margin-left:.5rem}.more-attachments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.attachment-preview img{max-height:80vh;max-width:80vw}.live-announcement-inner .title{font-size:1.6rem;color:#107a8a;margin-bottom:.5rem}.live-announcement{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#98e0eb;display:flex;height:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;-webkit-transition:width .5s,height .5s;transition:width .5s,height .5s;-webkit-transition-delay:.5s;transition-delay:.5s;width:0;z-index:99}.live-announcement .live-announcement-inner{opacity:0;-webkit-transition:opacity .5s;transition:opacity .5s;width:100%}.live-announcement.visible{height:146px;pointer-events:auto;-webkit-transition-delay:0s;transition-delay:0s;width:100%}.live-announcement.visible .live-announcement-inner{opacity:1;-webkit-transition:opacity .5s .5s;transition:opacity .5s .5s}.live-announcement-inner{display:flex;max-width:1200px}.live-announcement-inner .announcement-decoration{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin-right:1rem}.live-announcement-inner .text{padding:1.25rem 3rem 1.25rem 2rem;position:relative;width:100%}.live-announcement-inner .warning,.live-announcement-inner .warning a{color:#107a8a}.live-announcement-inner .close{height:2.5rem;position:absolute;right:0;top:1rem;width:2.5rem}.live-announcement-inner .close svg{fill:#18b7cf;-webkit-transition:fill .2s;transition:fill .2s}.live-announcement-inner .close svg:hover{fill:#107a8a}.discover-header .project-number{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#72a114}.discover-header{background:url(../images/discover.png) bottom left repeat-x #f5f5f5;margin-bottom:2.5rem;padding:1rem 1rem 2rem;text-align:center}.discover-header .discover-header-inner{max-width:1200px;min-width:768px;margin:0 auto}.discover-header .title{font-size:3rem;margin-bottom:0}.discover-header form{margin:0 30%;position:relative}@media (max-width:767px){.discover-header .discover-header-inner{width:90%;min-width:0}.discover-header form{margin:0 .5rem}}.discover-header input[type=text]{background:#fff;border:0;padding:1rem;width:100%}.discover-header input[type=text]:focus{outline-color:#9dce0a}.discover-header input[type=text]:-webkit-autofill{background:rgba(135,155,137,.5)}.discover-header .search-button{position:absolute;right:1rem;top:1rem}.discover-header .search-button:hover svg{fill:#72a114}.discover-header svg{fill:#b8b8b8;height:1.5rem;-webkit-transition:all .2;transition:all .2;width:1.5rem}.discover-search-subfilter .results{font-size:.9rem}.discover-results-header .title{font-size:1.6rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;text-transform:uppercase}.discover-results-header .discover-results-header-inner{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.discover-results-header svg{width:1.1rem;height:1.1rem;fill:#b8b8b8}.discover-results-header h2{display:inline-block}.filter-discover-search .discover-search-filter{margin-right:1rem}.filter-discover-search .discover-search-filter.active{color:#72a114}.discover-search-subfilter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:relative}.discover-search-subfilter:after,.discover-search-subfilter:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.discover-search-subfilter:after{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:8px;margin-left:-8px}.discover-search-subfilter:before{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.discover-search-subfilter.most-liked-subfilter::after,.discover-search-subfilter.most-liked-subfilter::before{left:85%}.discover-search-subfilter.most-active-subfilter::after,.discover-search-subfilter.most-active-subfilter::before{left:95%}.discover-search-subfilter.ng-enter{-webkit-animation:dropdownFade .2s;animation:dropdownFade .2s}.discover-search-subfilter .results{color:#ff8282;display:block;padding:.5rem 1rem;-webkit-transition:all .2s;transition:all .2s}.discover-search-subfilter .results:hover{color:red}.discover-search-subfilter .filter-list{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 0 0 auto}.discover-search-subfilter .filter-list a{display:block;padding:.5rem 1rem;-webkit-transition:all .2s;transition:all .2s}.featured-project,.featured-projects-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.discover-search-subfilter .filter-list a:hover{background:#b8b8b8;color:currentColor}.discover-search-subfilter .filter-list a.active{background:#9dce0a;color:#f5f5f5}.featured-project .project-card-description,.featured-project .statistic{font-size:.9rem}.featured-project .project-card-name a{font-size:1.2rem}.featured-project .project-card-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.featured-projects .title{font-size:1.6rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#444;text-align:center}.featured-projects{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.featured-projects{width:90%;min-width:0}}.featured-projects-inner{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.featured-project{background:#fff;border:1px solid #f5f5f5;margin:.5rem;display:flex;-webkit-flex-basis:23%;-ms-flex-preferred-size:23%;flex-basis:23%;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:23%}.featured-project .tags-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.3rem}.featured-project .project-tag{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.featured-project .project-card-inner{padding:1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.featured-project .project-card-description{color:#555}.featured-project .project-card-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:auto}.featured-project .project-card-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.featured-project .project-card-statistics .svg-eye-closed{display:none}.featured-project .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.featured-project .project-card-name a,.featured-project .statistic.active{color:#72a114}.featured-project .statistic.active svg{fill:#72a114}.featured-project .project-card-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.featured-project .project-card-logo{display:inline-block;-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;width:50px;height:50px;margin-right:.5rem}.featured-project .project-card-logo img{width:100%}.featured-project .project-card-name{line-height:.9}.featured-project .project-card-name a:hover{color:#9dce0a}.featured-project .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8;margin:0 .5rem}@media (max-width:767px){.featured-project{-webkit-flex-basis:45%;-ms-flex-preferred-size:45%;flex-basis:45%}}@media (max-width:480px){.featured-project{-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%}}.filter-highlighted li,.highlighted-project .project-description,.highlighted-project .statistic{font-size:.9rem}.highlighted-project .project-title{font-size:1.2rem}.highlighted .title{font-size:1.6rem}.highlighted .empty-highlighted-project span{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted-project .project-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.highlighted{margin:1rem auto 4rem;max-width:1200px;min-width:768px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}@media (max-width:767px){.highlighted{width:90%;min-width:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.highlighted tg-most-active{margin-top:4rem}}.highlighted tg-most-active,.highlighted tg-most-liked{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.highlighted tg-most-liked{margin-right:8%}@media (max-width:767px){.highlighted tg-most-liked{margin-right:0}}.highlighted .most-active,.highlighted .most-liked{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.highlighted .header{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.highlighted .header svg{width:1.5rem;height:1.5rem;fill:#b8b8b8;margin:.5rem}.highlighted .title-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.highlighted .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#444;display:inline-block;margin:0}.empty-discover-results .title,.home-project .project-card-description,.home-wrapper .title-bar,.projects-empty p,.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted .highlighted-projects-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.highlighted .loading-container{margin-top:calc(50% - 1rem)}.highlighted .loading-spinner{display:block;margin:2rem auto;max-height:3rem;max-width:3rem}.highlighted .view-more-projects{margin-top:auto;width:100%}.highlighted .empty-highlighted-project{border:2px dashed #f5f5f5;padding:2rem;text-align:center}.highlighted .empty-highlighted-project svg{width:2rem;height:2rem;display:block;fill:#b8b8b8;margin:1rem auto}.highlighted .empty-highlighted-project span{color:#555;display:block}.filter-highlighted{position:relative}.filter-highlighted .current-filter{padding:1rem}.filter-highlighted .current-filter span{margin-left:.2rem;position:relative;top:.2rem}.filter-highlighted .filter-list{background:#000;position:absolute;right:0;top:1.5rem}.filter-highlighted .filter-list.ng-enter{-webkit-animation:dropdownFade .2s ease-in;animation:dropdownFade .2s ease-in}.filter-highlighted .filter-list.ng-leave{-webkit-animation:dropdownFade .2s ease-in;animation:dropdownFade .2s ease-in;-webkit-animation-direction:reverse;animation-direction:reverse}.filter-highlighted li{color:#fff;cursor:pointer;min-width:8rem;padding:.25rem .5rem}.filter-highlighted li:hover{background:rgba(157,206,10,.4)}.highlighted-project{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:9rem;-ms-flex-preferred-size:9rem;flex-basis:9rem;min-height:9rem;padding:1.5rem 0}.highlighted-project:nth-last-child(-n+2){border-bottom:0}.highlighted-project .project-logo{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;height:auto;margin-right:1rem;width:3rem}.highlighted-project .project-logo img{width:100%}.highlighted-project .project-data-container{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.highlighted-project .single-project-header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.highlighted-project .project-title{display:inline-block;margin-bottom:.5rem}.highlighted-project .project-title a{color:#72a114}.highlighted-project .project-title a:hover{color:#9dce0a}.highlighted-project .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8;margin-left:.5rem}.highlighted-project .project-description{color:#555;margin-bottom:0}.highlighted-project .project-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.highlighted-project .project-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.highlighted-project .project-statistics .svg-eye-closed{display:none}.highlighted-project .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.highlighted-project .statistic.active{color:#72a114}.highlighted-project .statistic.active svg{fill:#72a114}.discover-results .statistic{font-size:.9rem}.discover-search .discover-header form{margin:0 8rem;position:relative}.discover-search .discover-header .search-button{left:1rem;right:auto}.discover-search .discover-header .searchbox input{padding-left:3.5rem;padding-right:23rem}.discover-search .searchbox-filters{position:absolute;right:1rem;top:.7rem;width:auto}.discover-search .searchbox-filters input{display:none}.discover-search .searchbox-filters label{border-radius:4px;color:#b8b8b8;cursor:pointer;display:inline-block;padding:.4rem .75rem;-webkit-transition:all .2s;transition:all .2s;-webkit-transition-delay:.2s;transition-delay:.2s}.discover-search .searchbox-filters label.active{background:#9dce0a;color:#fff}.discover-search .searchbox-filters label:hover{background:#f5f5f5;color:#555}.discover-results{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.discover-results{width:90%;min-width:0}}.discover-results .discover-results-inner .spin{margin-top:4rem}.discover-results .list-itemtype-project{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:1rem 0}.discover-results .list-itemtype-project:last-child{border-bottom:0}.discover-results .list-itemtype-project-left{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%}.discover-results .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.discover-results .list-itemtype-project-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;vertical-align:middle}.discover-results .look-for-people{margin-left:.5rem}.discover-results .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8}.discover-results .project-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.discover-results .project-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.discover-results .project-statistics .svg-eye-closed{display:none}.discover-results .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.discover-results .statistic.active{color:#72a114}.discover-results .statistic.active svg{fill:#72a114}.discover-results .more-results{display:block;margin:0 20rem;-webkit-transition:inherit;transition:inherit}.discover-results div[tg-loading] img{display:block;margin:0 auto}.empty-discover-results{margin:4rem auto 1rem;max-width:1200px;min-width:768px;text-align:center}@media (max-width:767px){.empty-discover-results{width:90%;min-width:0}}.empty-discover-results img{margin-bottom:1rem}.empty-discover-results .title{font-size:1.2rem;margin:0;text-transform:uppercase}.external-app-wrapper .app-card a,.external-app-wrapper .app-card p,.external-app-wrapper .user-card a{font-size:.75rem}.external-app-wrapper .cancel{font-size:.9rem}.external-app-wrapper .app-card h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:6rem;margin:0 auto;width:6rem}.external-app-wrapper h1{margin-bottom:0}.external-app-wrapper .app-card,.external-app-wrapper .user-card{line-height:1.4;margin-bottom:2rem;text-align:left}.external-app-wrapper .app-card .card-inner,.external-app-wrapper .user-card .card-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.external-app-wrapper .app-card a,.external-app-wrapper .button-green,.external-app-wrapper .user-card a{display:block}.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.external-app-wrapper .app-card h3,.external-app-wrapper .app-card p,.external-app-wrapper .user-card h3,.external-app-wrapper .user-card p{margin:0}.external-app-wrapper .app-card a,.external-app-wrapper .user-card .card-inner{margin-bottom:.5rem}.external-app-wrapper .app-card .app-image{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.external-app-wrapper .user-card{background:#fff8e4;border:1px solid #f1e8cd;padding:1rem}.external-app-wrapper .user-card .user-image{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .cancel{display:block;margin-top:.5rem;text-align:left}@media (max-width:480px){.external-app-wrapper{margin:0;min-width:100%;padding:2rem 1rem;text-align:center;width:100%}}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #f5f5f5;cursor:pointer;-webkit-transition:background .2s;transition:background .2s;-webkit-transition-delay:.2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(157,206,10,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single>a,.working-on .duty-single>a{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.empty-ticket .data,.home-project .project-card-inner{-webkit-box-orient:vertical;-webkit-box-direction:normal}.watching .duty-single>a.blocked,.working-on .duty-single>a.blocked{background:rgba(255,130,130,.2);color:red}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper,.home-wrapper .title-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-wrapper{display:flex}.home-wrapper .duty-summary{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .project-list{width:250px}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.6rem;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:flex;margin:0 0 .5rem;padding:.9rem 1rem}.home-project .project-card-description,.home-project .statistic,.projects-empty p{font-size:.9rem}.home-project{background:#fff;border:1px solid #f5f5f5;margin:.5rem .5rem 1rem;cursor:pointer;-webkit-transition:.2s;transition:.2s;-webkit-transition-delay:.1s;transition-delay:.1s}.home-project .tags-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.3rem}.home-project .project-tag{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.home-project .project-card-inner{padding:1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home-project .project-card-description{color:#555}.home-project .project-card-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:auto}.home-project .project-card-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.home-project .project-card-statistics .svg-eye-closed{display:none}.home-project .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.empty-ticket,.home-project .project-card-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-project .statistic.active{color:#72a114}.home-project .statistic.active svg{fill:#72a114}.home-project .project-card-header{display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.home-project .project-card-logo{display:inline-block;-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;width:50px;height:50px;margin-right:.5rem}.home-project .project-card-logo img{width:100%}.home-project .project-card-name{line-height:.9}.home-project .project-card-name a{font-size:1.2rem;color:#72a114}.home-project .project-card-name a:hover{color:#9dce0a}.home-project .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8;margin:0 .5rem}.home-project:hover{border:1px solid #9dce0a}.projects-empty{text-align:center}.projects-empty svg{height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty svg path{fill:#f5f5f5}.projects-empty .create-project-button{display:block;margin-bottom:.25rem}.projects-empty .import-project-button{display:block}.watching-empty,.working-on-empty{margin-bottom:4rem}.watching-empty p,.working-on-empty p{margin:2rem 9rem 1rem;text-align:center}.empty-ticket{display:flex}.empty-ticket .data,.navbar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.empty-ticket:not(:last-child){border-bottom:1px solid #f5f5f5;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#e8e8e8;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:40vw}.empty-ticket .line:last-child{margin:0;width:20vw}.navbar{display:flex;height:40px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:relative}.navbar::after{background-size:200%;bottom:0;content:'';height:100%;left:0;position:absolute;right:0;top:0;z-index:-1}.navbar .nav-left,.navbar .nav-right{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.navbar .nav-left>a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left>a.logo{background:rgba(0,0,0,.2);padding:.4rem .75rem}.navbar .nav-left>a svg{height:1.6rem;max-height:1.6rem;max-width:2rem;width:1.6rem}.navbar .nav-left>a path{fill:#fff}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar a{color:#fff;display:inline-block;-webkit-transition:all .2s linear;transition:all .2s linear}.navbar a svg path{fill:#718874}.navbar a:hover{background:rgba(0,0,0,.2);color:#9dce0a}.navbar a:hover svg path{fill:#fff}.navbar a.user-avatar{min-width:200px;padding:0 0 0 2rem;text-align:right}.navbar a.user-avatar span{padding-right:1rem}.navbar img{height:2.5rem;padding-left:.5rem;vertical-align:middle}.navbar svg{height:1.2rem;max-height:1.2rem;max-width:1.2rem;width:1.2rem}.navbar svg path{fill:#11241f;-webkit-transition:all .2s;transition:all .2s}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;display:block}.navbar .navbar-dropdown a{padding:.8rem .5rem}.navbar .navbar-dropdown{border-radius:2px;display:none;left:calc(50% - 350px/2);min-width:350px;position:absolute;top:2.4rem;z-index:999}.navbar-dropdown{background:#050505;border:1px solid #000;padding:.3rem}.navbar-dropdown.dropdown-user{left:calc(50% - 200px/2);min-width:200px}.navbar-dropdown.dropdown-user ul{margin-bottom:0}.navbar-dropdown ul{margin:0 0 .5rem;padding:0}.navbar-dropdown ul:after,.navbar-dropdown ul:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:rgba(5,5,5,0);border-bottom-color:#050505}.navbar-dropdown ul:after{border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown a{color:#b8b8b8;display:block;padding:.8rem .5rem}.navbar-dropdown .create-options,.profile-filter{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.navbar-dropdown a:hover{background:rgba(255,255,255,.1);color:#9dce0a}.navbar-dropdown a.create-organization-btn,.navbar-dropdown a.create-project-btn,.navbar-dropdown a.see-more-projects-btn{color:#fff;text-align:center}.navbar-dropdown a.create-organization-btn:hover,.navbar-dropdown a.create-project-btn:hover,.navbar-dropdown a.see-more-projects-btn:hover{color:#fff}.navbar-dropdown a.see-more-projects-btn{margin-bottom:.3rem}.navbar-dropdown a.create-project-btn{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.navbar-dropdown a.import-project-button{padding-left:.75rem;padding-right:.75rem}.navbar-dropdown .create-options{display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #f5f5f5}.profile-filter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile,.profile-filter .searchbox{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.profile-filter .searchbox{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{color:grayer;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs,.profile-projects,.profile-timeline{border-top:1px solid #f5f5f5}.profile-filter .searchbox input:focus{border-bottom:1px solid #b8b8b8;outline:0;-webkit-transition:border-bottom .3s ease-in;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#b8b8b8;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#050505}.profile .timeline-wrapper .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile{display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{background:#fff;margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;-webkit-transition:all .3s cubic-bezier(.09,.43,.35,.95);transition:all .3s cubic-bezier(.09,.43,.35,.95)}.profile .timeline-wrapper>div.ng-hide{opacity:0;padding-top:.5vh}.profile .timeline-wrapper .spin{margin:10% auto;width:3rem}.profile .profile-sidebar{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.profile .profile-sidebar .button-gray{display:block;margin-bottom:2rem;padding-left:2rem;padding-right:2rem}.profile .empty-tab{padding:5vh;text-align:center}.profile .empty-tab svg{margin:2rem auto;max-width:160px;text-align:center}.profile .empty-tab p{font-size:.9rem}.profile-bar .profile-stats .stat-name{font-size:.9rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username{font-size:1.2rem}.profile-bar h2{font-size:1.6rem}.profile-bar .profile-stats .stat-number,.profile-bar h1{font-size:2rem}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar .profile-organizations h3,.profile-bar .profile-stats .stat-number,.profile-bar h1{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-bar .profile-image-wrapper{height:200px;margin-bottom:1rem;overflow:hidden;position:relative}.profile-bar .profile-image-wrapper.is-current-user:hover img{-webkit-filter:brightness(40%) saturate(150%) hue-rotate(60deg);filter:brightness(40%) saturate(150%) hue-rotate(60deg);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1);-webkit-transition-delay:.3s;transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;-webkit-transform:translateY(100%);transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);-webkit-transition:all .3s cubic-bezier(.01,.7,1,1);transition:all .3s cubic-bezier(.01,.7,1,1)}.profile-bar .button-green{display:block;margin-bottom:1rem}.profile-bar .profile-data{position:relative}.profile-bar .flag{position:absolute;right:0;top:0;width:12px}.profile-bar .flag path{fill:#b8b8b8;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar .flag:hover path{fill:red;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar h1{line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar h2{color:#555;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#b8b8b8;margin-bottom:1rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#b8b8b8}.profile-bar .profile-stats{border-bottom:1px solid #f5f5f5;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1.25rem;padding:1rem .5rem}.profile-bar .profile-stats .stat{padding:0 .2rem;text-align:center}.profile-bar .profile-stats .stat-number{display:block;line-height:1}.profile-bar .profile-stats .stat-name{display:block}.profile-bar .profile-organizations{border-bottom:1px solid #f5f5f5;border-top:1px solid #f5f5f5;margin-bottom:1rem;padding:1rem 0}.profile-bar .profile-organizations h3{margin-bottom:.5rem}.profile-bar .profile-organizations .profile-organizations-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.profile-bar .profile-organizations .organization{background:#b8b8b8;border-radius:5px;height:45px;margin-right:.2rem;width:45px}.profile-bar .profile-quote{background:url(../images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contact-single .profile-contact-data h1 span{font-size:.9rem}.profile-contact-single .profile-contact-data .extra-info{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-contact-single .profile-contact-data h1,.profile-contact-single .profile-contact-data h1 span{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.profile-contacts{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.profile-contact-filters{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.profile-contact-filters a{border-bottom:2px solid #fff;color:#b8b8b8;display:inline-block;padding:1rem 1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-contact-filters a.active,.profile-contact-filters a:hover{border-bottom:2px solid #b8b8b8;color:#72a114}.profile-contact-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.8rem 1rem}.profile-contact-single .profile-contact-picture{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:1rem;max-width:54px}.profile-contact-single .profile-contact-picture img{border-radius:.2rem;width:100%}.profile-contact-single .profile-contact-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-contact-single .profile-contact-data h1{font-size:1.2rem;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;line-height:1.6;margin-bottom:0;text-transform:none}.profile-contact-single .profile-contact-data h1 span{background:#f5f5f5;color:#555;margin-left:1rem;padding:.1rem .3rem}.profile-contact-single .profile-contact-data p{color:#555;margin-bottom:0}.profile-contact-single .profile-contact-data .extra-info{color:#555}.profile-contact-single .profile-contact-data .position{margin-right:.3rem}.profile-contact-single .profile-project-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-left:auto;width:100px}.profile-contact-single .profile-project-stats div{color:#b8b8b8;margin-right:.5rem}.profile-contact-single .profile-project-stats div .icon{margin-right:.2rem;vertical-align:center}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{color:#b8b8b8;display:inline-block;padding:1rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#444;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #f5f5f5;border-right:1px solid #f5f5f5;position:relative;top:1px;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .icon{margin-right:.4rem}.profile-sidebar h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin-bottom:.5rem;padding:.5rem}.profile-sidebar h4 .icon{color:#b8b8b8;margin-right:.3rem;vertical-align:text-bottom}.profile-sidebar p{font-size:.9rem;color:#b8b8b8}.profile-sidebar a{color:#72a114}.profile-sidebar .trans-button{margin-bottom:1rem}.profile-projects .list-itemtype-project{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:10rem}.profile-projects .list-itemtype-project .project-list-single-title-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.profile-projects .list-itemtype-project .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:200px}.project-list-wrapper .help-area{font-size:.9rem;color:#b8b8b8;width:200px}.project-list-wrapper .drag{font-size:1.2rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:2rem 0 1rem;padding:.9rem 1rem}.project-list-wrapper .project-list-title h1{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.project-list-wrapper .create-options a.create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .create-options a.import-project-button{padding:.53rem .8rem}.project-list-wrapper .create-options a.import-project-button:hover{background:#444}.project-list-wrapper .create-options a.import-project-button .icon-upload{margin:0}.project-list-wrapper .project-list-section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .placeholder{background-color:#fdfdfd;height:5rem}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:#fcfef8;cursor:move;-webkit-transition:background .3s;transition:background .3s}.master,body{background:#fff}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .list-itemtype-project .list-itemtype-project-data-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-list-wrapper .list-itemtype-project .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.project-list-wrapper .drag{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;color:#b8b8b8;opacity:0;-webkit-transition:opacity .2s;transition:opacity .2s}.profile-timeline .single-attachment span{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child,.profile-timeline .activity-member-view a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-timeline .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32}.profile-timeline .activity-item{border-bottom:1px solid #f5f5f5;padding:1rem .5rem 1rem 0;position:relative}.profile-timeline .activity-item p{margin-bottom:0}.profile-timeline .activity-item .username,.profile-timeline .activity-item a{color:#72a114}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{color:#555}.profile-timeline .activity-item a:hover{color:#9dce0a}.profile-timeline .activity-item blockquote{line-height:1.4rem;margin-bottom:0;margin-left:calc(35px + 1rem);margin-top:.5rem;overflow-x:auto;overflow-y:hidden;white-space:pre-line}.profile-timeline .activity-item img{max-height:640px;max-width:640px}.profile-timeline .activity-item .activity-info{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#b8b8b8;font-size:.75rem;position:absolute;right:.5rem;top:1.2rem}.profile-timeline .activity-item .profile-contact-picture,.profile-timeline .activity-item .profile-member-picture{border-radius:.1rem;-webkit-flex-basis:2rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;vertical-align:center;width:2rem}.profile-timeline .activity-item .profile-contact-picture img,.profile-timeline .activity-item .profile-member-picture img{width:100%}.profile-timeline .activity-member-view{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-timeline .activity-member-view p{color:#b8b8b8}a,body{color:#444}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.profile-timeline .single-attachment .icon{margin-right:.3rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{max-height:3rem;max-width:3rem}.markItUpEditor{font-size:.9rem;line-height:1.5;font-family:monospace}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}.menu-secondary{background:#f5f5f5}.menu-tertiary{background-color:#879b89}.extrabar{background:#f5f5f5}h1,h2,h3,h4,h5,h6{color:#050505}a:hover{color:#72a114}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{background:#f5f5f5;border-color:#b8b8b8;color:#444}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#9f9f9f}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#9f9f9f}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#9f9f9f}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#9f9f9f}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{border:1px solid red}.checksley-error-list{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,0,0,.7);color:#fff}blockquote{border-left:5px solid #f5f5f5}blockquote,blockquote p,cite{color:#555}.summary{background:#444;color:#fff}.kanban-table-header .task-colum-name .icon,.taskboard-table-header .task-colum-name .icon{color:#b8b8b8}.navbar{background:rgba(0,0,0,.5)}.navbar::after{background:url(../images/menu-vert.png) top left}tg-project-menu{background-color:#879b89;background-image:url(../images/menu.png)}.kanban-table-body .kanban-uses-box,.kanban-table-header .task-colum-name,.taskboard-table-body .taskboard-tasks-box{background:#f5f5f5}.main-nav svg path{fill:#fff}.taskboard-table-header .task-colum-name{background:#f5f5f5;border-top:3px solid #b8b8b8}.kanban-table-header .task-colum-name{border-top:3px solid #b8b8b8} \ No newline at end of file diff --git a/dist/v-1454172424320/fonts/OpenSans-Bold.ttf b/dist/v-1454396495445/fonts/OpenSans-Bold.ttf similarity index 100% rename from dist/v-1454172424320/fonts/OpenSans-Bold.ttf rename to dist/v-1454396495445/fonts/OpenSans-Bold.ttf diff --git a/dist/v-1454172424320/fonts/OpenSans-CondLight.eot b/dist/v-1454396495445/fonts/OpenSans-CondLight.eot similarity index 100% rename from dist/v-1454172424320/fonts/OpenSans-CondLight.eot rename to dist/v-1454396495445/fonts/OpenSans-CondLight.eot diff --git a/dist/v-1454172424320/fonts/OpenSans-CondLight.svg b/dist/v-1454396495445/fonts/OpenSans-CondLight.svg similarity index 100% rename from dist/v-1454172424320/fonts/OpenSans-CondLight.svg rename to dist/v-1454396495445/fonts/OpenSans-CondLight.svg diff --git a/dist/v-1454172424320/fonts/OpenSans-CondLight.ttf b/dist/v-1454396495445/fonts/OpenSans-CondLight.ttf similarity index 100% rename from dist/v-1454172424320/fonts/OpenSans-CondLight.ttf rename to dist/v-1454396495445/fonts/OpenSans-CondLight.ttf diff --git a/dist/v-1454172424320/fonts/OpenSans-CondLight.woff b/dist/v-1454396495445/fonts/OpenSans-CondLight.woff similarity index 100% rename from dist/v-1454172424320/fonts/OpenSans-CondLight.woff rename to dist/v-1454396495445/fonts/OpenSans-CondLight.woff diff --git a/dist/v-1454172424320/fonts/OpenSans-Light.ttf b/dist/v-1454396495445/fonts/OpenSans-Light.ttf similarity index 100% rename from dist/v-1454172424320/fonts/OpenSans-Light.ttf rename to dist/v-1454396495445/fonts/OpenSans-Light.ttf diff --git a/dist/v-1454172424320/fonts/OpenSans-Regular.ttf b/dist/v-1454396495445/fonts/OpenSans-Regular.ttf similarity index 100% rename from dist/v-1454172424320/fonts/OpenSans-Regular.ttf rename to dist/v-1454396495445/fonts/OpenSans-Regular.ttf diff --git a/dist/v-1454172424320/fonts/OpenSans-Semibold.ttf b/dist/v-1454396495445/fonts/OpenSans-Semibold.ttf similarity index 100% rename from dist/v-1454172424320/fonts/OpenSans-Semibold.ttf rename to dist/v-1454396495445/fonts/OpenSans-Semibold.ttf diff --git a/dist/v-1454172424320/fonts/taiga.eot b/dist/v-1454396495445/fonts/taiga.eot similarity index 100% rename from dist/v-1454172424320/fonts/taiga.eot rename to dist/v-1454396495445/fonts/taiga.eot diff --git a/dist/v-1454172424320/fonts/taiga.svg b/dist/v-1454396495445/fonts/taiga.svg similarity index 100% rename from dist/v-1454172424320/fonts/taiga.svg rename to dist/v-1454396495445/fonts/taiga.svg diff --git a/dist/v-1454172424320/fonts/taiga.ttf b/dist/v-1454396495445/fonts/taiga.ttf similarity index 100% rename from dist/v-1454172424320/fonts/taiga.ttf rename to dist/v-1454396495445/fonts/taiga.ttf diff --git a/dist/v-1454172424320/fonts/taiga.woff b/dist/v-1454396495445/fonts/taiga.woff similarity index 100% rename from dist/v-1454172424320/fonts/taiga.woff rename to dist/v-1454396495445/fonts/taiga.woff diff --git a/dist/v-1454172424320/images/attachment-gallery.png b/dist/v-1454396495445/images/attachment-gallery.png similarity index 100% rename from dist/v-1454172424320/images/attachment-gallery.png rename to dist/v-1454396495445/images/attachment-gallery.png diff --git a/dist/v-1454172424320/images/backlog-empty.png b/dist/v-1454396495445/images/backlog-empty.png similarity index 100% rename from dist/v-1454172424320/images/backlog-empty.png rename to dist/v-1454396495445/images/backlog-empty.png diff --git a/dist/v-1454172424320/images/beta.png b/dist/v-1454396495445/images/beta.png similarity index 100% rename from dist/v-1454172424320/images/beta.png rename to dist/v-1454396495445/images/beta.png diff --git a/dist/v-1454172424320/images/bg.png b/dist/v-1454396495445/images/bg.png similarity index 100% rename from dist/v-1454172424320/images/bg.png rename to dist/v-1454396495445/images/bg.png diff --git a/dist/v-1454172424320/images/discover.png b/dist/v-1454396495445/images/discover.png similarity index 100% rename from dist/v-1454172424320/images/discover.png rename to dist/v-1454396495445/images/discover.png diff --git a/dist/v-1454172424320/images/favicon.png b/dist/v-1454396495445/images/favicon.png similarity index 100% rename from dist/v-1454172424320/images/favicon.png rename to dist/v-1454396495445/images/favicon.png diff --git a/dist/v-1454172424320/images/invitation_bg.jpg b/dist/v-1454396495445/images/invitation_bg.jpg similarity index 100% rename from dist/v-1454172424320/images/invitation_bg.jpg rename to dist/v-1454396495445/images/invitation_bg.jpg diff --git a/dist/v-1454172424320/images/issues-empty.png b/dist/v-1454396495445/images/issues-empty.png similarity index 100% rename from dist/v-1454172424320/images/issues-empty.png rename to dist/v-1454396495445/images/issues-empty.png diff --git a/dist/v-1454172424320/images/logo-color.png b/dist/v-1454396495445/images/logo-color.png similarity index 100% rename from dist/v-1454172424320/images/logo-color.png rename to dist/v-1454396495445/images/logo-color.png diff --git a/dist/v-1454172424320/images/logo.png b/dist/v-1454396495445/images/logo.png similarity index 100% rename from dist/v-1454172424320/images/logo.png rename to dist/v-1454396495445/images/logo.png diff --git a/dist/v-1454172424320/images/looking-for-people.png b/dist/v-1454396495445/images/looking-for-people.png similarity index 100% rename from dist/v-1454172424320/images/looking-for-people.png rename to dist/v-1454396495445/images/looking-for-people.png diff --git a/dist/v-1454172424320/images/markitup/bg-container.png b/dist/v-1454396495445/images/markitup/bg-container.png similarity index 100% rename from dist/v-1454172424320/images/markitup/bg-container.png rename to dist/v-1454396495445/images/markitup/bg-container.png diff --git a/dist/v-1454172424320/images/markitup/bg-editor-bbcode.png b/dist/v-1454396495445/images/markitup/bg-editor-bbcode.png similarity index 100% rename from dist/v-1454172424320/images/markitup/bg-editor-bbcode.png rename to dist/v-1454396495445/images/markitup/bg-editor-bbcode.png diff --git a/dist/v-1454172424320/images/markitup/bg-editor-dotclear.png b/dist/v-1454396495445/images/markitup/bg-editor-dotclear.png similarity index 100% rename from dist/v-1454172424320/images/markitup/bg-editor-dotclear.png rename to dist/v-1454396495445/images/markitup/bg-editor-dotclear.png diff --git a/dist/v-1454172424320/images/markitup/bg-editor-html.png b/dist/v-1454396495445/images/markitup/bg-editor-html.png similarity index 100% rename from dist/v-1454172424320/images/markitup/bg-editor-html.png rename to dist/v-1454396495445/images/markitup/bg-editor-html.png diff --git a/dist/v-1454172424320/images/markitup/bg-editor-json.png b/dist/v-1454396495445/images/markitup/bg-editor-json.png similarity index 100% rename from dist/v-1454172424320/images/markitup/bg-editor-json.png rename to dist/v-1454396495445/images/markitup/bg-editor-json.png diff --git a/dist/v-1454172424320/images/markitup/bg-editor-markdown.png b/dist/v-1454396495445/images/markitup/bg-editor-markdown.png similarity index 100% rename from dist/v-1454172424320/images/markitup/bg-editor-markdown.png rename to dist/v-1454396495445/images/markitup/bg-editor-markdown.png diff --git a/dist/v-1454172424320/images/markitup/bg-editor-textile.png b/dist/v-1454396495445/images/markitup/bg-editor-textile.png similarity index 100% rename from dist/v-1454172424320/images/markitup/bg-editor-textile.png rename to dist/v-1454396495445/images/markitup/bg-editor-textile.png diff --git a/dist/v-1454172424320/images/markitup/bg-editor-wiki.png b/dist/v-1454396495445/images/markitup/bg-editor-wiki.png similarity index 100% rename from dist/v-1454172424320/images/markitup/bg-editor-wiki.png rename to dist/v-1454396495445/images/markitup/bg-editor-wiki.png diff --git a/dist/v-1454172424320/images/markitup/bg-editor-xml.png b/dist/v-1454396495445/images/markitup/bg-editor-xml.png similarity index 100% rename from dist/v-1454172424320/images/markitup/bg-editor-xml.png rename to dist/v-1454396495445/images/markitup/bg-editor-xml.png diff --git a/dist/v-1454172424320/images/markitup/bg-editor.png b/dist/v-1454396495445/images/markitup/bg-editor.png similarity index 100% rename from dist/v-1454172424320/images/markitup/bg-editor.png rename to dist/v-1454396495445/images/markitup/bg-editor.png diff --git a/dist/v-1454172424320/images/markitup/body.png b/dist/v-1454396495445/images/markitup/body.png similarity index 100% rename from dist/v-1454172424320/images/markitup/body.png rename to dist/v-1454396495445/images/markitup/body.png diff --git a/dist/v-1454172424320/images/markitup/bold.png b/dist/v-1454396495445/images/markitup/bold.png similarity index 100% rename from dist/v-1454172424320/images/markitup/bold.png rename to dist/v-1454396495445/images/markitup/bold.png diff --git a/dist/v-1454172424320/images/markitup/clean.png b/dist/v-1454396495445/images/markitup/clean.png similarity index 100% rename from dist/v-1454172424320/images/markitup/clean.png rename to dist/v-1454396495445/images/markitup/clean.png diff --git a/dist/v-1454172424320/images/markitup/code.png b/dist/v-1454396495445/images/markitup/code.png similarity index 100% rename from dist/v-1454172424320/images/markitup/code.png rename to dist/v-1454396495445/images/markitup/code.png diff --git a/dist/v-1454172424320/images/markitup/h1.png b/dist/v-1454396495445/images/markitup/h1.png similarity index 100% rename from dist/v-1454172424320/images/markitup/h1.png rename to dist/v-1454396495445/images/markitup/h1.png diff --git a/dist/v-1454172424320/images/markitup/h2.png b/dist/v-1454396495445/images/markitup/h2.png similarity index 100% rename from dist/v-1454172424320/images/markitup/h2.png rename to dist/v-1454396495445/images/markitup/h2.png diff --git a/dist/v-1454172424320/images/markitup/h3.png b/dist/v-1454396495445/images/markitup/h3.png similarity index 100% rename from dist/v-1454172424320/images/markitup/h3.png rename to dist/v-1454396495445/images/markitup/h3.png diff --git a/dist/v-1454172424320/images/markitup/h4.png b/dist/v-1454396495445/images/markitup/h4.png similarity index 100% rename from dist/v-1454172424320/images/markitup/h4.png rename to dist/v-1454396495445/images/markitup/h4.png diff --git a/dist/v-1454172424320/images/markitup/h5.png b/dist/v-1454396495445/images/markitup/h5.png similarity index 100% rename from dist/v-1454172424320/images/markitup/h5.png rename to dist/v-1454396495445/images/markitup/h5.png diff --git a/dist/v-1454172424320/images/markitup/h6.png b/dist/v-1454396495445/images/markitup/h6.png similarity index 100% rename from dist/v-1454172424320/images/markitup/h6.png rename to dist/v-1454396495445/images/markitup/h6.png diff --git a/dist/v-1454172424320/images/markitup/handle.png b/dist/v-1454396495445/images/markitup/handle.png similarity index 100% rename from dist/v-1454172424320/images/markitup/handle.png rename to dist/v-1454396495445/images/markitup/handle.png diff --git a/dist/v-1454172424320/images/markitup/help.png b/dist/v-1454396495445/images/markitup/help.png similarity index 100% rename from dist/v-1454172424320/images/markitup/help.png rename to dist/v-1454396495445/images/markitup/help.png diff --git a/dist/v-1454172424320/images/markitup/image.png b/dist/v-1454396495445/images/markitup/image.png similarity index 100% rename from dist/v-1454172424320/images/markitup/image.png rename to dist/v-1454396495445/images/markitup/image.png diff --git a/dist/v-1454172424320/images/markitup/italic.png b/dist/v-1454396495445/images/markitup/italic.png similarity index 100% rename from dist/v-1454172424320/images/markitup/italic.png rename to dist/v-1454396495445/images/markitup/italic.png diff --git a/dist/v-1454172424320/images/markitup/jaysalvat.png b/dist/v-1454396495445/images/markitup/jaysalvat.png similarity index 100% rename from dist/v-1454172424320/images/markitup/jaysalvat.png rename to dist/v-1454396495445/images/markitup/jaysalvat.png diff --git a/dist/v-1454172424320/images/markitup/link.png b/dist/v-1454396495445/images/markitup/link.png similarity index 100% rename from dist/v-1454172424320/images/markitup/link.png rename to dist/v-1454396495445/images/markitup/link.png diff --git a/dist/v-1454172424320/images/markitup/list-bullet.png b/dist/v-1454396495445/images/markitup/list-bullet.png similarity index 100% rename from dist/v-1454172424320/images/markitup/list-bullet.png rename to dist/v-1454396495445/images/markitup/list-bullet.png diff --git a/dist/v-1454172424320/images/markitup/list-numeric.png b/dist/v-1454396495445/images/markitup/list-numeric.png similarity index 100% rename from dist/v-1454172424320/images/markitup/list-numeric.png rename to dist/v-1454396495445/images/markitup/list-numeric.png diff --git a/dist/v-1454172424320/images/markitup/markitup.png b/dist/v-1454396495445/images/markitup/markitup.png similarity index 100% rename from dist/v-1454172424320/images/markitup/markitup.png rename to dist/v-1454396495445/images/markitup/markitup.png diff --git a/dist/v-1454172424320/images/markitup/menu.png b/dist/v-1454396495445/images/markitup/menu.png similarity index 100% rename from dist/v-1454172424320/images/markitup/menu.png rename to dist/v-1454396495445/images/markitup/menu.png diff --git a/dist/v-1454172424320/images/markitup/picture.png b/dist/v-1454396495445/images/markitup/picture.png similarity index 100% rename from dist/v-1454172424320/images/markitup/picture.png rename to dist/v-1454396495445/images/markitup/picture.png diff --git a/dist/v-1454172424320/images/markitup/preview.png b/dist/v-1454396495445/images/markitup/preview.png similarity index 100% rename from dist/v-1454172424320/images/markitup/preview.png rename to dist/v-1454396495445/images/markitup/preview.png diff --git a/dist/v-1454172424320/images/markitup/preview_ico.png b/dist/v-1454396495445/images/markitup/preview_ico.png similarity index 100% rename from dist/v-1454172424320/images/markitup/preview_ico.png rename to dist/v-1454396495445/images/markitup/preview_ico.png diff --git a/dist/v-1454172424320/images/markitup/quotes.png b/dist/v-1454396495445/images/markitup/quotes.png similarity index 100% rename from dist/v-1454172424320/images/markitup/quotes.png rename to dist/v-1454396495445/images/markitup/quotes.png diff --git a/dist/v-1454172424320/images/markitup/stroke.png b/dist/v-1454396495445/images/markitup/stroke.png similarity index 100% rename from dist/v-1454172424320/images/markitup/stroke.png rename to dist/v-1454396495445/images/markitup/stroke.png diff --git a/dist/v-1454172424320/images/markitup/submenu.png b/dist/v-1454396495445/images/markitup/submenu.png similarity index 100% rename from dist/v-1454172424320/images/markitup/submenu.png rename to dist/v-1454396495445/images/markitup/submenu.png diff --git a/dist/v-1454172424320/images/menu-vert.png b/dist/v-1454396495445/images/menu-vert.png similarity index 100% rename from dist/v-1454172424320/images/menu-vert.png rename to dist/v-1454396495445/images/menu-vert.png diff --git a/dist/v-1454172424320/images/menu.png b/dist/v-1454396495445/images/menu.png similarity index 100% rename from dist/v-1454172424320/images/menu.png rename to dist/v-1454396495445/images/menu.png diff --git a/dist/v-1454172424320/images/notification-decoration.png b/dist/v-1454396495445/images/notification-decoration.png similarity index 100% rename from dist/v-1454172424320/images/notification-decoration.png rename to dist/v-1454396495445/images/notification-decoration.png diff --git a/dist/v-1454172424320/images/project-logos/project-logo-01.png b/dist/v-1454396495445/images/project-logos/project-logo-01.png similarity index 100% rename from dist/v-1454172424320/images/project-logos/project-logo-01.png rename to dist/v-1454396495445/images/project-logos/project-logo-01.png diff --git a/dist/v-1454172424320/images/project-logos/project-logo-02.png b/dist/v-1454396495445/images/project-logos/project-logo-02.png similarity index 100% rename from dist/v-1454172424320/images/project-logos/project-logo-02.png rename to dist/v-1454396495445/images/project-logos/project-logo-02.png diff --git a/dist/v-1454172424320/images/project-logos/project-logo-03.png b/dist/v-1454396495445/images/project-logos/project-logo-03.png similarity index 100% rename from dist/v-1454172424320/images/project-logos/project-logo-03.png rename to dist/v-1454396495445/images/project-logos/project-logo-03.png diff --git a/dist/v-1454172424320/images/project-logos/project-logo-04.png b/dist/v-1454396495445/images/project-logos/project-logo-04.png similarity index 100% rename from dist/v-1454172424320/images/project-logos/project-logo-04.png rename to dist/v-1454396495445/images/project-logos/project-logo-04.png diff --git a/dist/v-1454172424320/images/project-logos/project-logo-05.png b/dist/v-1454396495445/images/project-logos/project-logo-05.png similarity index 100% rename from dist/v-1454172424320/images/project-logos/project-logo-05.png rename to dist/v-1454396495445/images/project-logos/project-logo-05.png diff --git a/dist/v-1454172424320/images/quote.png b/dist/v-1454396495445/images/quote.png similarity index 100% rename from dist/v-1454172424320/images/quote.png rename to dist/v-1454396495445/images/quote.png diff --git a/dist/v-1454172424320/images/search-empty.png b/dist/v-1454396495445/images/search-empty.png similarity index 100% rename from dist/v-1454172424320/images/search-empty.png rename to dist/v-1454396495445/images/search-empty.png diff --git a/dist/v-1454172424320/images/sprint-empty.png b/dist/v-1454396495445/images/sprint-empty.png similarity index 100% rename from dist/v-1454172424320/images/sprint-empty.png rename to dist/v-1454396495445/images/sprint-empty.png diff --git a/dist/v-1454172424320/images/unnamed.png b/dist/v-1454396495445/images/unnamed.png similarity index 100% rename from dist/v-1454172424320/images/unnamed.png rename to dist/v-1454396495445/images/unnamed.png diff --git a/dist/v-1454172424320/images/user-noimage.png b/dist/v-1454396495445/images/user-noimage.png similarity index 100% rename from dist/v-1454172424320/images/user-noimage.png rename to dist/v-1454396495445/images/user-noimage.png diff --git a/dist/v-1454172424320/js/app-loader.js b/dist/v-1454396495445/js/app-loader.js similarity index 98% rename from dist/v-1454172424320/js/app-loader.js rename to dist/v-1454396495445/js/app-loader.js index 9cbe4d4..e5a9529 100644 --- a/dist/v-1454172424320/js/app-loader.js +++ b/dist/v-1454396495445/js/app-loader.js @@ -1,7 +1,7 @@ (function() { var loadPlugin, loadPlugins, loadStylesheet, promise; - window._version = "v-1454172424320"; + window._version = "v-1454396495445"; window.taigaConfig = { "api": "http://localhost:8000/api/v1/", diff --git a/dist/v-1454172424320/js/app.js b/dist/v-1454396495445/js/app.js similarity index 63% rename from dist/v-1454172424320/js/app.js rename to dist/v-1454396495445/js/app.js index beeffec..2de41c4 100644 --- a/dist/v-1454172424320/js/app.js +++ b/dist/v-1454396495445/js/app.js @@ -8,16 +8,16 @@ i=j=0,ref=n-1;ref>=0?ref>=j:j>=ref;i=ref>=0?++j:--j)heading+=char;return"\n"+hea return function(){return items=_this.resortUserStories(newSprint.user_stories,"sprint_order"),data=_this.prepareBulkUpdateData(items,"sprint_order"),_this.rs.userstories.bulkUpdateSprintOrder(project,data).then(function(result){return _this.rootscope.$broadcast("sprint:us:moved",us,oldSprintId,newSprintId)}),_this.rs.userstories.bulkUpdateBacklogOrder(project,data).then(function(){var len3,n,results;for(results=[],n=0,len3=usList.length;len3>n;n++)us=usList[n],results.push(_this.rootscope.$broadcast("sprint:us:moved",us,oldSprintId,newSprintId));return results}),movedToClosedSprint||movedFromClosedSprint?_this.scope.$broadcast("backlog:load-closed-sprints"):void 0}}(this)),promise.then(null,function(){return console.log("FAIL")}),promise},BacklogController.prototype.isFilterSelected=function(type,id){return null!=this.searchdata[type]&&this.searchdata[type][id]?!0:!1},BacklogController.prototype.setSearchDataFilters=function(){var name,results,urlfilters,val,value;urlfilters=this.getUrlFilters(),urlfilters.q&&(this.scope.filtersQ=this.scope.filtersQ||urlfilters.q),this.searchdata={},results=[];for(name in urlfilters)value=urlfilters[name],null==this.searchdata[name]&&(this.searchdata[name]={}),results.push(function(){var j,len,ref1,results1;for(ref1=taiga.toString(value).split(","),results1=[],j=0,len=ref1.length;len>j;j++)val=ref1[j],results1.push(this.searchdata[name][val]=!0);return results1}.call(this));return results},BacklogController.prototype.getUrlFilters=function(){return _.pick(this.location.search(),"status","tags","q")},BacklogController.prototype.generateFilters=function(){var loadFilters,urlfilters;return urlfilters=this.getUrlFilters(),this.scope.filters={},loadFilters={},loadFilters.project=this.scope.projectId,loadFilters.tags=urlfilters.tags,loadFilters.status=urlfilters.status,loadFilters.q=urlfilters.q,loadFilters.milestone="null",this.rs.userstories.filtersData(loadFilters).then(function(_this){return function(data){var choicesFiltersFormat,selectedStatuses,selectedTags,tagsFilterFormat;return choicesFiltersFormat=function(choices,type,byIdObject){return _.map(choices,function(t){return t.type=type,t})},tagsFilterFormat=function(tags){return _.map(tags,function(t){return t.id=t.name,t.type="tags",t})},_this.scope.filters.status=choicesFiltersFormat(data.statuses,"status",_this.scope.usStatusById),_this.scope.filters.tags=tagsFilterFormat(data.tags),selectedTags=_.filter(_this.scope.filters.tags,"selected"),selectedTags=_.map(selectedTags,"id"),selectedStatuses=_.filter(_this.scope.filters.status,"selected"),selectedStatuses=_.map(selectedStatuses,"id"),_this.markSelectedFilters(_this.scope.filters,urlfilters),_this.rs.userstories.storeQueryParams(_this.scope.projectId,{status:selectedStatuses,tags:selectedTags,project:_this.scope.projectId,milestone:null})}}(this))},BacklogController.prototype.markSelectedFilters=function(filters,urlfilters){var isSelected,j,key,len,name,obj,ref1,ref2,results,searchdata,val,value;searchdata={},ref1=_.omit(urlfilters,"page","orderBy");for(name in ref1)for(value=ref1[name],null==searchdata[name]&&(searchdata[name]={}),ref2=(""+value).split(","),j=0,len=ref2.length;len>j;j++)val=ref2[j],searchdata[name][val]=!0;isSelected=function(type,id){return null!=searchdata[type]&&searchdata[type][id]?!0:!1},results=[];for(key in filters)value=filters[key],results.push(function(){var l,len1,results1;for(results1=[],l=0,len1=value.length;len1>l;l++)obj=value[l],results1.push(obj.selected=isSelected(obj.type,obj.id)?!0:void 0);return results1}());return results},BacklogController.prototype.updateUserStoryStatus=function(){return this.setSearchDataFilters(),this.generateFilters().then(function(_this){return function(){return _this.rootscope.$broadcast("filters:update"),_this.loadProjectStats()}}(this))},BacklogController.prototype.editUserStory=function(projectId,ref,$event){var currentLoading,target;return target=$($event.target),currentLoading=this.loading().target(target).removeClasses("icon-edit").timeout(200).start(),this.rs.userstories.getByRef(projectId,ref).then(function(_this){return function(us){return _this.rs2.attachments.list("us",us.id,projectId).then(function(attachments){return _this.rootscope.$broadcast("usform:edit",us,attachments.toJS()),currentLoading.finish()})}}(this))},BacklogController.prototype.deleteUserStory=function(us){var message,title;return title=this.translate.instant("US.TITLE_DELETE_ACTION"),message=us.subject,this.confirm.askOnDelete(title,message).then(function(_this){return function(askResponse){var promise;return _this.scope.userstories=_.without(_this.scope.userstories,us),promise=_this.repo.remove(us),promise.then(function(){return askResponse.finish(),_this.loadBacklog()}),promise.then(null,function(){return askResponse.finish(!1),_this.confirm.notify("error")})}}(this))},BacklogController.prototype.addNewUs=function(type){switch(type){case"standard":return this.rootscope.$broadcast("usform:new",this.scope.projectId,this.scope.project.default_us_status,this.scope.usStatusList);case"bulk":return this.rootscope.$broadcast("usform:bulk",this.scope.projectId,this.scope.project.default_us_status)}},BacklogController.prototype.addNewSprint=function(){return this.rootscope.$broadcast("sprintform:create",this.scope.projectId)},BacklogController.prototype.findCurrentSprint=function(){var currentDate;return currentDate=(new Date).getTime(),_.find(this.scope.sprints,function(sprint){var end,start;return start=moment(sprint.estimated_start,"YYYY-MM-DD").format("x"),end=moment(sprint.estimated_finish,"YYYY-MM-DD").format("x"),currentDate>=start&&end>=currentDate})},BacklogController}(mixOf(taiga.Controller,taiga.PageMixin,taiga.FiltersMixin)),module.controller("BacklogController",BacklogController),BacklogDirective=function($repo,$rootscope,$translate){var doomLineTemplate,link,linkDoomLine,linkFilters,linkToolbar,showHideFilter,showHideTags;return doomLineTemplate=_.template('
<%- text %>
'),linkDoomLine=function($scope,$el,$attrs,$ctrl){var addDoomLineDom,getUsItems,reloadDoomLine,removeDoomlineDom;return reloadDoomLine=function(){var current_sum,domElement,i,j,len,ref1,results,stats,total_points,us;if(null!=$scope.stats&&null!=$scope.stats.total_points&&0!==$scope.stats.total_points){if(removeDoomlineDom(),stats=$scope.stats,total_points=stats.total_points,current_sum=stats.assigned_points,!$scope.userstories)return;for(ref1=$scope.userstories,results=[],i=j=0,len=ref1.length;len>j;i=++j){if(us=ref1[i],current_sum+=us.total_points,current_sum>total_points){domElement=$el.find(".backlog-table-body .us-item-row")[i],addDoomLineDom(domElement);break}results.push(void 0)}return results}},removeDoomlineDom=function(){return $el.find(".doom-line").remove()},addDoomLineDom=function(element){var text;return text=$translate.instant("BACKLOG.DOOMLINE"),$(element).before(doomLineTemplate({text:text}))},getUsItems=function(){var rowElements;return rowElements=$el.find(".backlog-table-body .us-item-row"),_.map(rowElements,function(x){return angular.element(x)})},$scope.$on("userstories:loaded",reloadDoomLine),$scope.$watch("stats",reloadDoomLine)},linkToolbar=function($scope,$el,$attrs,$ctrl){var checkSelected,getUsToMove,lastChecked,moveToCurrentSprint,moveToLatestSprint,moveUssToSprint,shiftPressed;return getUsToMove=function(){var ussDom;return ussDom=$el.find(".backlog-table-body input:checkbox:checked"),_.map(ussDom,function(item){var itemScope;return item=$(item).closest(".tg-scope"),itemScope=item.scope(),itemScope.us.milestone=$scope.sprints[0].id,itemScope.us})},moveUssToSprint=function(selectedUss,sprint){var extraPoints,totalExtraPoints,ussCurrent;return ussCurrent=_($scope.userstories),$scope.userstories=ussCurrent.without.apply(ussCurrent,selectedUss).value(),extraPoints=_.map(selectedUss,function(v,k){return v.total_points}),totalExtraPoints=_.reduce(extraPoints,function(acc,num){return acc+num}),sprint.user_stories=_.union(sprint.user_stories,selectedUss),sprint.total_points+=totalExtraPoints,$repo.saveAll(selectedUss).then(function(){return $ctrl.loadSprints(),$ctrl.loadProjectStats()}),$el.find(".move-to-sprint").hide()},moveToCurrentSprint=function(selectedUss){return moveUssToSprint(selectedUss,$scope.currentSprint)},moveToLatestSprint=function(selectedUss){return moveUssToSprint(selectedUss,$scope.sprints[0])},shiftPressed=!1,lastChecked=null,checkSelected=function(target){var moveToSprintDom,selectedUsDom;return lastChecked=target.closest(".us-item-row"),target.closest(".us-item-row").toggleClass("ui-multisortable-multiple"),moveToSprintDom=$el.find(".move-to-sprint"),selectedUsDom=$el.find(".backlog-table-body input:checkbox:checked"),selectedUsDom.length>0&&$scope.sprints.length>0?moveToSprintDom.show():moveToSprintDom.hide()},$(window).on("keydown.shift-pressed keyup.shift-pressed",function(event){return shiftPressed=!!event.shiftKey,!0}),$el.on("change",".backlog-table-body input:checkbox",function(event){var current,elements,nextAll,prevAll,target;return lastChecked&&shiftPressed&&(elements=[],current=$(event.currentTarget).closest(".us-item-row"),nextAll=lastChecked.nextAll(),prevAll=lastChecked.prevAll(),_.some(nextAll,function(next){return next===current[0]})?elements=lastChecked.nextUntil(current):_.some(prevAll,function(prev){return prev===current[0]})&&(elements=lastChecked.prevUntil(current)),_.map(elements,function(elm){var input;return input=$(elm).find("input:checkbox"),input.prop("checked",!0),checkSelected(input)})),target=angular.element(event.currentTarget),target.closest(".us-item-row").toggleClass("is-checked"),checkSelected(target)}),$el.on("click","#move-to-latest-sprint",function(_this){return function(event){var ussToMove;return ussToMove=getUsToMove(),$scope.$apply(_.partial(moveToLatestSprint,ussToMove))}}(this)),$el.on("click","#move-to-current-sprint",function(_this){return function(event){var ussToMove;return ussToMove=getUsToMove(),$scope.$apply(_.partial(moveToCurrentSprint,ussToMove))}}(this)),$el.on("click","#show-tags",function(event){return event.preventDefault(),$ctrl.toggleShowTags(),showHideTags($ctrl)})},showHideTags=function($ctrl){var elm,text;return elm=angular.element("#show-tags"),$ctrl.showTags?(elm.addClass("active"),text=$translate.instant("BACKLOG.TAGS.HIDE"),elm.text(text)):(elm.removeClass("active"),text=$translate.instant("BACKLOG.TAGS.SHOW"),elm.text(text))},showHideFilter=function($scope,$el,$ctrl){var hideText,showText,sidebar,target;return sidebar=$el.find("sidebar.filters-bar"),sidebar.one("transitionend",function(){return timeout(150,function(){return $rootscope.$broadcast("resize"),$(".burndown").css("visibility","visible")})}),target=angular.element("#show-filters-button"),$(".burndown").css("visibility","hidden"),sidebar.toggleClass("active"),target.toggleClass("active"),hideText=$translate.instant("BACKLOG.FILTERS.HIDE"),showText=$translate.instant("BACKLOG.FILTERS.SHOW"),toggleText(target,[hideText,showText]),sidebar.hasClass("active")?$ctrl.restoreFilters():$ctrl.resetFilters(),$ctrl.toggleActiveFilters()},linkFilters=function($scope,$el,$attrs,$ctrl){return $scope.filtersSearch={},$el.on("click","#show-filters-button",function(event){return event.preventDefault(),$scope.$apply(function(){return showHideFilter($scope,$el,$ctrl)})})},link=function($scope,$el,$attrs,$rootscope){var $ctrl,filters;return $ctrl=$el.controller(),linkToolbar($scope,$el,$attrs,$ctrl),linkFilters($scope,$el,$attrs,$ctrl),linkDoomLine($scope,$el,$attrs,$ctrl),$el.find(".backlog-table-body").disableSelection(),filters=$ctrl.getUrlFilters(),(filters.status||filters.tags||filters.q)&&showHideFilter($scope,$el,$ctrl),$scope.$on("showTags",function(){return showHideTags($ctrl)}),$scope.$on("$destroy",function(){return $el.off(),$(window).off(".shift-pressed")})},{link:link}},module.directive("tgBacklog",["$tgRepo","$rootScope","$translate",BacklogDirective]),UsRolePointsSelectorDirective=function($rootscope,$template,$compile,$translate){var link,selectionTemplate;return selectionTemplate=$template.get("backlog/us-role-points-popover.html",!0),link=function($scope,$el,$attrs){return bindOnce($scope,"project",function(project){var numberOfRoles,roles;return roles=_.filter(project.roles,"computable"),numberOfRoles=_.size(roles),numberOfRoles>1?$el.append($compile(selectionTemplate({roles:roles}))($scope)):($el.find(".icon-arrow-bottom").remove(),$el.find(".header-points").addClass("not-clickable"))}),$scope.$on("uspoints:select",function(ctx,roleId,roleName){return $el.find(".popover").popover().close(),$el.find(".header-points").html(roleName+"/Total")}),$scope.$on("uspoints:clear-selection",function(ctx,roleId){var text;return $el.find(".popover").popover().close(),text=$translate.instant("COMMON.FIELDS.POINTS"),$el.find(".header-points").text(text)}),$el.on("click",function(event){var target;return target=angular.element(event.target),(target.is("span")||target.is("div"))&&event.stopPropagation(),$el.find(".popover").popover().open()}),$el.on("click",".clear-selection",function(event){return event.preventDefault(),event.stopPropagation(),$rootscope.$broadcast("uspoints:clear-selection")}),$el.on("click",".role",function(event){var rolScope,target;return event.preventDefault(),event.stopPropagation(),target=angular.element(event.currentTarget),rolScope=target.scope(),$rootscope.$broadcast("uspoints:select",target.data("role-id"),target.text())}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgUsRolePointsSelector",["$rootScope","$tgTemplate","$compile",UsRolePointsSelectorDirective]),UsPointsDirective=function($tgEstimationsService,$repo,$tgTemplate){var link,rolesTemplate;return rolesTemplate=$tgTemplate.get("common/estimation/us-points-roles-popover.html",!0),link=function($scope,$el,$attrs){var $ctrl,bindClickElements,estimationProcess,filteringRoleId,renderRolesSelector,selectedRoleId,updatingSelectedRoleId;return $ctrl=$el.controller(),updatingSelectedRoleId=null,selectedRoleId=null,filteringRoleId=null,estimationProcess=null,$scope.$on("uspoints:select",function(ctx,roleId,roleName){var us;return us=$scope.$eval($attrs.tgBacklogUsPoints),selectedRoleId=roleId,estimationProcess.render()}),$scope.$on("uspoints:clear-selection",function(ctx){var us;return us=$scope.$eval($attrs.tgBacklogUsPoints),selectedRoleId=null,estimationProcess.render()}),$scope.$watch($attrs.tgBacklogUsPoints,function(us){var roles;return us?(estimationProcess=$tgEstimationsService.create($el,us,$scope.project),roles=estimationProcess.calculateRoles(),0===roles.length?($el.find(".icon-arrow-bottom").remove(),$el.find("a.us-points").addClass("not-clickable")):1===roles.length&&(selectedRoleId=_.keys(us.points)[0]),estimationProcess.isEditable&&bindClickElements(),estimationProcess.onSelectedPointForRole=function(roleId,pointId){return this.save(roleId,pointId).then(function(){return $ctrl.loadProjectStats()})},estimationProcess.render=function(){var ctx,html,mainTemplate,pointId,pointObj,template,text,title,totalPoints;return totalPoints=this.calculateTotalPoints(),null==selectedRoleId||1===roles.length?(text=totalPoints,title=totalPoints):(pointId=this.us.points[selectedRoleId],pointObj=this.pointsById[pointId],text=pointObj.name+" / "+totalPoints+"",title=pointObj.name+" / "+totalPoints),ctx={totalPoints:totalPoints,roles:this.calculateRoles(),editable:this.isEditable,text:text,title:title},mainTemplate="common/estimation/us-estimation-total.html",template=$tgTemplate.get(mainTemplate,!0),html=template(ctx),this.$el.html(html)},estimationProcess.render()):void 0}),renderRolesSelector=function(){var html,roles;return roles=estimationProcess.calculateRoles(),html=rolesTemplate({roles:roles}),$el.append(html),$el.find(".pop-role").popover().open(function(){return $(this).remove()})},bindClickElements=function(){return $el.on("click","a.us-points span",function(event){var us;return event.preventDefault(),event.stopPropagation(),us=$scope.$eval($attrs.tgBacklogUsPoints),updatingSelectedRoleId=selectedRoleId,null!=selectedRoleId?estimationProcess.renderPointsSelector(selectedRoleId):renderRolesSelector()}),$el.on("click",".role",function(event){var popRolesDom,target,us;return event.preventDefault(),event.stopPropagation(),target=angular.element(event.currentTarget),us=$scope.$eval($attrs.tgBacklogUsPoints),updatingSelectedRoleId=target.data("role-id"),popRolesDom=$el.find(".pop-role"),popRolesDom.find("a").removeClass("active"),popRolesDom.find("a[data-role-id='"+updatingSelectedRoleId+"']").addClass("active"),estimationProcess.renderPointsSelector(updatingSelectedRoleId)})},$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgBacklogUsPoints",["$tgEstimationsService","$tgRepo","$tgTemplate",UsPointsDirective]),ToggleBurndownVisibility=function($storage){var hide,link,show;return hide=function(){return $(".js-burndown-graph").removeClass("shown"),$(".js-toggle-burndown-visibility-button").removeClass("active"),$(".js-burndown-graph").removeClass("open")},show=function(firstLoad){return $(".js-toggle-burndown-visibility-button").addClass("active"),firstLoad?$(".js-burndown-graph").addClass("shown"):$(".js-burndown-graph").addClass("open")},link=function($scope,$el,$attrs){var firstLoad,hash,toggleGraph;return firstLoad=!0,hash=generateHash(["is-burndown-grpahs-collapsed"]),$scope.isBurndownGraphCollapsed=$storage.get(hash)||!1,toggleGraph=function(){return $scope.isBurndownGraphCollapsed?hide(firstLoad):show(firstLoad),firstLoad=!1},$scope.$watch("showGraphPlaceholder",function(){return null!=$scope.showGraphPlaceholder?($scope.isBurndownGraphCollapsed=$scope.isBurndownGraphCollapsed||$scope.showGraphPlaceholder,toggleGraph()):void 0}),$el.on("click",".js-toggle-burndown-visibility-button",function(){return $scope.isBurndownGraphCollapsed=!$scope.isBurndownGraphCollapsed,$storage.set(hash,$scope.isBurndownGraphCollapsed),toggleGraph()}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgToggleBurndownVisibility",["$tgStorage",ToggleBurndownVisibility]),BurndownBacklogGraphDirective=function($translate){var link,redrawChart;return redrawChart=function(element,dataToDraw){var client_increment_line,colors,data,evolution_line,milestonesRange,optimal_line,options,results,team_increment_line,width,zero_line;return width=element.width(),element.height(width/6),milestonesRange=function(){results=[];for(var j=0,ref1=dataToDraw.milestones.length-1;ref1>=0?ref1>=j:j>=ref1;ref1>=0?j++:j--)results.push(j);return results}.apply(this),data=[],zero_line=_.map(dataToDraw.milestones,function(ml){return 0}),data.push({data:_.zip(milestonesRange,zero_line),lines:{fillColor:"rgba(0,0,0,0)"},points:{show:!1}}),optimal_line=_.map(dataToDraw.milestones,function(ml){return ml.optimal}),data.push({data:_.zip(milestonesRange,optimal_line),lines:{fillColor:"rgba(120,120,120,0.2)"}}),evolution_line=_.filter(_.map(dataToDraw.milestones,function(ml){return ml.evolution}),function(evolution){return null!=evolution}),data.push({data:_.zip(milestonesRange,evolution_line),lines:{fillColor:"rgba(102,153,51,0.3)"}}),client_increment_line=_.map(dataToDraw.milestones,function(ml){return-ml["team-increment"]-ml["client-increment"]}),data.push({data:_.zip(milestonesRange,client_increment_line),lines:{fillColor:"rgba(255,51,51,0.3)"}}),team_increment_line=_.map(dataToDraw.milestones,function(ml){return-ml["team-increment"]}),data.push({data:_.zip(milestonesRange,team_increment_line),lines:{fillColor:"rgba(153,51,51,0.3)"}}),colors=["rgba(0,0,0,1)","rgba(120,120,120,0.2)","rgba(102,153,51,1)","rgba(153,51,51,1)","rgba(255,51,51,1)"],options={grid:{borderWidth:{top:0,right:1,left:0,bottom:0},borderColor:"#ccc",hoverable:!0},xaxis:{ticks:dataToDraw.milestones.length,axisLabel:$translate.instant("BACKLOG.CHART.XAXIS_LABEL"),axisLabelUseCanvas:!0,axisLabelFontSizePixels:12,axisLabelFontFamily:"Verdana, Arial, Helvetica, Tahoma, sans-serif",axisLabelPadding:5,tickFormatter:function(val,axis){return""}},yaxis:{axisLabel:$translate.instant("BACKLOG.CHART.YAXIS_LABEL"),axisLabelUseCanvas:!0,axisLabelFontSizePixels:12,axisLabelFontFamily:"Verdana, Arial, Helvetica, Tahoma, sans-serif",axisLabelPadding:5},series:{shadowSize:0,lines:{show:!0,fill:!0},points:{show:!0,fill:!0,radius:4,lineWidth:2}},colors:colors,tooltip:!0,tooltipOpts:{content:function(label,xval,yval,flotItem){var ctx;return 1===flotItem.seriesIndex?(ctx={sprintName:dataToDraw.milestones[xval].name,value:Math.abs(yval)},$translate.instant("BACKLOG.CHART.OPTIMAL",ctx)):2===flotItem.seriesIndex?(ctx={sprintName:dataToDraw.milestones[xval].name,value:Math.abs(yval)},$translate.instant("BACKLOG.CHART.REAL",ctx)):3===flotItem.seriesIndex?(ctx={sprintName:dataToDraw.milestones[xval].name,value:Math.abs(yval)},$translate.instant("BACKLOG.CHART.INCREMENT_CLIENT",ctx)):(ctx={sprintName:dataToDraw.milestones[xval].name,value:Math.abs(yval)},$translate.instant("BACKLOG.CHART.INCREMENT_TEAM",ctx))}}},element.empty(),element.plot(data,options).data("plot")},link=function($scope,$el,$attrs){var element;return element=angular.element($el),$scope.$watch("stats",function(value){return null!=$scope.stats?(redrawChart(element,$scope.stats),$scope.$on("resize",function(){return redrawChart(element,$scope.stats)})):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgBurndownBacklogGraph",["$translate",BurndownBacklogGraphDirective]),TgBacklogProgressBarDirective=function($template,$compile){var adjustPercentaje,link,render,template;return template=$template.get("backlog/progress-bar.html",!0),render=function(scope,el,projectPointsPercentaje,closedPointsPercentaje){var html;return html=template({projectPointsPercentaje:projectPointsPercentaje,closedPointsPercentaje:closedPointsPercentaje}),html=$compile(html)(scope),el.html(html)},adjustPercentaje=function(percentage){var adjusted;return adjusted=_.max([0,percentage]),adjusted=_.min([100,adjusted]),Math.round(adjusted)},link=function($scope,$el,$attrs){var element;return element=angular.element($el),$scope.$watch($attrs.tgBacklogProgressBar,function(stats){var closedPoints,closedPointsPercentaje,definedPoints,projectPointsPercentaje,totalPoints;return null!=stats?(totalPoints=stats.total_points?stats.total_points:stats.defined_points,definedPoints=stats.defined_points,closedPoints=stats.closed_points,definedPoints>totalPoints?(projectPointsPercentaje=100*totalPoints/definedPoints,closedPointsPercentaje=100*closedPoints/definedPoints):(projectPointsPercentaje=100,closedPointsPercentaje=100*closedPoints/totalPoints),projectPointsPercentaje=adjustPercentaje(projectPointsPercentaje-3),closedPointsPercentaje=adjustPercentaje(closedPointsPercentaje-3),render($scope,$el,projectPointsPercentaje,closedPointsPercentaje)):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgBacklogProgressBar",["$tgTemplate","$compile",TgBacklogProgressBarDirective])}.call(this),function(){var BacklogEmptySortableDirective,BacklogSortableDirective,SprintSortableDirective,bindOnce,deleteElement,groupBy,mixOf,module,scopeDefer,taiga,toggleText;taiga=this.taiga,mixOf=this.taiga.mixOf,toggleText=this.taiga.toggleText,scopeDefer=this.taiga.scopeDefer,bindOnce=this.taiga.bindOnce,groupBy=this.taiga.groupBy,module=angular.module("taigaBacklog"),deleteElement=function(el){return el.scope().$destroy(),el.off(),el.remove()},BacklogSortableDirective=function($repo,$rs,$rootscope,$tgConfirm,$translate){var link;return link=function($scope,$el,$attrs){var getUsIndex;return getUsIndex=function(_this){return function(us){return $(us).index(".backlog-table-body .row")}}(this),bindOnce($scope,"project",function(project){var filterError;if(project.my_permissions.indexOf("modify_us")>-1)return filterError=function(){var text;return text=$translate.instant("BACKLOG.SORTABLE_FILTER_ERROR"),$tgConfirm.notify("error",text)},$el.sortable({items:".us-item-row",cancel:".popover",connectWith:".sprint",dropOnEmpty:!0,placeholder:"row us-item-row us-item-drag sortable-placeholder",scroll:!0,disableHorizontalScroll:!0,tolerance:"pointer",revert:!1,start:function(){return $(document.body).addClass("drag-active")},stop:function(){return $(document.body).removeClass("drag-active"),$el.hasClass("active-filters")?($el.sortable("cancel"),filterError()):void 0}}),$el.on("multiplesortreceive",function(event,ui){var itemIndex,itemUs;return $el.hasClass("active-filters")?(ui.source.sortable("cancel"),void filterError()):(itemUs=ui.item.scope().us,itemIndex=getUsIndex(ui.item),deleteElement(ui.item),$scope.$emit("sprint:us:move",[itemUs],itemIndex,null),ui.item.find("a").removeClass("noclick"))}),$el.on("multiplesortstop",function(event,ui){var index,items,us;if(0!==$(ui.items[0]).parent().length&&!$el.hasClass("active-filters"))return items=_.sortBy(ui.items,function(item){return $(item).index()}),index=_.min(_.map(items,function(item){return getUsIndex(item)})),us=_.map(items,function(item){var itemUs;return item=$(item),itemUs=item.scope().us,setTimeout(function(_this){return function(){return item.find("a").removeClass("noclick")}}(this),300),itemUs}),$scope.$emit("sprint:us:move",us,index,null)}),$el.on("sortstart",function(event,ui){return ui.item.find("a").addClass("noclick")})}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},BacklogEmptySortableDirective=function($repo,$rs,$rootscope){var link;return link=function($scope,$el,$attrs){return bindOnce($scope,"project",function(project){return project.my_permissions.indexOf("modify_us")>-1?($el.sortable({items:".us-item-row",dropOnEmpty:!0}),$el.on("sortreceive",function(event,ui){var itemIndex,itemUs;return itemUs=ui.item.scope().us,itemIndex=ui.item.index(),deleteElement(ui.item),$scope.$emit("sprint:us:move",[itemUs],itemIndex,null),ui.item.find("a").removeClass("noclick")})):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},SprintSortableDirective=function($repo,$rs,$rootscope){var link;return link=function($scope,$el,$attrs){return bindOnce($scope,"project",function(project){return project.my_permissions.indexOf("modify_us")>-1?($el.sortable({scroll:!0,dropOnEmpty:!0,items:".sprint-table .milestone-us-item-row",disableHorizontalScroll:!0,connectWith:".sprint,.backlog-table-body,.empty-backlog",placeholder:"row us-item-row sortable-placeholder",forcePlaceholderSize:!0}),$el.on("multiplesortreceive",function(event,ui){var index,items,us;return items=_.sortBy(ui.items,function(item){return $(item).index()}),index=_.min(_.map(items,function(item){return $(item).index()})),us=_.map(items,function(item){var itemUs;return item=$(item),itemUs=item.scope().us,deleteElement(item),itemUs}),$scope.$emit("sprint:us:move",us,index,$scope.sprint.id)}),$el.on("multiplesortstop",function(event,ui){var itemIndex,itemUs;if(0!==ui.item.parent().length)return itemUs=ui.item.scope().us,itemIndex=ui.item.index(),setTimeout(function(_this){return function(){return ui.item.find("a").removeClass("noclick")}}(this),300),$scope.$emit("sprint:us:move",[itemUs],itemIndex,$scope.sprint.id)}),$el.on("sortstart",function(event,ui){return ui.item.find("a").addClass("noclick")})):void 0})},{link:link}},module.directive("tgBacklogSortable",["$tgRepo","$tgResources","$rootScope","$tgConfirm","$translate",BacklogSortableDirective]),module.directive("tgBacklogEmptySortable",["$tgRepo","$tgResources","$rootScope",BacklogEmptySortableDirective]),module.directive("tgSprintSortable",["$tgRepo","$tgResources","$rootScope",SprintSortableDirective])}.call(this),function(){var BacklogSprintDirective,BacklogSprintHeaderDirective,ToggleExcludeClosedSprintsVisualization,module,taiga;taiga=this.taiga,module=angular.module("taigaBacklog"),BacklogSprintDirective=function($repo,$rootscope){var link,slideOptions,sprintTableMinHeight,toggleSprint;return sprintTableMinHeight=50,slideOptions={duration:500,easing:"linear"},toggleSprint=function(_this){return function($el){var sprintArrow,sprintTable;return sprintTable=$el.find(".sprint-table"),sprintArrow=$el.find(".icon-arrow-up"),sprintArrow.toggleClass("active"),sprintTable.toggleClass("open")}}(this),link=function($scope,$el,$attrs){return $scope.$watch($attrs.tgBacklogSprint,function(sprint){return sprint=$scope.$eval($attrs.tgBacklogSprint),sprint.closed?$el.addClass("sprint-closed"):toggleSprint($el)}),$el.on("click",".sprint-name > .icon-arrow-up",function(event){return event.preventDefault(),toggleSprint($el),$el.find(".sprint-table").slideToggle(slideOptions)}),$el.on("click",".sprint-name > .icon-edit",function(event){var sprint;return event.preventDefault(),sprint=$scope.$eval($attrs.tgBacklogSprint),$rootscope.$broadcast("sprintform:edit",sprint)}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgBacklogSprint",["$tgRepo","$rootScope",BacklogSprintDirective]),BacklogSprintHeaderDirective=function($navUrls,$template,$compile,$translate){var link,template;return template=$template.get("backlog/sprint-header.html"),link=function($scope,$el,$attrs,$model){var isEditable,isVisible,prettyDate,render;return prettyDate=$translate.instant("BACKLOG.SPRINTS.DATE"),isEditable=function(){return-1!==$scope.project.my_permissions.indexOf("modify_milestone")},isVisible=function(){return-1!==$scope.project.my_permissions.indexOf("view_milestones")},render=function(sprint){var compiledTemplate,ctx,estimatedDateRange,finish,start,taskboardUrl,templateScope;return taskboardUrl=$navUrls.resolve("project-taskboard",{project:$scope.project.slug,sprint:sprint.slug}),start=moment(sprint.estimated_start).format(prettyDate),finish=moment(sprint.estimated_finish).format(prettyDate),estimatedDateRange=start+"-"+finish,ctx={name:sprint.name,taskboardUrl:taskboardUrl,estimatedDateRange:estimatedDateRange,closedPoints:sprint.closed_points||0,totalPoints:sprint.total_points||0,isVisible:isVisible(),isEditable:isEditable()},templateScope=$scope.$new(),_.assign(templateScope,ctx),compiledTemplate=$compile(template)(templateScope),$el.html(compiledTemplate)},$scope.$watch($attrs.ngModel,function(sprint){return render(sprint)}),$scope.$on("sprintform:edit:success",function(){return render($model.$modelValue)}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgBacklogSprintHeader",["$tgNavUrls","$tgTemplate","$compile","$translate",BacklogSprintHeaderDirective]),ToggleExcludeClosedSprintsVisualization=function($rootscope,$loading,$translate){var excludeClosedSprints,link;return excludeClosedSprints=!0,link=function($scope,$el,$attrs){var currentLoading,loadingElm;return loadingElm=$("
"),$el.after(loadingElm),currentLoading=null,$el.on("click",function(event){return event.preventDefault(),excludeClosedSprints=!excludeClosedSprints,currentLoading=$loading().target(loadingElm).start(),excludeClosedSprints?$rootscope.$broadcast("backlog:unload-closed-sprints"):$rootscope.$broadcast("backlog:load-closed-sprints")}),$scope.$on("$destroy",function(){return $el.off()}),$scope.$on("closed-sprints:reloaded",function(_this){return function(ctx,sprints){var key,text;return currentLoading.finish(),key=sprints.length>0?"BACKLOG.SPRINTS.ACTION_HIDE_CLOSED_SPRINTS":"BACKLOG.SPRINTS.ACTION_SHOW_CLOSED_SPRINTS",text=$translate.instant(key),$el.find(".text").text(text)}}(this))},{link:link}},module.directive("tgBacklogToggleClosedSprintsVisualization",["$rootScope","$tgLoading","$translate",ToggleExcludeClosedSprintsVisualization])}.call(this),function(){var SprintGraphDirective,bindOnce,groupBy,mixOf,module,scopeDefer,taiga,timeout,toggleText;taiga=this.taiga,mixOf=this.taiga.mixOf,toggleText=this.taiga.toggleText,scopeDefer=this.taiga.scopeDefer,bindOnce=this.taiga.bindOnce,groupBy=this.taiga.groupBy,timeout=this.taiga.timeout,module=angular.module("taigaTaskboard"),SprintGraphDirective=function($translate){var link,redrawChart; return redrawChart=function(element,dataToDraw){var data,days,options,width;return width=element.width(),element.height(240),days=_.map(dataToDraw,function(x){return moment(x.day)}),data=[],data.unshift({data:_.zip(days,_.map(dataToDraw,function(d){return d.optimal_points})),lines:{fillColor:"rgba(120,120,120,0.2)"}}),data.unshift({data:_.zip(days,_.map(dataToDraw,function(d){return d.open_points})),lines:{fillColor:"rgba(102,153,51,0.3)"}}),options={grid:{borderWidth:{top:0,right:1,left:0,bottom:0},borderColor:"#ccc",hoverable:!0},xaxis:{tickSize:[1,"day"],min:days[0],max:_.last(days),mode:"time",daysNames:days,axisLabel:$translate.instant("TASKBOARD.CHARTS.XAXIS_LABEL"),axisLabelUseCanvas:!0,axisLabelFontSizePixels:12,axisLabelFontFamily:"Verdana, Arial, Helvetica, Tahoma, sans-serif",axisLabelPadding:5},yaxis:{min:0,axisLabel:$translate.instant("TASKBOARD.CHARTS.YAXIS_LABEL"),axisLabelUseCanvas:!0,axisLabelFontSizePixels:12,axisLabelFontFamily:"Verdana, Arial, Helvetica, Tahoma, sans-serif",axisLabelPadding:5},series:{shadowSize:0,lines:{show:!0,fill:!0},points:{show:!0,fill:!0,radius:4,lineWidth:2}},colors:["rgba(102,153,51,1)","rgba(120,120,120,0.2)"],tooltip:!0,tooltipOpts:{content:function(label,xval,yval,flotItem){var formattedDate,roundedValue;return formattedDate=moment(xval).format($translate.instant("TASKBOARD.CHARTS.DATE")),roundedValue=Math.round(yval),1===flotItem.seriesIndex?$translate.instant("TASKBOARD.CHARTS.OPTIMAL",{formattedDate:formattedDate,roundedValue:roundedValue}):$translate.instant("TASKBOARD.CHARTS.REAL",{formattedDate:formattedDate,roundedValue:roundedValue})}}},element.empty(),element.plot(data,options).data("plot")},link=function($scope,$el,$attrs){var element;return element=angular.element($el),$scope.$on("resize",function(){return $scope.stats?redrawChart(element,$scope.stats.days):void 0}),$scope.$on("taskboard:graph:toggle-visibility",function(){return $el.parent().toggleClass("open"),timeout(100,function(){return $scope.stats?redrawChart(element,$scope.stats.days):void 0})}),$scope.$watch("stats",function(value){return null!=$scope.stats?redrawChart(element,$scope.stats.days):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgSprintGraph",["$translate",SprintGraphDirective])}.call(this),function(){var CreateBulkTasksDirective,CreateEditTaskDirective,bindOnce,debounce,module,taiga;taiga=this.taiga,bindOnce=this.taiga.bindOnce,debounce=this.taiga.debounce,CreateEditTaskDirective=function($repo,$model,$rs,$rootscope,$loading,lightboxService,$translate,$q,attachmentsService){var link;return link=function($scope,$el,attrs){var attachmentsToAdd,attachmentsToDelete,createAttachments,deleteAttachments,resetAttachments,submit,submitButton;return $scope.isNew=!0,attachmentsToAdd=Immutable.List(),attachmentsToDelete=Immutable.List(),resetAttachments=function(){return attachmentsToAdd=Immutable.List(),attachmentsToDelete=Immutable.List()},$scope.addAttachment=function(attachment){return attachmentsToAdd=attachmentsToAdd.push(attachment)},$scope.deleteAttachment=function(attachment){return attachmentsToDelete=attachmentsToDelete.push(attachment)},createAttachments=function(obj){var promises;return promises=_.map(attachmentsToAdd.toJS(),function(attachment){return attachmentsService.upload(attachment.file,obj.id,$scope.task.project,"task")}),$q.all(promises)},deleteAttachments=function(obj){var promises;return console.log(attachmentsToDelete.toJS()),promises=_.map(attachmentsToDelete.toJS(),function(attachment){return attachmentsService["delete"]("task",attachment.id)}),$q.all(promises)},$scope.$on("taskform:new",function(ctx,sprintId,usId){var create,newTask;return $scope.task={project:$scope.projectId,milestone:sprintId,user_story:usId,is_archived:!1,status:$scope.project.default_task_status,assigned_to:null,tags:[]},$scope.isNew=!0,$scope.attachments=Immutable.List(),resetAttachments(),create=$translate.instant("COMMON.CREATE"),$el.find(".button-green").html(create),newTask=$translate.instant("LIGHTBOX.CREATE_EDIT_TASK.TITLE"),$el.find(".title").html(newTask+" "),$el.find(".tag-input").val(""),lightboxService.open($el)}),$scope.$on("taskform:edit",function(ctx,task,attachments){var edit,save;return $scope.task=task,$scope.isNew=!1,$scope.attachments=Immutable.fromJS(attachments),resetAttachments(),save=$translate.instant("COMMON.SAVE"),edit=$translate.instant("LIGHTBOX.CREATE_EDIT_TASK.ACTION_EDIT"),$el.find(".button-green").html(save),$el.find(".title").html(edit+" "),$el.find(".tag-input").val(""),lightboxService.open($el)}),submitButton=$el.find(".submit-button"),submit=debounce(2e3,function(_this){return function(event){var broadcastEvent,currentLoading,form,promise;return event.preventDefault(),form=$el.find("form").checksley(),form.validate()?($scope.isNew?(promise=$repo.create("tasks",$scope.task),broadcastEvent="taskform:new:success"):(promise=$repo.save($scope.task),broadcastEvent="taskform:edit:success"),promise.then(function(data){return createAttachments(data),deleteAttachments(data),data}),currentLoading=$loading().target(submitButton).start(),promise.then(function(data){return currentLoading.finish(),lightboxService.close($el),$rootscope.$broadcast(broadcastEvent,data)})):void 0}}(this)),$el.on("submit","form",submit),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},CreateBulkTasksDirective=function($repo,$rs,$rootscope,$loading,lightboxService){var link;return link=function($scope,$el,attrs){var submit,submitButton;return $scope.form={data:"",usId:null},submit=debounce(2e3,function(_this){return function(event){var currentLoading,data,form,projectId,promise,sprintId,usId;return event.preventDefault(),form=$el.find("form").checksley(),form.validate()?(currentLoading=$loading().target(submitButton).start(),data=$scope.form.data,projectId=$scope.projectId,sprintId=$scope.form.sprintId,usId=$scope.form.usId,promise=$rs.tasks.bulkCreate(projectId,sprintId,usId,data),promise.then(function(result){return currentLoading.finish(),$rootscope.$broadcast("taskform:bulk:success",result),lightboxService.close($el)}),promise.then(null,function(){return currentLoading.finish(),console.log("FAIL")})):void 0}}(this)),$scope.$on("taskform:bulk",function(ctx,sprintId,usId){return lightboxService.open($el),$scope.form={data:"",sprintId:sprintId,usId:usId}}),submitButton=$el.find(".submit-button"),$el.on("submit","form",submit),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module=angular.module("taigaTaskboard"),module.directive("tgLbCreateEditTask",["$tgRepo","$tgModel","$tgResources","$rootScope","$tgLoading","lightboxService","$translate","$q","tgAttachmentsService",CreateEditTaskDirective]),module.directive("tgLbCreateBulkTasks",["$tgRepo","$tgResources","$rootScope","$tgLoading","lightboxService",CreateBulkTasksDirective])}.call(this),function(){var TaskboardController,TaskboardDirective,TaskboardSquishColumnDirective,TaskboardTaskDirective,TaskboardUserDirective,bindMethods,bindOnce,groupBy,mixOf,module,scopeDefer,taiga,timeout,toggleText,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,toggleText=this.taiga.toggleText,mixOf=this.taiga.mixOf,groupBy=this.taiga.groupBy,bindOnce=this.taiga.bindOnce,scopeDefer=this.taiga.scopeDefer,timeout=this.taiga.timeout,bindMethods=this.taiga.bindMethods,module=angular.module("taigaTaskboard"),TaskboardController=function(superClass){function TaskboardController(scope,rootscope,repo,confirm,rs1,params1,q,appMetaService,location,navUrls,events,analytics,translate){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs1,this.params=params1,this.q=q,this.appMetaService=appMetaService,this.location=location,this.navUrls=navUrls,this.events=events,this.analytics=analytics,this.translate=translate,bindMethods(this),this.scope.sectionName=this.translate.instant("TASKBOARD.SECTION_NAME"),this.initializeEventHandlers(),promise=this.loadInitialData(),promise.then(function(_this){return function(){return _this._setMeta()}}(this)),promise.then(null,this.onInitialDataError.bind(this))}return extend(TaskboardController,superClass),TaskboardController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","tgAppMetaService","$tgLocation","$tgNavUrls","$tgEvents","$tgAnalytics","$translate"],TaskboardController.prototype._setMeta=function(){var description,prettyDate,title;return prettyDate=this.translate.instant("BACKLOG.SPRINTS.DATE"),title=this.translate.instant("TASKBOARD.PAGE_TITLE",{projectName:this.scope.project.name,sprintName:this.scope.sprint.name}),description=this.translate.instant("TASKBOARD.PAGE_DESCRIPTION",{projectName:this.scope.project.name,sprintName:this.scope.sprint.name,startDate:moment(this.scope.sprint.estimated_start).format(prettyDate),endDate:moment(this.scope.sprint.estimated_finish).format(prettyDate),completedPercentage:this.scope.stats.completedPercentage||"0",completedPoints:this.scope.stats.completedPointsSum||"--",totalPoints:this.scope.stats.totalPointsSum||"--",openTasks:this.scope.stats.openTasks||"--",totalTasks:this.scope.stats.total_tasks||"--"}),this.appMetaService.setAll(title,description)},TaskboardController.prototype.initializeEventHandlers=function(){return this.scope.$on("taskform:bulk:success",function(_this){return function(){return _this.loadTaskboard(),_this.analytics.trackEvent("task","create","bulk create task on taskboard",1)}}(this)),this.scope.$on("taskform:new:success",function(_this){return function(){return _this.loadTaskboard(),_this.analytics.trackEvent("task","create","create task on taskboard",1)}}(this)),this.scope.$on("taskform:edit:success",function(_this){return function(){return _this.loadTaskboard()}}(this)),this.scope.$on("taskboard:task:move",this.taskMove),this.scope.$on("assigned-to:added",function(_this){return function(ctx,userId,task){var promise;return task.assigned_to=userId,promise=_this.repo.save(task),promise.then(null,function(){return console.log("FAIL")})}}(this))},TaskboardController.prototype.initializeSubscription=function(){var routingKey,routingKey1;return routingKey="changes.project."+this.scope.projectId+".tasks",this.events.subscribe(this.scope,routingKey,function(_this){return function(message){return _this.loadTaskboard()}}(this)),routingKey1="changes.project."+this.scope.projectId+".userstories",this.events.subscribe(this.scope,routingKey1,function(_this){return function(message){return _this.refreshTagsColors(),_this.loadSprintStats(),_this.loadSprint()}}(this))},TaskboardController.prototype.loadProject=function(){return this.rs.projects.get(this.scope.projectId).then(function(_this){return function(project){return project.is_backlog_activated||_this.location.path(_this.navUrls.resolve("permission-denied")),_this.scope.project=project,_this.scope.pointsList=_.sortBy(project.points,"order"),_this.scope.pointsById=groupBy(project.points,function(e){return e.id}),_this.scope.roleById=groupBy(project.roles,function(e){return e.id}),_this.scope.taskStatusList=_.sortBy(project.task_statuses,"order"),_this.scope.usStatusList=_.sortBy(project.us_statuses,"order"),_this.scope.usStatusById=groupBy(project.us_statuses,function(e){return e.id}),_this.scope.$emit("project:loaded",project),_this.fillUsersAndRoles(project.members,project.roles),project}}(this))},TaskboardController.prototype.loadSprintStats=function(){return this.rs.sprints.stats(this.scope.projectId,this.scope.sprintId).then(function(_this){return function(stats){var completedPointsSum,remainingPointsSum,remainingTasks,totalPointsSum;return totalPointsSum=_.reduce(_.values(stats.total_points),function(res,n){return res+n},0),completedPointsSum=_.reduce(_.values(stats.completed_points),function(res,n){return res+n},0),remainingPointsSum=totalPointsSum-completedPointsSum,remainingTasks=stats.total_tasks-stats.completed_tasks,_this.scope.stats=stats,_this.scope.stats.totalPointsSum=totalPointsSum,_this.scope.stats.completedPointsSum=completedPointsSum,_this.scope.stats.remainingPointsSum=remainingPointsSum,_this.scope.stats.remainingTasks=remainingTasks,stats.totalPointsSum?_this.scope.stats.completedPercentage=Math.round(100*stats.completedPointsSum/stats.totalPointsSum):_this.scope.stats.completedPercentage=0,_this.scope.stats.openTasks=stats.total_tasks-stats.completed_tasks,stats}}(this))},TaskboardController.prototype.refreshTagsColors=function(){return this.rs.projects.tagsColors(this.scope.projectId).then(function(_this){return function(tags_colors){return _this.scope.project.tags_colors=tags_colors}}(this))},TaskboardController.prototype.loadSprint=function(){return this.rs.sprints.get(this.scope.projectId,this.scope.sprintId).then(function(_this){return function(sprint){return _this.scope.sprint=sprint,_this.scope.userstories=_.sortBy(sprint.user_stories,"sprint_order"),sprint}}(this))},TaskboardController.prototype.loadTasks=function(){return this.rs.tasks.list(this.scope.projectId,this.scope.sprintId).then(function(_this){return function(tasks){var i,j,k,len,len1,len2,ref,ref1,ref2,status,task,us,usId;for(_this.scope.tasks=_.sortBy(tasks,"taskboard_order"),_this.scope.usTasks={},ref=_.union(_this.scope.userstories,[{id:null}]),i=0,len=ref.length;len>i;i++)for(us=ref[i],_this.scope.usTasks[us.id]={},ref1=_this.scope.taskStatusList,j=0,len1=ref1.length;len1>j;j++)status=ref1[j],_this.scope.usTasks[us.id][status.id]=[];for(ref2=_this.scope.tasks,k=0,len2=ref2.length;len2>k;k++)task=ref2[k],null!=_this.scope.usTasks[task.user_story]&&null!=_this.scope.usTasks[task.user_story][task.status]&&_this.scope.usTasks[task.user_story][task.status].push(task);return 0===tasks.length&&(usId=_this.scope.userstories.length>0?_this.scope.userstories[0].id:null,_this.scope.usTasks[usId][_this.scope.taskStatusList[0].id].push({isPlaceholder:!0})),tasks}}(this))},TaskboardController.prototype.loadTaskboard=function(){return this.q.all([this.refreshTagsColors(),this.loadSprintStats(),this.loadSprint().then(function(_this){return function(){return _this.loadTasks()}}(this))])},TaskboardController.prototype.loadInitialData=function(){var params,promise;return params={pslug:this.params.pslug,sslug:this.params.sslug},promise=this.repo.resolve(params).then(function(_this){return function(data){return _this.scope.projectId=data.project,_this.scope.sprintId=data.milestone,_this.initializeSubscription(),data}}(this)),promise.then(function(_this){return function(){return _this.loadProject()}}(this)).then(function(_this){return function(){return _this.loadTaskboard()}}(this))},TaskboardController.prototype.refreshTasksOrder=function(tasks){var data,items;return items=this.resortTasks(tasks),data=this.prepareBulkUpdateData(items),this.rs.tasks.bulkUpdateTaskTaskboardOrder(this.scope.project.id,data)},TaskboardController.prototype.resortTasks=function(tasks){var i,index,item,items,len;for(items=[],index=i=0,len=tasks.length;len>i;index=++i)item=tasks[index],item.taskboard_order=index,item.isModified()&&items.push(item);return items},TaskboardController.prototype.prepareBulkUpdateData=function(uses){return _.map(uses,function(x){return{task_id:x.id,order:x.taskboard_order}})},TaskboardController.prototype.taskMove=function(ctx,task,usId,statusId,order){var promise,r,tasks;return r=this.scope.usTasks[task.user_story][task.status].indexOf(task),this.scope.usTasks[task.user_story][task.status].splice(r,1),tasks=this.scope.usTasks[usId][statusId],tasks.splice(order,0,task),task.user_story=usId,task.status=statusId,task.taskboard_order=order,promise=this.repo.save(task),this.rootscope.$broadcast("sprint:task:moved",task),promise.then(function(_this){return function(){return _this.refreshTasksOrder(tasks),_this.loadSprintStats()}}(this)),promise.then(null,function(_this){return function(){return console.log("FAIL TASK SAVE")}}(this))},TaskboardController.prototype.addNewTask=function(type,us){switch(type){case"standard":return this.rootscope.$broadcast("taskform:new",this.scope.sprintId,null!=us?us.id:void 0);case"bulk":return this.rootscope.$broadcast("taskform:bulk",this.scope.sprintId,null!=us?us.id:void 0)}},TaskboardController.prototype.editTaskAssignedTo=function(task){return this.rootscope.$broadcast("assigned-to:add",task)},TaskboardController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("TaskboardController",TaskboardController),TaskboardDirective=function($rootscope){var link;return link=function($scope,$el,$attrs){var $ctrl,tableBodyDom;return $ctrl=$el.controller(),$el.on("click",".toggle-analytics-visibility",function(event){var target;return event.preventDefault(),target=angular.element(event.currentTarget),target.toggleClass("active"),$rootscope.$broadcast("taskboard:graph:toggle-visibility")}),tableBodyDom=$el.find(".taskboard-table-body"),tableBodyDom.on("scroll",function(event){var tableHeaderDom,target;return target=angular.element(event.currentTarget),tableHeaderDom=$el.find(".taskboard-table-header .taskboard-table-inner"),tableHeaderDom.css("left",-1*target.scrollLeft())}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgTaskboard",["$rootScope",TaskboardDirective]),TaskboardTaskDirective=function($rootscope,$loading,$rs,$rs2){var link;return link=function($scope,$el,$attrs,$model){return $el.disableSelection(),$scope.$watch("task",function(task){return task.is_blocked&&!$el.hasClass("blocked")?$el.addClass("blocked"):!task.is_blocked&&$el.hasClass("blocked")?$el.removeClass("blocked"):void 0}),$el.find(".icon-edit").on("click",function(event){return $el.find(".icon-edit").hasClass("noclick")?void 0:$scope.$apply(function(){var currentLoading,target,task;return target=$(event.target),currentLoading=$loading().target(target).timeout(200).removeClasses("icon-edit").start(),task=$scope.task,$rs.tasks.getByRef(task.project,task.ref).then(function(_this){return function(editingTask){return $rs2.attachments.list("task",editingTask.id,editingTask.project).then(function(attachments){return $rootscope.$broadcast("taskform:edit",editingTask,attachments.toJS()),currentLoading.finish()})}}(this))})})},{link:link}},module.directive("tgTaskboardTask",["$rootScope","$tgLoading","$tgResources","tgResources",TaskboardTaskDirective]),TaskboardSquishColumnDirective=function(rs){var avatarWidth,link,maxColumnWidth;return avatarWidth=40,maxColumnWidth=300,link=function($scope,$el,$attrs){var getCeilWidth,recalculateStatusColumnWidth,recalculateTaskboardWidth,refreshTaskboardTableWidth,setStatusColumnWidth;return $scope.$on("sprint:task:moved",function(_this){return function(){return recalculateTaskboardWidth()}}(this)),bindOnce($scope,"usTasks",function(project){return $scope.statusesFolded=rs.tasks.getStatusColumnModes($scope.project.id),$scope.usFolded=rs.tasks.getUsRowModes($scope.project.id,$scope.sprintId),recalculateTaskboardWidth()}),$scope.foldStatus=function(status){return $scope.statusesFolded[status.id]=!$scope.statusesFolded[status.id],rs.tasks.storeStatusColumnModes($scope.projectId,$scope.statusesFolded),recalculateTaskboardWidth()},$scope.foldUs=function(us){return us?$scope.usFolded[us.id]=!$scope.usFolded[us.id]:$scope.usFolded[null]=!$scope.usFolded[null],rs.tasks.storeUsRowModes($scope.projectId,$scope.sprintId,$scope.usFolded),recalculateTaskboardWidth()},getCeilWidth=function(_this){return function(usId,statusId){var tasks,tasksMatrixSize,width;return tasks=$scope.usTasks[usId][statusId].length,$scope.statusesFolded[statusId]?(tasks&&$scope.usFolded[usId]?(tasksMatrixSize=Math.round(Math.sqrt(tasks)),width=avatarWidth*tasksMatrixSize):width=avatarWidth,width):0}}(this),setStatusColumnWidth=function(_this){return function(statusId,width){var column;return column=$el.find(".squish-status-"+statusId),width?column.css("max-width",width):column.css("max-width",maxColumnWidth)}}(this),refreshTaskboardTableWidth=function(_this){return function(){var columnWidths,columns,totalWidth;return columnWidths=[],columns=$el.find(".task-colum-name"),columnWidths=_.map(columns,function(column){return $(column).outerWidth(!0)}),totalWidth=_.reduce(columnWidths,function(total,width){return total+width}),$el.find(".taskboard-table-inner").css("width",totalWidth)}}(this),recalculateStatusColumnWidth=function(_this){return function(statusId){var statusFoldedWidth;return statusFoldedWidth=getCeilWidth(null,statusId),_.forEach($scope.userstories,function(us){var width;return width=getCeilWidth(us.id,statusId),width>statusFoldedWidth?statusFoldedWidth=width:void 0}),setStatusColumnWidth(statusId,statusFoldedWidth)}}(this),recalculateTaskboardWidth=function(_this){return function(){_.forEach($scope.taskStatusList,function(status){return recalculateStatusColumnWidth(status.id)}),refreshTaskboardTableWidth()}}(this)},{link:link}},module.directive("tgTaskboardSquishColumn",["$tgResources",TaskboardSquishColumnDirective]),TaskboardUserDirective=function($log,$translate){var clickable,link;return clickable=!1,link=function($scope,$el,$attrs){var username_label;return username_label=$el.parent().find("a.task-assigned"),username_label.addClass("not-clickable"),$scope.$watch("task.assigned_to",function(assigned_to){var user;return user=$scope.usersById[assigned_to],void 0===user?_.assign($scope,{name:$translate.instant("COMMON.ASSIGNED_TO.NOT_ASSIGNED"),imgurl:"/"+window._version+"/images/unnamed.png",clickable:clickable}):_.assign($scope,{name:user.full_name_display,imgurl:user.photo,clickable:clickable}),username_label.text($scope.name)}),bindOnce($scope,"project",function(project){return project.my_permissions.indexOf("modify_task")>-1?(clickable=!0,$el.find(".avatar-assigned-to").on("click",function(_this){return function(event){var $ctrl;if(!$el.find("a").hasClass("noclick"))return $ctrl=$el.controller(),$ctrl.editTaskAssignedTo($scope.task)}}(this)),username_label.removeClass("not-clickable"),username_label.on("click",function(event){var $ctrl;if(!$el.find("a").hasClass("noclick"))return $ctrl=$el.controller(),$ctrl.editTaskAssignedTo($scope.task)})):void 0})},{link:link,templateUrl:"taskboard/taskboard-user.html",scope:{usersById:"=users",project:"=",task:"="}}},module.directive("tgTaskboardUserAvatar",["$log","$translate",TaskboardUserDirective])}.call(this),function(){var TaskboardSortableDirective,bindOnce,groupBy,mixOf,module,scopeDefer,taiga,toggleText;taiga=this.taiga,mixOf=this.taiga.mixOf,toggleText=this.taiga.toggleText,scopeDefer=this.taiga.scopeDefer,bindOnce=this.taiga.bindOnce,groupBy=this.taiga.groupBy,module=angular.module("taigaBacklog"),TaskboardSortableDirective=function($repo,$rs,$rootscope){var link;return link=function($scope,$el,$attrs){return bindOnce($scope,"project",function(project){var deleteElement,itemEl,newParentScope,oldParentScope,tdom;if(project.my_permissions.indexOf("modify_us")>-1)return oldParentScope=null,newParentScope=null,itemEl=null,tdom=$el,deleteElement=function(itemEl){return itemEl.scope().$destroy(),itemEl.off(),itemEl.remove()},tdom.sortable({handle:".taskboard-task-inner",dropOnEmpty:!0,connectWith:".taskboard-tasks-box",revert:400}),tdom.on("sortstop",function(event,ui){var itemIndex,itemTask,newStatusId,newUsId,oldStatusId,oldUsId,parentEl;return parentEl=ui.item.parent(),itemEl=ui.item,itemTask=itemEl.scope().task,itemIndex=itemEl.index(),newParentScope=parentEl.scope(),oldUsId=oldParentScope.us?oldParentScope.us.id:null,oldStatusId=oldParentScope.st.id,newUsId=newParentScope.us?newParentScope.us.id:null,newStatusId=newParentScope.st.id,(newStatusId!==oldStatusId||newUsId!==oldUsId)&&deleteElement(itemEl),$scope.$apply(function(){return $rootscope.$broadcast("taskboard:task:move",itemTask,newUsId,newStatusId,itemIndex)}),ui.item.find("a").removeClass("noclick")}),tdom.on("sortstart",function(event,ui){return oldParentScope=ui.item.parent().scope(),ui.item.find("a").addClass("noclick")})}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgTaskboardSortable",["$tgRepo","$tgResources","$rootScope",TaskboardSortableDirective])}.call(this),function(){var KanbanArchivedStatusHeaderDirective,KanbanArchivedStatusIntroDirective,KanbanController,KanbanDirective,KanbanSquishColumnDirective,KanbanUserDirective,KanbanUserstoryDirective,KanbanWipLimitDirective,bindMethods,bindOnce,defaultViewMode,groupBy,mixOf,module,scopeDefer,taiga,timeout,toggleText,viewModes,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,toggleText=this.taiga.toggleText,scopeDefer=this.taiga.scopeDefer,bindOnce=this.taiga.bindOnce,groupBy=this.taiga.groupBy,timeout=this.taiga.timeout,bindMethods=this.taiga.bindMethods,module=angular.module("taigaKanban"),defaultViewMode="maximized",viewModes=["maximized","minimized"],KanbanController=function(superClass){function KanbanController(scope,rootscope,repo,confirm,rs1,params1,q,location,appMetaService,navUrls,events,analytics,translate){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs1,this.params=params1,this.q=q,this.location=location,this.appMetaService=appMetaService,this.navUrls=navUrls,this.events=events,this.analytics=analytics,this.translate=translate,bindMethods(this),this.scope.sectionName=this.translate.instant("KANBAN.SECTION_NAME"),this.scope.statusViewModes={},this.initializeEventHandlers(),promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,title;return title=_this.translate.instant("KANBAN.PAGE_TITLE",{projectName:_this.scope.project.name}),description=_this.translate.instant("KANBAN.PAGE_DESCRIPTION",{projectName:_this.scope.project.name,projectDescription:_this.scope.project.description}),_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this))}return extend(KanbanController,superClass),KanbanController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","tgAppMetaService","$tgNavUrls","$tgEvents","$tgAnalytics","$translate"],KanbanController.prototype.initializeEventHandlers=function(){return this.scope.$on("usform:new:success",function(_this){return function(){return _this.loadUserstories(),_this.refreshTagsColors(),_this.analytics.trackEvent("userstory","create","create userstory on kanban",1)}}(this)),this.scope.$on("usform:bulk:success",function(_this){return function(){return _this.loadUserstories(),_this.analytics.trackEvent("userstory","create","bulk create userstory on kanban",1)}}(this)),this.scope.$on("usform:edit:success",function(_this){return function(){return _this.loadUserstories(),_this.refreshTagsColors()}}(this)),this.scope.$on("assigned-to:added",this.onAssignedToChanged),this.scope.$on("kanban:us:move",this.moveUs),this.scope.$on("kanban:show-userstories-for-status",this.loadUserStoriesForStatus),this.scope.$on("kanban:hide-userstories-for-status",this.hideUserStoriesForStatus)},KanbanController.prototype.addNewUs=function(type,statusId){switch(type){case"standard":return this.rootscope.$broadcast("usform:new",this.scope.projectId,statusId,this.scope.usStatusList);case"bulk":return this.rootscope.$broadcast("usform:bulk",this.scope.projectId,statusId)}},KanbanController.prototype.changeUsAssignedTo=function(us){return this.rootscope.$broadcast("assigned-to:add",us)},KanbanController.prototype.onAssignedToChanged=function(ctx,userid,us){var promise;return us.assigned_to=userid,promise=this.repo.save(us),promise.then(null,function(){return console.log("FAIL")})},KanbanController.prototype.refreshTagsColors=function(){return this.rs.projects.tagsColors(this.scope.projectId).then(function(_this){return function(tags_colors){return _this.scope.project.tags_colors=tags_colors}}(this))},KanbanController.prototype.loadUserstories=function(){var params,promise;return params={status__is_archived:!1},promise=this.rs.userstories.listAll(this.scope.projectId,params).then(function(_this){return function(userstories){var i,j,k,len,len1,len2,ref,ref1,ref2,status,us,usByStatus,us_archived;for(_this.scope.userstories=userstories,usByStatus=_.groupBy(userstories,"status"),us_archived=[],ref=_this.scope.usStatusList,i=0,len=ref.length;len>i;i++){if(status=ref[i],null==usByStatus[status.id]&&(usByStatus[status.id]=[]),null!=_this.scope.usByStatus)for(ref1=_this.scope.usByStatus[status.id],j=0,len1=ref1.length;len1>j;j++)us=ref1[j],us.status!==status.id&&us_archived.push(us);if(status.is_archived&&null!=_this.scope.usByStatus&&0!==_this.scope.usByStatus[status.id].length)for(ref2=_this.scope.usByStatus[status.id].concat(us_archived),k=0,len2=ref2.length;len2>k;k++)us=ref2[k],us.status===status.id&&usByStatus[status.id].push(us);usByStatus[status.id]=_.sortBy(usByStatus[status.id],"kanban_order")}return 0===userstories.length&&(status=_this.scope.usStatusList[0],usByStatus[status.id].push({isPlaceholder:!0})),_this.scope.usByStatus=usByStatus,scopeDefer(_this.scope,function(){return _this.scope.$broadcast("userstories:loaded",userstories)}),userstories}}(this)),promise.then(function(_this){return function(){return _this.scope.$broadcast("redraw:wip")}}(this)),promise},KanbanController.prototype.loadUserStoriesForStatus=function(ctx,statusId){var params;return params={status:statusId},this.rs.userstories.listAll(this.scope.projectId,params).then(function(_this){return function(userstories){return _this.scope.usByStatus[statusId]=_.sortBy(userstories,"kanban_order"),_this.scope.$broadcast("kanban:shown-userstories-for-status",statusId,userstories),userstories}}(this))},KanbanController.prototype.hideUserStoriesForStatus=function(ctx,statusId){return this.scope.usByStatus[statusId]=[],this.scope.$broadcast("kanban:hidden-userstories-for-status",statusId)},KanbanController.prototype.loadKanban=function(){return this.q.all([this.refreshTagsColors(),this.loadUserstories()])},KanbanController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return project.is_kanban_activated||_this.location.path(_this.navUrls.resolve("permission-denied")),_this.scope.projectId=project.id,_this.scope.project=project,_this.scope.projectId=project.id,_this.scope.points=_.sortBy(project.points,"order"),_this.scope.pointsById=groupBy(project.points,function(x){return x.id}),_this.scope.usStatusById=groupBy(project.us_statuses,function(x){return x.id}),_this.scope.usStatusList=_.sortBy(project.us_statuses,"order"),_this.generateStatusViewModes(),_this.scope.$emit("project:loaded",project),project}}(this))},KanbanController.prototype.initializeSubscription=function(){var routingKey1;return routingKey1="changes.project."+this.scope.projectId+".userstories",this.events.subscribe(this.scope,routingKey1,function(_this){return function(message){return _this.loadUserstories()}}(this))},KanbanController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(project){return _this.fillUsersAndRoles(project.members,project.roles),_this.initializeSubscription(),_this.loadKanban()}}(this))},KanbanController.prototype.generateStatusViewModes=function(){var i,len,mode,ref,status,storedStatusViewModes;for(storedStatusViewModes=this.rs.kanban.getStatusViewModes(this.scope.projectId),this.scope.statusViewModes={},ref=this.scope.usStatusList,i=0,len=ref.length;len>i;i++)status=ref[i],mode=storedStatusViewModes[status.id]||defaultViewMode,this.scope.statusViewModes[status.id]=mode;return this.storeStatusViewModes()}, KanbanController.prototype.storeStatusViewModes=function(){return this.rs.kanban.storeStatusViewModes(this.scope.projectId,this.scope.statusViewModes)},KanbanController.prototype.updateStatusViewMode=function(statusId,newViewMode){return this.scope.statusViewModes[statusId]=newViewMode,this.storeStatusViewModes()},KanbanController.prototype.isMaximized=function(statusId){var mode;return mode=this.scope.statusViewModes[statusId]||defaultViewMode,"maximized"===mode},KanbanController.prototype.isMinimized=function(statusId){var mode;return mode=this.scope.statusViewModes[statusId]||defaultViewMode,"minimized"===mode},KanbanController.prototype.prepareBulkUpdateData=function(uses,field){return null==field&&(field="kanban_order"),_.map(uses,function(x){return{us_id:x.id,order:x[field]}})},KanbanController.prototype.resortUserStories=function(uses){var i,index,item,items,len;for(items=[],index=i=0,len=uses.length;len>i;index=++i)item=uses[index],item.kanban_order=index,item.isModified()&&items.push(item);return items},KanbanController.prototype.moveUs=function(ctx,us,oldStatusId,newStatusId,index){var itemsToSave,promise,r;return oldStatusId!==newStatusId?(r=this.scope.usByStatus[oldStatusId].indexOf(us),this.scope.usByStatus[oldStatusId].splice(r,1),this.scope.usByStatus[newStatusId].splice(index,0,us),us.status=newStatusId):(r=this.scope.usByStatus[newStatusId].indexOf(us),this.scope.usByStatus[newStatusId].splice(r,1),this.scope.usByStatus[newStatusId].splice(index,0,us)),itemsToSave=this.resortUserStories(this.scope.usByStatus[newStatusId]),this.scope.usByStatus[newStatusId]=_.sortBy(this.scope.usByStatus[newStatusId],"kanban_order"),promise=this.repo.save(us),promise=promise.then(function(_this){return function(){var data;return itemsToSave=_.reject(itemsToSave,{id:us.id}),data=_this.prepareBulkUpdateData(itemsToSave),_this.rs.userstories.bulkUpdateKanbanOrder(us.project,data).then(function(){return itemsToSave})}}(this))},KanbanController}(mixOf(taiga.Controller,taiga.PageMixin,taiga.FiltersMixin)),module.controller("KanbanController",KanbanController),KanbanDirective=function($repo,$rootscope){var link;return link=function($scope,$el,$attrs){var tableBodyDom;return tableBodyDom=$el.find(".kanban-table-body"),tableBodyDom.on("scroll",function(event){var tableHeaderDom,target;return target=angular.element(event.currentTarget),tableHeaderDom=$el.find(".kanban-table-header .kanban-table-inner"),tableHeaderDom.css("left",-1*target.scrollLeft())}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgKanban",["$tgRepo","$rootScope",KanbanDirective]),KanbanArchivedStatusHeaderDirective=function($rootscope,$translate){var hideArchivedText,link,showArchivedText;return showArchivedText=$translate.instant("KANBAN.ACTION_SHOW_ARCHIVED"),hideArchivedText=$translate.instant("KANBAN.ACTION_HIDE_ARCHIVED"),link=function($scope,$el,$attrs){var hidden,status;return status=$scope.$eval($attrs.tgKanbanArchivedStatusHeader),hidden=!0,$scope["class"]="icon-open-eye",$scope.title=showArchivedText,$el.on("click",function(event){return hidden=!hidden,$scope.$apply(function(){return hidden?($scope["class"]="icon-open-eye",$scope.title=showArchivedText,$rootscope.$broadcast("kanban:hide-userstories-for-status",status.id)):($scope["class"]="icon-closed-eye",$scope.title=hideArchivedText,$rootscope.$broadcast("kanban:show-userstories-for-status",status.id))})}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgKanbanArchivedStatusHeader",["$rootScope","$translate",KanbanArchivedStatusHeaderDirective]),KanbanArchivedStatusIntroDirective=function($translate){var link,userStories;return userStories=[],link=function($scope,$el,$attrs){var hiddenUserStoriexText,status,updateIntroText;return hiddenUserStoriexText=$translate.instant("KANBAN.HIDDEN_USER_STORIES"),status=$scope.$eval($attrs.tgKanbanArchivedStatusIntro),$el.text(hiddenUserStoriexText),updateIntroText=function(){return userStories.length>0?$el.text(""):$el.text(hiddenUserStoriexText)},$scope.$on("kanban:us:move",function(ctx,itemUs,oldStatusId,newStatusId,itemIndex){var r;return status.id===newStatusId?status.id===oldStatusId?(r=userStories.indexOf(itemUs),userStories.splice(r,1),userStories.splice(itemIndex,0,itemUs)):(itemUs.isArchived=!0,userStories.splice(itemIndex,0,itemUs)):status.id===oldStatusId&&(itemUs.isArchived=!1,r=userStories.indexOf(itemUs),userStories.splice(r,1)),updateIntroText()}),$scope.$on("kanban:shown-userstories-for-status",function(ctx,statusId,userStoriesLoaded){return statusId===status.id?(userStories=_.filter(userStoriesLoaded,function(us){return us.status===status.id}),updateIntroText()):void 0}),$scope.$on("kanban:hidden-userstories-for-status",function(ctx,statusId){return statusId===status.id?(userStories=[],updateIntroText()):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgKanbanArchivedStatusIntro",["$translate",KanbanArchivedStatusIntroDirective]),KanbanUserstoryDirective=function($rootscope,$loading,$rs,$rs2){var link;return link=function($scope,$el,$attrs,$model){return $el.disableSelection(),$scope.$watch("us",function(us){return us.is_blocked&&!$el.hasClass("blocked")?$el.addClass("blocked"):!us.is_blocked&&$el.hasClass("blocked")?$el.removeClass("blocked"):void 0}),$el.on("click",".icon-edit",function(event){var currentLoading,target,us;if(!$el.find(".icon-edit").hasClass("noclick"))return target=$(event.target),currentLoading=$loading().target(target).timeout(200).removeClasses("icon-edit").start(),us=$model.$modelValue,$rs.userstories.getByRef(us.project,us.ref).then(function(_this){return function(editingUserStory){return $rs2.attachments.list("us",us.id,us.project).then(function(attachments){return $rootscope.$broadcast("usform:edit",editingUserStory,attachments.toJS()),currentLoading.finish()})}}(this))}),$scope.getTemplateUrl=function(){return $scope.us.isPlaceholder?"common/components/kanban-placeholder.html":"kanban/kanban-task.html"},$scope.$on("$destroy",function(){return $el.off()})},{template:'',link:link,require:"ngModel"}},module.directive("tgKanbanUserstory",["$rootScope","$tgLoading","$tgResources","tgResources",KanbanUserstoryDirective]),KanbanSquishColumnDirective=function(rs){var link;return link=function($scope,$el,$attrs){var updateTableWidth;return $scope.$on("project:loaded",function(event,project){return $scope.folds=rs.kanban.getStatusColumnModes(project.id),updateTableWidth()}),$scope.foldStatus=function(status){$scope.folds[status.id]=!$scope.folds[status.id],rs.kanban.storeStatusColumnModes($scope.projectId,$scope.folds),updateTableWidth()},updateTableWidth=function(){var columnWidths,totalWidth;return columnWidths=_.map($scope.usStatusList,function(status){return $scope.folds[status.id]?40:310}),totalWidth=_.reduce(columnWidths,function(total,width){return total+width}),$el.find(".kanban-table-inner").css("width",totalWidth)}},{link:link}},module.directive("tgKanbanSquishColumn",["$tgResources",KanbanSquishColumnDirective]),KanbanWipLimitDirective=function(){var link;return link=function($scope,$el,$attrs){var redrawWipLimit,status;return $el.disableSelection(),status=$scope.$eval($attrs.tgKanbanWipLimit),redrawWipLimit=function(_this){return function(){return $el.find(".kanban-wip-limit").remove(),timeout(200,function(){var element;return element=$el.find(".kanban-task")[status.wip_limit],element?angular.element(element).before("
"):void 0})}}(this),status&&!status.is_archived&&($scope.$on("redraw:wip",redrawWipLimit),$scope.$on("kanban:us:move",redrawWipLimit),$scope.$on("usform:new:success",redrawWipLimit),$scope.$on("usform:bulk:success",redrawWipLimit)),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgKanbanWipLimit",KanbanWipLimitDirective),KanbanUserDirective=function($log,$compile,$translate){var clickable,link,template;return template=_.template('
\n class="not-clickable"<% } %>>\n <%- name %>\n \n
'),clickable=!1,link=function($scope,$el,$attrs,$model){var render,username_label,wtid;return username_label=$el.parent().find("a.task-assigned"),username_label.addClass("not-clickable"),$attrs.tgKanbanUserAvatar?(wtid=$scope.$watch($attrs.tgKanbanUserAvatar,function(v){var user;return null==$scope.usersById?($log.error("KanbanUserDirective requires userById set in scope."),wtid()):(user=$scope.usersById[v],render(user))}),render=function(user){var ctx,html;return ctx=void 0===user?{name:$translate.instant("COMMON.ASSIGNED_TO.NOT_ASSIGNED"),imgurl:"/"+window._version+"/images/unnamed.png",clickable:clickable}:{name:user.full_name_display,imgurl:user.photo,clickable:clickable},html=$compile(template(ctx))($scope),$el.html(html),username_label.text(ctx.name)},bindOnce($scope,"project",function(project){return project.my_permissions.indexOf("modify_us")>-1?(clickable=!0,$el.on("click",function(_this){return function(event){var $ctrl,us;if(!$el.find("a").hasClass("noclick"))return us=$model.$modelValue,$ctrl=$el.controller(),$ctrl.changeUsAssignedTo(us)}}(this)),username_label.removeClass("not-clickable"),username_label.on("click",function(event){var $ctrl,us;if(!$el.find("a").hasClass("noclick"))return us=$model.$modelValue,$ctrl=$el.controller(),$ctrl.changeUsAssignedTo(us)})):void 0}),$scope.$on("$destroy",function(){return $el.off()})):$log.error("KanbanUserDirective: no attr is defined")},{link:link,require:"ngModel"}},module.directive("tgKanbanUserAvatar",["$log","$compile","$translate",KanbanUserDirective])}.call(this),function(){var KanbanSortableDirective,bindOnce,groupBy,mixOf,module,scopeDefer,taiga,timeout,toggleText;taiga=this.taiga,mixOf=this.taiga.mixOf,toggleText=this.taiga.toggleText,scopeDefer=this.taiga.scopeDefer,bindOnce=this.taiga.bindOnce,groupBy=this.taiga.groupBy,timeout=this.taiga.timeout,module=angular.module("taigaKanban"),KanbanSortableDirective=function($repo,$rs,$rootscope){var link;return link=function($scope,$el,$attrs){return bindOnce($scope,"project",function(project){var deleteElement,itemEl,newParentScope,oldParentScope,tdom;if(project.my_permissions.indexOf("modify_us")>-1)return oldParentScope=null,newParentScope=null,itemEl=null,tdom=$el,deleteElement=function(itemEl){return itemEl.scope().$destroy(),itemEl.off(),itemEl.remove()},tdom.sortable({handle:".kanban-task-inner",dropOnEmpty:!0,connectWith:".kanban-uses-box",revert:400}),tdom.on("sortstop",function(event,ui){var itemIndex,itemUs,newStatusId,oldStatusId,parentEl;return parentEl=ui.item.parent(),itemEl=ui.item,itemUs=itemEl.scope().us,itemIndex=itemEl.index(),newParentScope=parentEl.scope(),newStatusId=newParentScope.s.id,oldStatusId=oldParentScope.s.id,newStatusId!==oldStatusId&&deleteElement(itemEl),$scope.$apply(function(){return $rootscope.$broadcast("kanban:us:move",itemUs,itemUs.status,newStatusId,itemIndex)}),ui.item.find("a").removeClass("noclick")}),tdom.on("sortstart",function(event,ui){return oldParentScope=ui.item.parent().scope(),ui.item.find("a").addClass("noclick")})}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgKanbanSortable",["$tgRepo","$tgResources","$rootScope",KanbanSortableDirective])}.call(this),function(){var IssueDetailController,IssuePriorityButtonDirective,IssueSeverityButtonDirective,IssueStatusButtonDirective,IssueStatusDisplayDirective,IssueTypeButtonDirective,PromoteIssueToUsButtonDirective,bindMethods,bindOnce,groupBy,joinStr,mixOf,module,taiga,toString,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,toString=this.taiga.toString,joinStr=this.taiga.joinStr,groupBy=this.taiga.groupBy,bindOnce=this.taiga.bindOnce,bindMethods=this.taiga.bindMethods,module=angular.module("taigaIssues"),IssueDetailController=function(superClass){function IssueDetailController(scope,rootscope,repo,confirm,rs,params,q,location,log,appMetaService,analytics,navUrls,translate){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.log=log,this.appMetaService=appMetaService,this.analytics=analytics,this.navUrls=navUrls,this.translate=translate,bindMethods(this),this.scope.issueRef=this.params.issueref,this.scope.sectionName=this.translate.instant("ISSUES.SECTION_NAME"),this.initializeEventHandlers(),promise=this.loadInitialData(),promise.then(function(_this){return function(){return _this._setMeta(),_this.initializeOnDeleteGoToUrl()}}(this)),promise.then(null,this.onInitialDataError.bind(this))}return extend(IssueDetailController,superClass),IssueDetailController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$log","tgAppMetaService","$tgAnalytics","$tgNavUrls","$translate"],IssueDetailController.prototype._setMeta=function(){var description,ref,ref1,ref2,ref3,title;return title=this.translate.instant("ISSUE.PAGE_TITLE",{issueRef:"#"+this.scope.issue.ref,issueSubject:this.scope.issue.subject,projectName:this.scope.project.name}),description=this.translate.instant("ISSUE.PAGE_DESCRIPTION",{issueStatus:(null!=(ref=this.scope.statusById[this.scope.issue.status])?ref.name:void 0)||"--",issueType:(null!=(ref1=this.scope.typeById[this.scope.issue.type])?ref1.name:void 0)||"--",issueSeverity:(null!=(ref2=this.scope.severityById[this.scope.issue.severity])?ref2.name:void 0)||"--",issuePriority:(null!=(ref3=this.scope.priorityById[this.scope.issue.priority])?ref3.name:void 0)||"--",issueDescription:angular.element(this.scope.issue.description_html||"").text()}),this.appMetaService.setAll(title,description)},IssueDetailController.prototype.initializeEventHandlers=function(){return this.scope.$on("attachment:create",function(_this){return function(){return _this.analytics.trackEvent("attachment","create","create attachment on issue",1)}}(this)),this.scope.$on("promote-issue-to-us:success",function(_this){return function(){return _this.analytics.trackEvent("issue","promoteToUserstory","promote issue to userstory",1),_this.rootscope.$broadcast("object:updated"),_this.loadIssue()}}(this)),this.scope.$on("comment:new",function(_this){return function(){return _this.loadIssue()}}(this)),this.scope.$on("custom-attributes-values:edit",function(_this){return function(){return _this.rootscope.$broadcast("object:updated")}}(this))},IssueDetailController.prototype.initializeOnDeleteGoToUrl=function(){var ctx;return ctx={project:this.scope.project.slug},this.scope.project.is_issues_activated?this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-issues",ctx):this.scope.onDeleteGoToUrl=this.navUrls.resolve("project",ctx)},IssueDetailController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return _this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),_this.scope.statusList=project.issue_statuses,_this.scope.statusById=groupBy(project.issue_statuses,function(x){return x.id}),_this.scope.typeById=groupBy(project.issue_types,function(x){return x.id}),_this.scope.typeList=_.sortBy(project.issue_types,"order"),_this.scope.severityList=project.severities,_this.scope.severityById=groupBy(project.severities,function(x){return x.id}),_this.scope.priorityList=project.priorities,_this.scope.priorityById=groupBy(project.priorities,function(x){return x.id}),project}}(this))},IssueDetailController.prototype.loadIssue=function(){return this.rs.issues.getByRef(this.scope.projectId,this.params.issueref).then(function(_this){return function(issue){var ctx,ref,ref1;return _this.scope.issue=issue,_this.scope.issueId=issue.id,_this.scope.commentModel=issue,null!=(null!=(ref=_this.scope.issue.neighbors.previous)?ref.ref:void 0)&&(ctx={project:_this.scope.project.slug,ref:_this.scope.issue.neighbors.previous.ref},_this.scope.previousUrl=_this.navUrls.resolve("project-issues-detail",ctx)),null!=(null!=(ref1=_this.scope.issue.neighbors.next)?ref1.ref:void 0)?(ctx={project:_this.scope.project.slug,ref:_this.scope.issue.neighbors.next.ref},_this.scope.nextUrl=_this.navUrls.resolve("project-issues-detail",ctx)):void 0}}(this))},IssueDetailController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(project){return _this.fillUsersAndRoles(project.members,project.roles),_this.loadIssue()}}(this))},IssueDetailController.prototype.onUpvote=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.loadIssue(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error")}}(this),this.rs.issues.upvote(this.scope.issueId).then(onSuccess,onError)},IssueDetailController.prototype.onDownvote=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.loadIssue(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error")}}(this),this.rs.issues.downvote(this.scope.issueId).then(onSuccess,onError)},IssueDetailController.prototype.onWatch=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.loadIssue(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error")}}(this),this.rs.issues.watch(this.scope.issueId).then(onSuccess,onError)},IssueDetailController.prototype.onUnwatch=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.loadIssue(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error")}}(this),this.rs.issues.unwatch(this.scope.issueId).then(onSuccess,onError)},IssueDetailController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("IssueDetailController",IssueDetailController),IssueStatusDisplayDirective=function($template,$compile){var link,template;return template=$template.get("common/components/status-display.html",!0),link=function($scope,$el,$attrs){var render;return render=function(issue){var html,status;return status=$scope.statusById[issue.status],html=template({is_closed:status.is_closed,status:status}),html=$compile(html)($scope),$el.html(html)},$scope.$watch($attrs.ngModel,function(issue){return null!=issue?render(issue):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgIssueStatusDisplay",["$tgTemplate","$compile",IssueStatusDisplayDirective]),IssueStatusButtonDirective=function($rootScope,$repo,$confirm,$loading,$qqueue,$template,$compile){var link,template;return template=$template.get("issue/issues-status-button.html",!0),link=function($scope,$el,$attrs,$model){var isEditable,render,save;return isEditable=function(){return-1!==$scope.project.my_permissions.indexOf("modify_issue")},render=function(_this){return function(issue){var html,status;return status=$scope.statusById[issue.status],html=template({status:status,statuses:$scope.statusList,editable:isEditable()}),html=$compile(html)($scope),$el.html(html)}}(this),save=$qqueue.bindAdd(function(_this){return function(statusId){var currentLoading,issue,onError,onSuccess;return $.fn.popover().closeAll(),issue=$model.$modelValue.clone(),issue.status=statusId,currentLoading=$loading().target($el).start(),onSuccess=function(){return $model.$setViewValue(issue),$rootScope.$broadcast("object:updated"),currentLoading.finish()},onError=function(){return $confirm.notify("error"),issue.revert(),$model.$setViewValue(issue),currentLoading.finish()},$repo.save(issue).then(onSuccess,onError)}}(this)),$el.on("click",".js-edit-status",function(event){return event.preventDefault(),event.stopPropagation(),isEditable()?$el.find(".pop-status").popover().open():void 0}),$el.on("click",".status",function(event){var target;return event.preventDefault(),event.stopPropagation(),isEditable()?(target=angular.element(event.currentTarget),save(target.data("status-id"))):void 0}),$scope.$watch($attrs.ngModel,function(issue){return issue?render(issue):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgIssueStatusButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQqueue","$tgTemplate","$compile",IssueStatusButtonDirective]),IssueTypeButtonDirective=function($rootScope,$repo,$confirm,$loading,$qqueue,$template,$compile){var link,template;return template=$template.get("issue/issue-type-button.html",!0),link=function($scope,$el,$attrs,$model){var isEditable,render,save;return isEditable=function(){return-1!==$scope.project.my_permissions.indexOf("modify_issue")},render=function(_this){return function(issue){var html,type;return type=$scope.typeById[issue.type],html=template({type:type,typees:$scope.typeList,editable:isEditable()}),html=$compile(html)($scope),$el.html(html)}}(this),save=$qqueue.bindAdd(function(_this){return function(type){var currentLoading,issue,onError,onSuccess;return $.fn.popover().closeAll(),issue=$model.$modelValue.clone(),issue.type=type,currentLoading=$loading().target($el.find(".level-name")).start(),onSuccess=function(){return $model.$setViewValue(issue),$rootScope.$broadcast("object:updated"),currentLoading.finish()},onError=function(){return $confirm.notify("error"),issue.revert(),$model.$setViewValue(issue),currentLoading.finish()},$repo.save(issue).then(onSuccess,onError)}}(this)),$el.on("click",".type-data",function(event){return event.preventDefault(),event.stopPropagation(),isEditable()?$el.find(".pop-type").popover().open():void 0}),$el.on("click",".type",function(event){var target,type;return event.preventDefault(),event.stopPropagation(),isEditable()?(target=angular.element(event.currentTarget),type=target.data("type-id"),save(type)):void 0}),$scope.$watch($attrs.ngModel,function(issue){return issue?render(issue):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgIssueTypeButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQqueue","$tgTemplate","$compile",IssueTypeButtonDirective]),IssueSeverityButtonDirective=function($rootScope,$repo,$confirm,$loading,$qqueue,$template,$compile){var link,template;return template=$template.get("issue/issue-severity-button.html",!0),link=function($scope,$el,$attrs,$model){var isEditable,render,save;return isEditable=function(){return-1!==$scope.project.my_permissions.indexOf("modify_issue")},render=function(_this){return function(issue){var html,severity;return severity=$scope.severityById[issue.severity],html=template({severity:severity,severityes:$scope.severityList,editable:isEditable()}),html=$compile(html)($scope),$el.html(html)}}(this),save=$qqueue.bindAdd(function(_this){return function(severity){var currentLoading,issue,onError,onSuccess;return $.fn.popover().closeAll(),issue=$model.$modelValue.clone(),issue.severity=severity,currentLoading=$loading().target($el.find(".level-name")).start(),onSuccess=function(){return $model.$setViewValue(issue),$rootScope.$broadcast("object:updated"),currentLoading.finish()},onError=function(){return $confirm.notify("error"),issue.revert(),$model.$setViewValue(issue),currentLoading.finish()},$repo.save(issue).then(onSuccess,onError)}}(this)),$el.on("click",".severity-data",function(event){return event.preventDefault(),event.stopPropagation(),isEditable()?$el.find(".pop-severity").popover().open():void 0}),$el.on("click",".severity",function(event){var severity,target;return event.preventDefault(),event.stopPropagation(),isEditable()?(target=angular.element(event.currentTarget),severity=target.data("severity-id"),save(severity)):void 0}),$scope.$watch($attrs.ngModel,function(issue){return issue?render(issue):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgIssueSeverityButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQqueue","$tgTemplate","$compile",IssueSeverityButtonDirective]),IssuePriorityButtonDirective=function($rootScope,$repo,$confirm,$loading,$qqueue,$template,$compile){var link,template;return template=$template.get("issue/issue-priority-button.html",!0),link=function($scope,$el,$attrs,$model){var isEditable,render,save;return isEditable=function(){return-1!==$scope.project.my_permissions.indexOf("modify_issue")},render=function(_this){return function(issue){var html,priority;return priority=$scope.priorityById[issue.priority],html=template({priority:priority,priorityes:$scope.priorityList,editable:isEditable()}),html=$compile(html)($scope),$el.html(html)}}(this),save=$qqueue.bindAdd(function(_this){return function(priority){var currentLoading,issue,onError,onSuccess;return $.fn.popover().closeAll(),issue=$model.$modelValue.clone(),issue.priority=priority,currentLoading=$loading().target($el.find(".level-name")).start(),onSuccess=function(){return $model.$setViewValue(issue),$rootScope.$broadcast("object:updated"),currentLoading.finish()},onError=function(){return $confirm.notify("error"),issue.revert(),$model.$setViewValue(issue),currentLoading.finish()},$repo.save(issue).then(onSuccess,onError)}}(this)),$el.on("click",".priority-data",function(event){return event.preventDefault(),event.stopPropagation(),isEditable()?$el.find(".pop-priority").popover().open():void 0}),$el.on("click",".priority",function(event){var priority,target;return event.preventDefault(),event.stopPropagation(),isEditable()?(target=angular.element(event.currentTarget),priority=target.data("priority-id"),save(priority)):void 0}),$scope.$watch($attrs.ngModel,function(issue){return issue?render(issue):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgIssuePriorityButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQqueue","$tgTemplate","$compile",IssuePriorityButtonDirective]),PromoteIssueToUsButtonDirective=function($rootScope,$repo,$confirm,$qqueue,$translate){var link;return link=function($scope,$el,$attrs,$model){var save;return save=$qqueue.bindAdd(function(_this){return function(issue,askResponse){var data,onError,onSuccess;return data={generated_from_issue:issue.id,project:issue.project,subject:issue.subject,description:issue.description,tags:issue.tags,is_blocked:issue.is_blocked,blocked_note:issue.blocked_note},onSuccess=function(){return askResponse.finish(),$confirm.notify("success"),$rootScope.$broadcast("promote-issue-to-us:success")},onError=function(){return askResponse.finish(),$confirm.notify("error")},$repo.create("userstories",data).then(onSuccess,onError)}}(this)),$el.on("click","a",function(event){var issue,message,subtitle,title;return event.preventDefault(),issue=$model.$modelValue,title=$translate.instant("ISSUES.CONFIRM_PROMOTE.TITLE"),message=$translate.instant("ISSUES.CONFIRM_PROMOTE.MESSAGE"),subtitle=issue.subject,$confirm.ask(title,subtitle,message).then(function(_this){return function(response){return save(issue,response)}}(this))}),$scope.$on("$destroy",function(){return $el.off()})},{restrict:"AE",require:"ngModel",templateUrl:"issue/promote-issue-to-us-button.html",link:link}},module.directive("tgPromoteIssueToUsButton",["$rootScope","$tgRepo","$tgConfirm","$tgQqueue","$translate",PromoteIssueToUsButtonDirective])}.call(this),function(){var CreateBulkIssuesDirective,CreateIssueDirective,bindOnce,debounce,module,taiga;taiga=this.taiga,bindOnce=this.taiga.bindOnce,debounce=this.taiga.debounce,module=angular.module("taigaIssues"),CreateIssueDirective=function($repo,$confirm,$rootscope,lightboxService,$loading,$q,attachmentsService){var link;return link=function($scope,$el,$attrs){var attachmentsToAdd,createAttachments,form,resetAttachments,submit,submitButton;return form=$el.find("form").checksley(),$scope.issue={},$scope.attachments=Immutable.List(),$scope.$on("issueform:new",function(ctx,project){var attachmentsToAdd;return attachmentsToAdd=Immutable.List(),$el.find(".tag-input").val(""),lightboxService.open($el),$scope.issue={project:project.id,subject:"",status:project.default_issue_status,type:project.default_issue_type,priority:project.default_priority,severity:project.default_severity,tags:[]}}),$scope.$on("$destroy",function(){return $el.off()}),createAttachments=function(obj){var promises;return promises=_.map(attachmentsToAdd.toJS(),function(attachment){return attachmentsService.upload(attachment.file,obj.id,$scope.issue.project,"issue")}),$q.all(promises)},attachmentsToAdd=Immutable.List(),resetAttachments=function(){return attachmentsToAdd=Immutable.List()},$scope.addAttachment=function(attachment){return attachmentsToAdd=attachmentsToAdd.push(attachment)},submit=debounce(2e3,function(_this){return function(event){var currentLoading,promise;return event.preventDefault(),form.validate()?(currentLoading=$loading().target(submitButton).start(),promise=$repo.create("issues",$scope.issue),promise.then(function(data){return createAttachments(data)}),promise.then(function(data){return currentLoading.finish(),$rootscope.$broadcast("issueform:new:success",data),lightboxService.close($el),$confirm.notify("success")}),promise.then(null,function(){return currentLoading.finish(),$confirm.notify("error")})):void 0}}(this)),submitButton=$el.find(".submit-button"),$el.on("submit","form",submit)},{link:link}},module.directive("tgLbCreateIssue",["$tgRepo","$tgConfirm","$rootScope","lightboxService","$tgLoading","$q","tgAttachmentsService",CreateIssueDirective]),CreateBulkIssuesDirective=function($repo,$rs,$confirm,$rootscope,$loading,lightboxService){var link;return link=function($scope,$el,attrs){var submit,submitButton;return $scope.$on("issueform:bulk",function(ctx,projectId,status){return lightboxService.open($el),$scope["new"]={projectId:projectId,bulk:""}}),submit=debounce(2e3,function(_this){return function(event){var currentLoading,data,form,projectId,promise;return event.preventDefault(),form=$el.find("form").checksley(),form.validate()?(currentLoading=$loading().target(submitButton).start(),data=$scope["new"].bulk,projectId=$scope["new"].projectId,promise=$rs.issues.bulkCreate(projectId,data),promise.then(function(result){return currentLoading.finish(),$rootscope.$broadcast("issueform:new:success",result),lightboxService.close($el),$confirm.notify("success")}),promise.then(null,function(){return currentLoading.finish(),$confirm.notify("error")})):void 0}}(this)),submitButton=$el.find(".submit-button"),$el.on("submit","form",submit),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgLbCreateBulkIssues",["$tgRepo","$tgResources","$tgConfirm","$rootScope","$tgLoading","lightboxService",CreateBulkIssuesDirective])}.call(this),function(){var IssueAssignedToInlineEditionDirective,IssueStatusInlineEditionDirective,IssuesController,IssuesDirective,IssuesFiltersDirective,bindOnce,debounceLeading,groupBy,joinStr,mixOf,module,startswith,taiga,toString,trim,bind=function(fn,me){return function(){return fn.apply(me,arguments)}},extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,trim=this.taiga.trim, -toString=this.taiga.toString,joinStr=this.taiga.joinStr,groupBy=this.taiga.groupBy,bindOnce=this.taiga.bindOnce,debounceLeading=this.taiga.debounceLeading,startswith=this.taiga.startswith,module=angular.module("taigaIssues"),IssuesController=function(superClass){function IssuesController(scope,rootscope,repo,confirm,rs,urls,params,q,location,appMetaService,navUrls,events,analytics,translate){var filters,promise;return this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.urls=urls,this.params=params,this.q=q,this.location=location,this.appMetaService=appMetaService,this.navUrls=navUrls,this.events=events,this.analytics=analytics,this.translate=translate,this.loadIssues=bind(this.loadIssues,this),this.scope.sectionName="Issues",this.scope.filters={},_.isEmpty(this.location.search())?(filters=this.rs.issues.getFilters(this.params.pslug),filters.page=1,this.location.search(filters),void this.location.replace()):(promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,title;return title=_this.translate.instant("ISSUES.PAGE_TITLE",{projectName:_this.scope.project.name}),description=_this.translate.instant("ISSUES.PAGE_DESCRIPTION",{projectName:_this.scope.project.name,projectDescription:_this.scope.project.description}),_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this)),void this.scope.$on("issueform:new:success",function(_this){return function(){return _this.analytics.trackEvent("issue","create","create issue on issues list",1),_this.loadIssues()}}(this)))}return extend(IssuesController,superClass),IssuesController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$tgUrls","$routeParams","$q","$tgLocation","tgAppMetaService","$tgNavUrls","$tgEvents","$tgAnalytics","$translate"],IssuesController.prototype.initializeSubscription=function(){var routingKey;return routingKey="changes.project."+this.scope.projectId+".issues",this.events.subscribe(this.scope,routingKey,function(_this){return function(message){return _this.loadIssues()}}(this))},IssuesController.prototype.storeFilters=function(){return this.rs.issues.storeFilters(this.params.pslug,this.location.search())},IssuesController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return project.is_issues_activated||_this.location.path(_this.navUrls.resolve("permission-denied")),_this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),_this.scope.issueStatusById=groupBy(project.issue_statuses,function(x){return x.id}),_this.scope.issueStatusList=_.sortBy(project.issue_statuses,"order"),_this.scope.severityById=groupBy(project.severities,function(x){return x.id}),_this.scope.severityList=_.sortBy(project.severities,"order"),_this.scope.priorityById=groupBy(project.priorities,function(x){return x.id}),_this.scope.priorityList=_.sortBy(project.priorities,"order"),_this.scope.issueTypes=_.sortBy(project.issue_types,"order"),_this.scope.issueTypeById=groupBy(project.issue_types,function(x){return x.id}),project}}(this))},IssuesController.prototype.getUrlFilters=function(){var filters;return filters=_.pick(this.location.search(),"page","tags","status","types","q","severities","priorities","assignedTo","createdBy","orderBy"),filters.page||(filters.page=1),filters},IssuesController.prototype.getUrlFilter=function(name){var filters;return filters=_.pick(this.location.search(),name),filters[name]},IssuesController.prototype.loadMyFilters=function(){return this.rs.issues.getMyFilters(this.scope.projectId).then(function(_this){return function(filters){return _.map(filters,function(value,key){return{id:key,name:key,type:"myFilters",selected:!1}})}}(this))},IssuesController.prototype.removeNotExistingFiltersFromUrl=function(){var currentSearch,existingValues,filterName,filterValue,splittedValues,urlfilters;currentSearch=this.location.search(),urlfilters=this.getUrlFilters();for(filterName in urlfilters)filterValue=urlfilters[filterName],"page"!==filterName&&"orderBy"!==filterName&&"q"!==filterName&&(splittedValues="tags"===filterName?_.map((""+filterValue).split(",")):_.map((""+filterValue).split(","),function(x){return"null"===x?null:parseInt(x)}),existingValues=_.intersection(splittedValues,_.map(this.scope.filters[filterName],"id")),splittedValues.length!==existingValues.length&&this.location.search(filterName,existingValues.join()));return currentSearch!==this.location.search()?this.location.replace():void 0},IssuesController.prototype.markSelectedFilters=function(filters,urlfilters){var isSelected,j,key,len,name,obj,ref,ref1,results,searchdata,val,value;searchdata={},ref=_.omit(urlfilters,"page","orderBy");for(name in ref)for(value=ref[name],null==searchdata[name]&&(searchdata[name]={}),ref1=(""+value).split(","),j=0,len=ref1.length;len>j;j++)val=ref1[j],searchdata[name][val]=!0;isSelected=function(type,id){return null!=searchdata[type]&&searchdata[type][id]?!0:!1},results=[];for(key in filters)value=filters[key],results.push(function(){var k,len1,results1;for(results1=[],k=0,len1=value.length;len1>k;k++)obj=value[k],results1.push(obj.selected=isSelected(obj.type,obj.id)?!0:void 0);return results1}());return results},IssuesController.prototype.loadFilters=function(){var loadFilters,promise,urlfilters;return urlfilters=this.getUrlFilters(),urlfilters.q&&(this.scope.filtersQ=urlfilters.q),promise=this.loadMyFilters().then(function(_this){return function(myFilters){return _this.scope.filters.myFilters=myFilters,myFilters}}(this)),loadFilters={},loadFilters.project=this.scope.projectId,loadFilters.tags=urlfilters.tags,loadFilters.status=urlfilters.status,loadFilters.q=urlfilters.q,loadFilters.types=urlfilters.types,loadFilters.severities=urlfilters.severities,loadFilters.priorities=urlfilters.priorities,loadFilters.assigned_to=urlfilters.assignedTo,loadFilters.owner=urlfilters.createdBy,promise=promise.then(function(_this){return function(){return _this.rs.issues.filtersData(loadFilters)}}(this)),promise.then(function(_this){return function(data){var choicesFiltersFormat,tagsFilterFormat,usersFiltersFormat;return usersFiltersFormat=function(users,type,unknownOption){var reformatedUsers,unknownItem;return reformatedUsers=_.map(users,function(t){return t.type=type,t.name=t.full_name?t.full_name:unknownOption,t}),unknownItem=_.remove(reformatedUsers,function(u){return!u.id}),reformatedUsers=_.sortBy(reformatedUsers,function(u){return u.name.toUpperCase()}),unknownItem.length>0&&reformatedUsers.unshift(unknownItem[0]),reformatedUsers},choicesFiltersFormat=function(choices,type,byIdObject){return _.map(choices,function(t){return t.type=type,t})},tagsFilterFormat=function(tags){return _.map(tags,function(t){return t.id=t.name,t.type="tags",t})},_this.scope.filters.status=choicesFiltersFormat(data.statuses,"status",_this.scope.issueStatusById),_this.scope.filters.severities=choicesFiltersFormat(data.severities,"severities",_this.scope.severityById),_this.scope.filters.priorities=choicesFiltersFormat(data.priorities,"priorities",_this.scope.priorityById),_this.scope.filters.assignedTo=usersFiltersFormat(data.assigned_to,"assignedTo","Unassigned"),_this.scope.filters.createdBy=usersFiltersFormat(data.owners,"createdBy","Unknown"),_this.scope.filters.types=choicesFiltersFormat(data.types,"types",_this.scope.issueTypeById),_this.scope.filters.tags=tagsFilterFormat(data.tags),_this.removeNotExistingFiltersFromUrl(),_this.markSelectedFilters(_this.scope.filters,urlfilters),_this.rootscope.$broadcast("filters:loaded",_this.scope.filters)}}(this))},IssuesController.prototype.loadIssuesRequests=0,IssuesController.prototype.loadIssues=function(){var name,promise,ref,values;this.scope.urlFilters=this.getUrlFilters(),this.scope.httpParams={},ref=this.scope.urlFilters;for(name in ref)values=ref[name],"severities"===name?name="severity":"orderBy"===name?name="order_by":"priorities"===name?name="priority":"assignedTo"===name?name="assigned_to":"createdBy"===name?name="owner":"status"===name?name="status":"types"===name&&(name="type"),this.scope.httpParams[name]=values;return promise=this.rs.issues.list(this.scope.projectId,this.scope.httpParams),this.loadIssuesRequests+=1,promise.index=this.loadIssuesRequests,promise.then(function(_this){return function(data){return promise.index===_this.loadIssuesRequests&&(_this.scope.issues=data.models,_this.scope.page=data.current,_this.scope.count=data.count,_this.scope.paginatedBy=data.paginatedBy),data}}(this)),promise},IssuesController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(project){return _this.fillUsersAndRoles(project.members,project.roles),_this.initializeSubscription(),_this.loadFilters(),_this.loadIssues()}}(this))},IssuesController.prototype.saveCurrentFiltersTo=function(newFilter){var deferred;return deferred=this.q.defer(),this.rs.issues.getMyFilters(this.scope.projectId).then(function(_this){return function(filters){return filters[newFilter]=_this.location.search(),_this.rs.issues.storeMyFilters(_this.scope.projectId,filters).then(function(){return deferred.resolve()})}}(this)),deferred.promise},IssuesController.prototype.deleteMyFilter=function(filter){var deferred;return deferred=this.q.defer(),this.rs.issues.getMyFilters(this.scope.projectId).then(function(_this){return function(filters){return delete filters[filter],_this.rs.issues.storeMyFilters(_this.scope.projectId,filters).then(function(){return deferred.resolve()})}}(this)),deferred.promise},IssuesController.prototype.addNewIssue=function(){return this.rootscope.$broadcast("issueform:new",this.scope.project)},IssuesController.prototype.addIssuesInBulk=function(){return this.rootscope.$broadcast("issueform:bulk",this.scope.projectId)},IssuesController}(mixOf(taiga.Controller,taiga.PageMixin,taiga.FiltersMixin)),module.controller("IssuesController",IssuesController),IssuesDirective=function($log,$location,$template,$compile){var link,linkOrdering,linkPagination,template;return template=$template.get("issue/issue-paginator.html",!0),linkPagination=function($scope,$el,$attrs,$ctrl){var $pagEl,afterCurrent,atBegin,atEnd,beforeCurrent,getNumPages,renderPagination;return afterCurrent=2,beforeCurrent=4,atBegin=2,atEnd=2,$pagEl=$el.find(".issues-paginator"),getNumPages=function(){var numPages;return numPages=$scope.count/$scope.paginatedBy,numPages=parseInt(numPages,10)=numPages)return void $pagEl.hide();for($pagEl.show(),pages=[],options={},options.pages=pages,options.showPrevious=$scope.page>1,options.showNext=!($scope.page===numPages),cpage=$scope.page,i=j=1,ref=numPages;ref>=1?ref>=j:j>=ref;i=ref>=1?++j:--j)i===cpage+afterCurrent&&numPages>cpage+afterCurrent+atEnd?pages.push({classes:"dots",type:"dots"}):i===cpage-beforeCurrent&&cpage>atBegin+beforeCurrent?pages.push({classes:"dots",type:"dots"}):i>cpage+afterCurrent&&numPages-atEnd>=i||cpage-beforeCurrent>i&&i>atBegin||(i===cpage?pages.push({classes:"active",num:i,type:"page-active"}):pages.push({classes:"page",num:i,type:"page"}));return html=template(options),html=$compile(html)($scope),$pagEl.html(html)},$scope.$watch("issues",function(value){return value?renderPagination():void 0}),$el.on("click",".issues-paginator a.next",function(event){return event.preventDefault(),$scope.$apply(function(){return $ctrl.selectFilter("page",$scope.page+1),$ctrl.loadIssues()})}),$el.on("click",".issues-paginator a.previous",function(event){return event.preventDefault(),$scope.$apply(function(){return $ctrl.selectFilter("page",$scope.page-1),$ctrl.loadIssues()})}),$el.on("click",".issues-paginator li.page > a",function(event){var pagenum,target;return event.preventDefault(),target=angular.element(event.currentTarget),pagenum=target.data("pagenum"),$scope.$apply(function(){return $ctrl.selectFilter("page",pagenum),$ctrl.loadIssues()})})},linkOrdering=function($scope,$el,$attrs,$ctrl){var colHeadElement,currentOrder,icon;return currentOrder=$ctrl.getUrlFilter("orderBy")||"created_date",currentOrder&&(icon=startswith(currentOrder,"-")?"icon-arrow-up":"icon-arrow-bottom",colHeadElement=$el.find(".row.title > div[data-fieldname='"+trim(currentOrder,"-")+"']"),colHeadElement.html(colHeadElement.html()+"")),$el.on("click",".row.title > div",function(event){var finalOrder,newOrder,target;return target=angular.element(event.currentTarget),currentOrder=$ctrl.getUrlFilter("orderBy"),newOrder=target.data("fieldname"),finalOrder=currentOrder===newOrder?"-"+newOrder:newOrder,$scope.$apply(function(){return $ctrl.replaceFilter("orderBy",finalOrder),$ctrl.storeFilters(),$ctrl.loadIssues().then(function(){return $el.find(".row.title > div > span.icon").remove(),icon=startswith(finalOrder,"-")?"icon-arrow-up":"icon-arrow-bottom",target.html(target.html()+"")})})})},link=function($scope,$el,$attrs){var $ctrl;return $ctrl=$el.controller(),linkOrdering($scope,$el,$attrs,$ctrl),linkPagination($scope,$el,$attrs,$ctrl),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgIssues",["$log","$tgLocation","$tgTemplate","$compile",IssuesDirective]),IssuesFiltersDirective=function($q,$log,$location,$rs,$confirm,$loading,$template,$translate,$compile,$auth){var link,template,templateSelected;return template=$template.get("issue/issues-filters.html",!0),templateSelected=$template.get("issue/issues-filters-selected.html",!0),link=function($scope,$el,$attrs){var $ctrl,getFiltersType,initializeSelectedFilters,reloadIssues,renderFilters,renderSelectedFilters,selectQFilter,selectedFilters,showCategories,showFilters,toggleFilterSelection,unwatchIssues;return $ctrl=$el.closest(".wrapper").controller(),selectedFilters=[],showFilters=function(title,type){return $el.find(".filters-cats").hide(),$el.find(".filter-list").removeClass("hidden"),$el.find("h2.breadcrumb").removeClass("hidden"),$el.find("h2 a.subfilter span.title").html(title),$el.find("h2 a.subfilter span.title").prop("data-type",type)},showCategories=function(){return $el.find(".filters-cats").show(),$el.find(".filter-list").addClass("hidden"),$el.find("h2.breadcrumb").addClass("hidden")},initializeSelectedFilters=function(filters){var j,len,name,val,values;selectedFilters=[];for(name in filters)for(values=filters[name],j=0,len=values.length;len>j;j++)val=values[j],val.selected&&selectedFilters.push(val);return renderSelectedFilters(selectedFilters)},renderSelectedFilters=function(selectedFilters){var html;return _.filter(selectedFilters,function(_this){return function(f){return f.color?f.style="border-left: 3px solid "+f.color:void 0}}(this)),html=templateSelected({filters:selectedFilters}),html=$compile(html)($scope),$el.find(".filters-applied").html(html),$auth.isAuthenticated()&&selectedFilters.length>0?$el.find(".save-filters").show():$el.find(".save-filters").hide()},renderFilters=function(filters){var html;return _.filter(filters,function(_this){return function(f){return f.color?f.style="border-left: 3px solid "+f.color:void 0}}(this)),html=template({filters:filters}),html=$compile(html)($scope),$el.find(".filter-list").html(html)},getFiltersType=function(){return $el.find("h2 a.subfilter span.title").prop("data-type")},reloadIssues=function(){var currentFiltersType;return currentFiltersType=getFiltersType(),$q.all([$ctrl.loadIssues(),$ctrl.loadFilters()]).then(function(){var filters;return filters=$scope.filters[currentFiltersType],renderFilters(_.reject(filters,"selected"))})},toggleFilterSelection=function(type,id){var currentFiltersType,filter,filterId,filters;return"myFilters"===type?($rs.issues.getMyFilters($scope.projectId).then(function(data){var filters,myFilters;return myFilters=data,filters=myFilters[id],filters.page=1,$ctrl.replaceAllFilters(filters),$ctrl.storeFilters(),$ctrl.loadIssues(),$ctrl.markSelectedFilters($scope.filters,filters),initializeSelectedFilters($scope.filters)}),null):(filters=$scope.filters[type],filterId="tags"===type?taiga.toString(id):id,filter=_.find(filters,{id:filterId}),filter.selected=!filter.selected,null===id&&(id="null"),filter.selected?(selectedFilters.push(filter),$ctrl.selectFilter(type,id),$ctrl.selectFilter("page",1),$ctrl.storeFilters()):(selectedFilters=_.reject(selectedFilters,function(f){return f.id===filter.id&&f.type===filter.type}),$ctrl.unselectFilter(type,id),$ctrl.selectFilter("page",1),$ctrl.storeFilters()),reloadIssues(),renderSelectedFilters(selectedFilters),currentFiltersType=getFiltersType(),type===currentFiltersType?renderFilters(_.reject(filters,"selected")):void 0)},$scope.$on("filters:loaded",function(ctx,filters){return initializeSelectedFilters(filters)}),$scope.$on("filters:issueupdate",function(ctx,filters){var html;return html=template({filters:filters.status}),html=$compile(html)($scope),$el.find(".filter-list").html(html)}),selectQFilter=debounceLeading(100,function(value,oldValue){return void 0!==value&&value!==oldValue?($ctrl.replaceFilter("page",null,!0),0===value.length?($ctrl.replaceFilter("q",null),$ctrl.storeFilters()):($ctrl.replaceFilter("q",value),$ctrl.storeFilters()),reloadIssues()):void 0}),unwatchIssues=$scope.$watch("issues",function(newValue){return _.isUndefined(newValue)?void 0:($scope.$watch("filtersQ",selectQFilter),unwatchIssues())}),$el.on("click",".filters-cats > ul > li > a",function(event){var tags,target;return event.preventDefault(),target=angular.element(event.currentTarget),tags=$scope.filters[target.data("type")],renderFilters(_.reject(tags,"selected")),showFilters(target.attr("title"),target.data("type"))}),$el.on("click",".filters-inner > .filters-step-cat > .breadcrumb > .back",function(event){return event.preventDefault(),showCategories($el)}),$el.on("click",".filters-applied a",function(event){var id,target,type;return event.preventDefault(),target=angular.element(event.currentTarget),id=target.data("id")||null,type=target.data("type"),toggleFilterSelection(type,id)}),$el.on("click",".filter-list .single-filter",function(event){var id,target,type;return event.preventDefault(),target=angular.element(event.currentTarget),target.toggleClass("active"),id=target.data("id")||null,type=target.data("type"),"myFilters"===type&&target.removeClass("active"),toggleFilterSelection(type,id)}),$el.on("click",".filter-list .single-filter .icon-delete",function(event){var customFilterName,message,target,title;return event.preventDefault(),event.stopPropagation(),target=angular.element(event.currentTarget),customFilterName=target.parent().data("id"),title=$translate.instant("ISSUES.FILTERS.CONFIRM_DELETE.TITLE"),message=$translate.instant("ISSUES.FILTERS.CONFIRM_DELETE.MESSAGE",{customFilterName:customFilterName}),$confirm.askOnDelete(title,message).then(function(askResponse){var promise;return promise=$ctrl.deleteMyFilter(customFilterName),promise.then(function(){return promise=$ctrl.loadMyFilters(),promise.then(function(filters){return askResponse.finish(),$scope.filters.myFilters=filters,renderFilters($scope.filters.myFilters)}),promise.then(null,function(){return askResponse.finish()})}),promise.then(null,function(){return askResponse.finish(!1),$confirm.notify("error")})})}),$el.on("click",".save-filters",function(event){return event.preventDefault(),renderFilters($scope.filters.myFilters),showFilters("My filters","myFilters"),$el.find(".save-filters").hide(),$el.find(".my-filter-name").removeClass("hidden"),$el.find(".my-filter-name").focus(),$scope.$apply()}),$el.on("keyup",".my-filter-name",function(event){var currentLoading,newFilter,promise,target;return event.preventDefault(),13===event.keyCode?(target=angular.element(event.currentTarget),newFilter=target.val(),currentLoading=$loading().target($el.find(".new")).start(),promise=$ctrl.saveCurrentFiltersTo(newFilter),promise.then(function(){var loadPromise;return loadPromise=$ctrl.loadMyFilters(),loadPromise.then(function(filters){var currentfilterstype;return currentLoading.finish(),$scope.filters.myFilters=filters,currentfilterstype=$el.find("h2 a.subfilter span.title").prop("data-type"),"myFilters"===currentfilterstype&&renderFilters($scope.filters.myFilters),$el.find(".my-filter-name").addClass("hidden"),$el.find(".save-filters").show()}),loadPromise.then(null,function(){return currentLoading.finish(),$confirm.notify("error","Error loading custom filters")})}),promise.then(null,function(){return currentLoading.finish(),$el.find(".my-filter-name").val(newFilter).focus().select(),$confirm.notify("error","Filter not saved")})):27===event.keyCode?($el.find(".my-filter-name").val(""),$el.find(".my-filter-name").addClass("hidden"),$el.find(".save-filters").show()):void 0})},{link:link}},module.directive("tgIssuesFilters",["$q","$log","$tgLocation","$tgResources","$tgConfirm","$tgLoading","$tgTemplate","$translate","$compile","$tgAuth",IssuesFiltersDirective]),IssueStatusInlineEditionDirective=function($repo,$template,$rootscope){var link,selectionTemplate,updateIssueStatus;return selectionTemplate=$template.get("issue/issue-status-inline-edition-selection.html",!0),updateIssueStatus=function($el,issue,issueStatusById){var issueStatusDom,issueStatusDomParent,status;return issueStatusDomParent=$el.find(".issue-status"),issueStatusDom=$el.find(".issue-status .issue-status-bind"),status=issueStatusById[issue.status],status?(issueStatusDom.text(status.name),issueStatusDom.prop("title",status.name),issueStatusDomParent.css("color",status.color)):void 0},link=function($scope,$el,$attrs){var $ctrl,issue;return $ctrl=$el.controller(),issue=$scope.$eval($attrs.tgIssueStatusInlineEdition),$el.on("click",".issue-status",function(event){return event.preventDefault(),event.stopPropagation(),$el.find(".pop-status").popover().open()}),$el.on("click",".status",function(event){var filter,j,len,ref,target;for(event.preventDefault(),event.stopPropagation(),target=angular.element(event.currentTarget),ref=$scope.filters.status,j=0,len=ref.length;len>j;j++)filter=ref[j],filter.id===issue.status&&filter.count--;return issue.status=target.data("status-id"),$el.find(".pop-status").popover().close(),updateIssueStatus($el,issue,$scope.issueStatusById),$scope.$apply(function(){var k,len1,ref1;for($repo.save(issue).then(function(){return $ctrl.loadIssues()}),ref1=$scope.filters.status,k=0,len1=ref1.length;len1>k;k++)filter=ref1[k],filter.id===issue.status&&filter.count++;return $rootscope.$broadcast("filters:issueupdate",$scope.filters)})}),taiga.bindOnce($scope,"project",function(project){return $el.append(selectionTemplate({statuses:project.issue_statuses})),updateIssueStatus($el,issue,$scope.issueStatusById),-1===project.my_permissions.indexOf("modify_issue")?($el.unbind("click"),$el.find("a").addClass("not-clickable")):void 0}),$scope.$watch($attrs.tgIssueStatusInlineEdition,function(_this){return function(val){return updateIssueStatus($el,val,$scope.issueStatusById)}}(this)),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgIssueStatusInlineEdition",["$tgRepo","$tgTemplate","$rootScope",IssueStatusInlineEditionDirective]),IssueAssignedToInlineEditionDirective=function($repo,$rootscope,$translate){var link,template;return template=_.template('<%- name %>\n
<%- name %>
'),link=function($scope,$el,$attrs){var $ctrl,issue,updateIssue;return updateIssue=function(issue){var ctx,member;return ctx={name:$translate.instant("COMMON.ASSIGNED_TO.NOT_ASSIGNED"),imgurl:"/"+window._version+"/images/unnamed.png"},member=$scope.usersById[issue.assigned_to],member&&(ctx.name=member.full_name_display,ctx.imgurl=member.photo),$el.find(".avatar").html(template(ctx)),$el.find(".issue-assignedto").attr("title",ctx.name)},$ctrl=$el.controller(),issue=$scope.$eval($attrs.tgIssueAssignedToInlineEdition),updateIssue(issue),$el.on("click",".issue-assignedto",function(event){return $rootscope.$broadcast("assigned-to:add",issue)}),taiga.bindOnce($scope,"project",function(project){return-1===project.my_permissions.indexOf("modify_issue")?($el.unbind("click"),$el.find("a").addClass("not-clickable")):void 0}),$scope.$on("assigned-to:added",function(_this){return function(ctx,userId,updatedIssue){return updatedIssue.id===issue.id?(updatedIssue.assigned_to=userId,$repo.save(updatedIssue),updateIssue(updatedIssue)):void 0}}(this)),$scope.$watch($attrs.tgIssueAssignedToInlineEdition,function(_this){return function(val){return updateIssue(val)}}(this)),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgIssueAssignedToInlineEdition",["$tgRepo","$rootScope","$translate",IssueAssignedToInlineEditionDirective])}.call(this),function(){var UsClientRequirementButtonDirective,UsStatusButtonDirective,UsStatusDisplayDirective,UsTeamRequirementButtonDirective,UserStoryDetailController,bindMethods,bindOnce,groupBy,mixOf,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,groupBy=this.taiga.groupBy,bindOnce=this.taiga.bindOnce,bindMethods=this.taiga.bindMethods,module=angular.module("taigaUserStories"),UserStoryDetailController=function(superClass){function UserStoryDetailController(scope,rootscope,repo,confirm,rs,params,q,location,log,appMetaService,navUrls,analytics,translate){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.log=log,this.appMetaService=appMetaService,this.navUrls=navUrls,this.analytics=analytics,this.translate=translate,bindMethods(this),this.scope.usRef=this.params.usref,this.scope.sectionName=this.translate.instant("US.SECTION_NAME"),this.initializeEventHandlers(),promise=this.loadInitialData(),promise.then(function(_this){return function(){return _this._setMeta(),_this.initializeOnDeleteGoToUrl()}}(this)),promise.then(null,this.onInitialDataError.bind(this))}return extend(UserStoryDetailController,superClass),UserStoryDetailController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$log","tgAppMetaService","$tgNavUrls","$tgAnalytics","$translate"],UserStoryDetailController.prototype._setMeta=function(){var closedTasks,description,progressPercentage,ref,title,totalTasks;return totalTasks=this.scope.tasks.length,closedTasks=_.filter(this.scope.tasks,function(_this){return function(t){return _this.scope.taskStatusById[t.status].is_closed}}(this)).length,progressPercentage=totalTasks>0?Math.round(100*closedTasks/totalTasks):0,title=this.translate.instant("US.PAGE_TITLE",{userStoryRef:"#"+this.scope.us.ref,userStorySubject:this.scope.us.subject,projectName:this.scope.project.name}),description=this.translate.instant("US.PAGE_DESCRIPTION",{userStoryStatus:(null!=(ref=this.scope.statusById[this.scope.us.status])?ref.name:void 0)||"--",userStoryPoints:this.scope.us.total_points,userStoryDescription:angular.element(this.scope.us.description_html||"").text(),userStoryClosedTasks:closedTasks,userStoryTotalTasks:totalTasks,userStoryProgressPercentage:progressPercentage}),this.appMetaService.setAll(title,description)},UserStoryDetailController.prototype.initializeEventHandlers=function(){return this.scope.$on("related-tasks:update",function(_this){return function(){return _this.scope.tasks=_.clone(_this.scope.tasks,!1)}}(this)),this.scope.$on("attachment:create",function(_this){return function(){return _this.analytics.trackEvent("attachment","create","create attachment on userstory",1)}}(this)),this.scope.$on("comment:new",function(_this){return function(){return _this.loadUs()}}(this))},UserStoryDetailController.prototype.initializeOnDeleteGoToUrl=function(){var ctx;return ctx={project:this.scope.project.slug},this.scope.onDeleteGoToUrl=this.navUrls.resolve("project",ctx),this.scope.project.is_backlog_activated?this.scope.us.milestone?(ctx.sprint=this.scope.sprint.slug,this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-taskboard",ctx)):this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-backlog",ctx):this.scope.project.is_kanban_activated?this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-kanban",ctx):void 0},UserStoryDetailController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return _this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),_this.scope.statusList=project.us_statuses,_this.scope.statusById=groupBy(project.us_statuses,function(x){return x.id}),_this.scope.taskStatusById=groupBy(project.task_statuses,function(x){return x.id}),_this.scope.pointsList=_.sortBy(project.points,"order"),_this.scope.pointsById=groupBy(_this.scope.pointsList,function(e){return e.id}),project}}(this))},UserStoryDetailController.prototype.loadUs=function(){var httpParams,kanbanStaus,milestone,noMilestone;return httpParams=_.pick(this.location.search(),"milestone","no-milestone","kanban-status"),milestone=httpParams.milestone,milestone&&this.rs.userstories.storeQueryParams(this.scope.projectId,{milestone:milestone,order_by:"sprint_order"}),noMilestone=httpParams["no-milestone"],noMilestone&&this.rs.userstories.storeQueryParams(this.scope.projectId,{milestone:"null",order_by:"backlog_order"}),kanbanStaus=httpParams["kanban-status"],kanbanStaus&&this.rs.userstories.storeQueryParams(this.scope.projectId,{status:kanbanStaus,order_by:"kanban_order"}),this.rs.userstories.getByRef(this.scope.projectId,this.params.usref).then(function(_this){return function(us){var ctx,ref,ref1;return _this.scope.us=us,_this.scope.usId=us.id,_this.scope.commentModel=us,null!=(null!=(ref=_this.scope.us.neighbors.previous)?ref.ref:void 0)&&(ctx={project:_this.scope.project.slug,ref:_this.scope.us.neighbors.previous.ref},_this.scope.previousUrl=_this.navUrls.resolve("project-userstories-detail",ctx)),null!=(null!=(ref1=_this.scope.us.neighbors.next)?ref1.ref:void 0)&&(ctx={project:_this.scope.project.slug,ref:_this.scope.us.neighbors.next.ref},_this.scope.nextUrl=_this.navUrls.resolve("project-userstories-detail",ctx)),us}}(this))},UserStoryDetailController.prototype.loadSprint=function(){return this.scope.us.milestone?this.rs.sprints.get(this.scope.us.project,this.scope.us.milestone).then(function(_this){return function(sprint){return _this.scope.sprint=sprint,sprint}}(this)):void 0},UserStoryDetailController.prototype.loadTasks=function(){return this.rs.tasks.list(this.scope.projectId,null,this.scope.usId).then(function(_this){return function(tasks){return _this.scope.tasks=tasks,tasks}}(this))},UserStoryDetailController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(project){return _this.fillUsersAndRoles(project.members,project.roles),_this.loadUs().then(function(){return _this.q.all([_this.loadSprint(),_this.loadTasks()])})}}(this))},UserStoryDetailController.prototype.onUpvote=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.loadUs(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error")}}(this),this.rs.userstories.upvote(this.scope.usId).then(onSuccess,onError)},UserStoryDetailController.prototype.onDownvote=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.loadUs(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error"); -}}(this),this.rs.userstories.downvote(this.scope.usId).then(onSuccess,onError)},UserStoryDetailController.prototype.onWatch=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.loadUs(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error")}}(this),this.rs.userstories.watch(this.scope.usId).then(onSuccess,onError)},UserStoryDetailController.prototype.onUnwatch=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.loadUs(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error")}}(this),this.rs.userstories.unwatch(this.scope.usId).then(onSuccess,onError)},UserStoryDetailController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("UserStoryDetailController",UserStoryDetailController),UsStatusDisplayDirective=function($template,$compile){var link,template;return template=$template.get("common/components/status-display.html",!0),link=function($scope,$el,$attrs){var render;return render=function(us){var html,status;return status=$scope.statusById[us.status],html=template({is_closed:us.is_closed,status:status}),html=$compile(html)($scope),$el.html(html)},$scope.$watch($attrs.ngModel,function(us){return null!=us?render(us):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgUsStatusDisplay",["$tgTemplate","$compile",UsStatusDisplayDirective]),UsStatusButtonDirective=function($rootScope,$repo,$confirm,$loading,$qqueue,$template){var link,template;return template=$template.get("us/us-status-button.html",!0),link=function($scope,$el,$attrs,$model){var isEditable,render,save;return isEditable=function(){return-1!==$scope.project.my_permissions.indexOf("modify_us")},render=function(_this){return function(us){var html,status;return status=$scope.statusById[us.status],html=template({status:status,statuses:$scope.statusList,editable:isEditable()}),$el.html(html)}}(this),save=$qqueue.bindAdd(function(_this){return function(status){var currentLoading,onError,onSuccess,us;return us=$model.$modelValue.clone(),us.status=status,$.fn.popover().closeAll(),currentLoading=$loading().target($el).start(),onSuccess=function(){return $model.$setViewValue(us),$rootScope.$broadcast("object:updated"),currentLoading.finish()},onError=function(){return $confirm.notify("error"),currentLoading.finish()},$repo.save(us).then(onSuccess,onError)}}(this)),$el.on("click",".js-edit-status",function(event){return event.preventDefault(),event.stopPropagation(),isEditable()?$el.find(".pop-status").popover().open():void 0}),$el.on("click",".status",function(event){var status,target;return event.preventDefault(),event.stopPropagation(),isEditable()?(target=angular.element(event.currentTarget),status=target.data("status-id"),save(status)):void 0}),$scope.$watch($attrs.ngModel,function(us){return us?render(us):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgUsStatusButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQqueue","$tgTemplate",UsStatusButtonDirective]),UsTeamRequirementButtonDirective=function($rootscope,$tgrepo,$confirm,$loading,$qqueue,$template,$compile){var link,template;return template=$template.get("us/us-team-requirement-button.html",!0),link=function($scope,$el,$attrs,$model){var canEdit,render,save;return canEdit=function(){return-1!==$scope.project.my_permissions.indexOf("modify_us")},render=function(us){var ctx,html;return ctx={canEdit:canEdit(),isRequired:us.team_requirement},html=template(ctx),html=$compile(html)($scope),$el.html(html)},save=$qqueue.bindAdd(function(_this){return function(team_requirement){var currentLoading,promise,us;return us=$model.$modelValue.clone(),us.team_requirement=team_requirement,currentLoading=$loading().target($el.find("label")).start(),promise=$tgrepo.save(us),promise.then(function(){return $model.$setViewValue(us),currentLoading.finish(),$rootscope.$broadcast("object:updated")}),promise.then(null,function(){return currentLoading.finish(),$confirm.notify("error")})}}(this)),$el.on("click",".team-requirement",function(event){var team_requirement;if(canEdit())return team_requirement=!$model.$modelValue.team_requirement,save(team_requirement)}),$scope.$watch($attrs.ngModel,function(us){return us?render(us):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgUsTeamRequirementButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQqueue","$tgTemplate","$compile",UsTeamRequirementButtonDirective]),UsClientRequirementButtonDirective=function($rootscope,$tgrepo,$confirm,$loading,$qqueue,$template,$compile){var link,template;return template=$template.get("us/us-client-requirement-button.html",!0),link=function($scope,$el,$attrs,$model){var canEdit,render,save;return canEdit=function(){return-1!==$scope.project.my_permissions.indexOf("modify_us")},render=function(us){var ctx,html;return ctx={canEdit:canEdit(),isRequired:us.client_requirement},html=$compile(template(ctx))($scope),$el.html(html)},save=$qqueue.bindAdd(function(_this){return function(client_requirement){var currentLoading,promise,us;return us=$model.$modelValue.clone(),us.client_requirement=client_requirement,currentLoading=$loading().target($el.find("label")).start(),promise=$tgrepo.save(us),promise.then(function(){return $model.$setViewValue(us),currentLoading.finish(),$rootscope.$broadcast("object:updated")}),promise.then(null,function(){return $confirm.notify("error")})}}(this)),$el.on("click",".client-requirement",function(event){var client_requirement;if(canEdit())return client_requirement=!$model.$modelValue.client_requirement,save(client_requirement)}),$scope.$watch($attrs.ngModel,function(us){return us?render(us):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgUsClientRequirementButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQqueue","$tgTemplate","$compile",UsClientRequirementButtonDirective])}.call(this),function(){var TaskDetailController,TaskIsIocaineButtonDirective,TaskStatusButtonDirective,TaskStatusDisplayDirective,bindMethods,groupBy,mixOf,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,groupBy=this.taiga.groupBy,bindMethods=this.taiga.bindMethods,module=angular.module("taigaTasks"),TaskDetailController=function(superClass){function TaskDetailController(scope,rootscope,repo,confirm,rs,params,q,location,log,appMetaService,navUrls,analytics,translate){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.log=log,this.appMetaService=appMetaService,this.navUrls=navUrls,this.analytics=analytics,this.translate=translate,bindMethods(this),this.scope.taskRef=this.params.taskref,this.scope.sectionName=this.translate.instant("TASK.SECTION_NAME"),this.initializeEventHandlers(),promise=this.loadInitialData(),promise.then(function(_this){return function(){return _this._setMeta(),_this.initializeOnDeleteGoToUrl()}}(this)),promise.then(null,this.onInitialDataError.bind(this))}return extend(TaskDetailController,superClass),TaskDetailController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$log","tgAppMetaService","$tgNavUrls","$tgAnalytics","$translate"],TaskDetailController.prototype._setMeta=function(){var description,ref,title;return title=this.translate.instant("TASK.PAGE_TITLE",{taskRef:"#"+this.scope.task.ref,taskSubject:this.scope.task.subject,projectName:this.scope.project.name}),description=this.translate.instant("TASK.PAGE_DESCRIPTION",{taskStatus:(null!=(ref=this.scope.statusById[this.scope.task.status])?ref.name:void 0)||"--",taskDescription:angular.element(this.scope.task.description_html||"").text()}),this.appMetaService.setAll(title,description)},TaskDetailController.prototype.initializeEventHandlers=function(){return this.scope.$on("attachment:create",function(_this){return function(){return _this.analytics.trackEvent("attachment","create","create attachment on task",1)}}(this)),this.scope.$on("custom-attributes-values:edit",function(_this){return function(){return _this.rootscope.$broadcast("object:updated")}}(this)),this.scope.$on("comment:new",function(_this){return function(){return _this.loadTask()}}(this))},TaskDetailController.prototype.initializeOnDeleteGoToUrl=function(){var ctx;if(ctx={project:this.scope.project.slug},this.scope.onDeleteGoToUrl=this.navUrls.resolve("project",ctx),this.scope.project.is_backlog_activated){if(this.scope.task.milestone)return ctx.sprint=this.scope.sprint.slug,this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-taskboard",ctx);if(this.scope.task.us)return ctx.ref=this.scope.us.ref,this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-userstories-detail",ctx)}else if(this.scope.project.is_kanban_activated&&this.scope.us)return ctx.ref=this.scope.us.ref,this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-userstories-detail",ctx)},TaskDetailController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return _this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),_this.scope.statusList=project.task_statuses,_this.scope.statusById=groupBy(project.task_statuses,function(x){return x.id}),project}}(this))},TaskDetailController.prototype.loadTask=function(){return this.rs.tasks.getByRef(this.scope.projectId,this.params.taskref).then(function(_this){return function(task){var ctx,ref,ref1;return _this.scope.task=task,_this.scope.taskId=task.id,_this.scope.commentModel=task,null!=(null!=(ref=_this.scope.task.neighbors.previous)?ref.ref:void 0)&&(ctx={project:_this.scope.project.slug,ref:_this.scope.task.neighbors.previous.ref},_this.scope.previousUrl=_this.navUrls.resolve("project-tasks-detail",ctx)),null!=(null!=(ref1=_this.scope.task.neighbors.next)?ref1.ref:void 0)&&(ctx={project:_this.scope.project.slug,ref:_this.scope.task.neighbors.next.ref},_this.scope.nextUrl=_this.navUrls.resolve("project-tasks-detail",ctx)),task}}(this))},TaskDetailController.prototype.loadSprint=function(){return this.scope.task.milestone?this.rs.sprints.get(this.scope.task.project,this.scope.task.milestone).then(function(_this){return function(sprint){return _this.scope.sprint=sprint,sprint}}(this)):void 0},TaskDetailController.prototype.loadUserStory=function(){return this.scope.task.user_story?this.rs.userstories.get(this.scope.task.project,this.scope.task.user_story).then(function(_this){return function(us){return _this.scope.us=us,us}}(this)):void 0},TaskDetailController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(project){return _this.fillUsersAndRoles(project.members,project.roles),_this.loadTask().then(function(){return _this.q.all([_this.loadSprint(),_this.loadUserStory()])})}}(this))},TaskDetailController.prototype.onUpvote=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.loadTask(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error")}}(this),this.rs.tasks.upvote(this.scope.taskId).then(onSuccess,onError)},TaskDetailController.prototype.onDownvote=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.loadTask(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error")}}(this),this.rs.tasks.downvote(this.scope.taskId).then(onSuccess,onError)},TaskDetailController.prototype.onWatch=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.loadTask(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error")}}(this),this.rs.tasks.watch(this.scope.taskId).then(onSuccess,onError)},TaskDetailController.prototype.onUnwatch=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.loadTask(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error")}}(this),this.rs.tasks.unwatch(this.scope.taskId).then(onSuccess,onError)},TaskDetailController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("TaskDetailController",TaskDetailController),TaskStatusDisplayDirective=function($template,$compile){var link,template;return template=$template.get("common/components/status-display.html",!0),link=function($scope,$el,$attrs){var render;return render=function(task){var html,status;return status=$scope.statusById[task.status],html=template({is_closed:status.is_closed,status:status}),html=$compile(html)($scope),$el.html(html)},$scope.$watch($attrs.ngModel,function(task){return null!=task?render(task):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgTaskStatusDisplay",["$tgTemplate","$compile",TaskStatusDisplayDirective]),TaskStatusButtonDirective=function($rootScope,$repo,$confirm,$loading,$qqueue,$compile,$translate,$template){var link,template;return template=$template.get("us/us-status-button.html",!0),link=function($scope,$el,$attrs,$model){var isEditable,render,save;return isEditable=function(){return-1!==$scope.project.my_permissions.indexOf("modify_task")},render=function(_this){return function(task){var html,status;return status=$scope.statusById[task.status],html=$compile(template({status:status,statuses:$scope.statusList,editable:isEditable()}))($scope),$el.html(html)}}(this),save=$qqueue.bindAdd(function(_this){return function(status){var currentLoading,onError,onSuccess,task;return task=$model.$modelValue.clone(),task.status=status,currentLoading=$loading().target($el).start(),onSuccess=function(){return $model.$setViewValue(task),$rootScope.$broadcast("object:updated"),currentLoading.finish()},onError=function(){return $confirm.notify("error"),currentLoading.finish()},$repo.save(task).then(onSuccess,onError)}}(this)),$el.on("click",".js-edit-status",function(event){return event.preventDefault(),event.stopPropagation(),isEditable()?$el.find(".pop-status").popover().open():void 0}),$el.on("click",".status",function(event){var target;return event.preventDefault(),event.stopPropagation(),isEditable()?(target=angular.element(event.currentTarget),$.fn.popover().closeAll(),save(target.data("status-id"))):void 0}),$scope.$watch($attrs.ngModel,function(task){return task?render(task):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgTaskStatusButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQqueue","$compile","$translate","$tgTemplate",TaskStatusButtonDirective]),TaskIsIocaineButtonDirective=function($rootscope,$tgrepo,$confirm,$loading,$qqueue,$compile,$template){var link,template;return template=$template.get("issue/iocaine-button.html",!0),link=function($scope,$el,$attrs,$model){var isEditable,render,save;return isEditable=function(){return-1!==$scope.project.my_permissions.indexOf("modify_task")},render=function(task){var ctx,html;return isEditable()||task.is_iocaine?(ctx={isIocaine:task.is_iocaine,isEditable:isEditable()},html=$compile(template(ctx))($scope),$el.html(html)):void $el.html("")},save=$qqueue.bindAdd(function(_this){return function(is_iocaine){var currentLoading,promise,task;return task=$model.$modelValue.clone(),task.is_iocaine=is_iocaine,currentLoading=$loading().target($el.find("label")).start(),promise=$tgrepo.save(task),promise.then(function(){return $model.$setViewValue(task),$rootscope.$broadcast("object:updated")}),promise.then(null,function(){return $confirm.notify("error")}),promise["finally"](function(){return currentLoading.finish()})}}(this)),$el.on("click",".is-iocaine",function(event){var is_iocaine;if(isEditable())return is_iocaine=!$model.$modelValue.is_iocaine,save(is_iocaine)}),$scope.$watch($attrs.ngModel,function(task){return task?render(task):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgTaskIsIocaineButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQqueue","$compile","$tgTemplate",TaskIsIocaineButtonDirective])}.call(this),function(){var LeaveProjectDirective,TeamController,TeamFiltersDirective,TeamMemberCurrentUserDirective,TeamMemberStatsDirective,TeamMembersDirective,membersFilter,mixOf,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,module=angular.module("taigaTeam"),TeamController=function(superClass){function TeamController(scope,rootscope,repo,rs,params,q,location,navUrls,appMetaService,auth,translate,projectService){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.rs=rs,this.params=params,this.q=q,this.location=location,this.navUrls=navUrls,this.appMetaService=appMetaService,this.auth=auth,this.translate=translate,this.projectService=projectService,this.scope.sectionName="TEAM.SECTION_NAME",promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,title;return title=_this.translate.instant("TEAM.PAGE_TITLE",{projectName:_this.scope.project.name}),description=_this.translate.instant("TEAM.PAGE_DESCRIPTION",{projectName:_this.scope.project.name,projectDescription:_this.scope.project.description}),_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this))}return extend(TeamController,superClass),TeamController.$inject=["$scope","$rootScope","$tgRepo","$tgResources","$routeParams","$q","$location","$tgNavUrls","tgAppMetaService","$tgAuth","$translate","tgProjectService"],TeamController.prototype.setRole=function(role){return role?this.scope.filtersRole=role:this.scope.filtersRole=null},TeamController.prototype.loadMembers=function(){var i,len,member,ref,user;for(user=this.auth.getUser(),this.scope.totals={},ref=this.scope.activeUsers,i=0,len=ref.length;len>i;i++)member=ref[i],this.scope.totals[member.id]=0;return this.scope.currentUser=_.find(this.scope.activeUsers,{id:null!=user?user.id:void 0}),this.scope.memberships=_.reject(this.scope.activeUsers,{id:null!=user?user.id:void 0})},TeamController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return _this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),_this.scope.issuesEnabled=project.is_issues_activated,_this.scope.tasksEnabled=project.is_kanban_activated||project.is_backlog_activated,_this.scope.wikiEnabled=project.is_wiki_activated,project}}(this))},TeamController.prototype.loadMemberStats=function(){return this.rs.projects.memberStats(this.scope.projectId).then(function(_this){return function(stats){var totals;return totals={},_.forEach(_this.scope.totals,function(total,userId){var vals;return vals=_.map(stats,function(memberStats,statsKey){return memberStats[userId]}),total=_.reduce(vals,function(sum,el){return sum+el}),_this.scope.totals[userId]=total}),_this.scope.stats=_this._processStats(stats),_this.scope.stats.totals=_this.scope.totals}}(this))},TeamController.prototype._processStat=function(stat){var max,min,singleStat;return max=_.max(stat),min=_.min(stat),singleStat=_.map(stat,function(value,key){return value===min?[key,.1]:value===max?[key,1]:[key,.5*value/max]}),singleStat=_.object(singleStat)},TeamController.prototype._processStats=function(stats){var key,value;for(key in stats)value=stats[key],stats[key]=this._processStat(value);return stats},TeamController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(project){return _this.fillUsersAndRoles(project.members,project.roles),_this.loadMembers(),_this.loadMemberStats()}}(this))},TeamController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("TeamController",TeamController),TeamFiltersDirective=function(){return{templateUrl:"team/team-filter.html"}},module.directive("tgTeamFilters",[TeamFiltersDirective]),TeamMemberStatsDirective=function(){return{templateUrl:"team/team-member-stats.html",scope:{stats:"=",userId:"=user",issuesEnabled:"=issuesenabled",tasksEnabled:"=tasksenabled",wikiEnabled:"=wikienabled"}}},module.directive("tgTeamMemberStats",TeamMemberStatsDirective),TeamMemberCurrentUserDirective=function(){return{templateUrl:"team/team-member-current-user.html",scope:{projectId:"=projectid",currentUser:"=currentuser",stats:"=",issuesEnabled:"=issuesenabled",tasksEnabled:"=tasksenabled",wikiEnabled:"=wikienabled"}}},module.directive("tgTeamCurrentUser",TeamMemberCurrentUserDirective),TeamMembersDirective=function(){var template;return template="team/team-members.html",{templateUrl:template,scope:{memberships:"=",filtersQ:"=filtersq",filtersRole:"=filtersrole",stats:"=",issuesEnabled:"=issuesenabled",tasksEnabled:"=tasksenabled",wikiEnabled:"=wikienabled"}}},module.directive("tgTeamMembers",TeamMembersDirective),LeaveProjectDirective=function($repo,$confirm,$location,$rs,$navurls,$translate){var link;return link=function($scope,$el,$attrs){return $scope.leave=function(){var confirm_leave_project_text,leave_project_text;return leave_project_text=$translate.instant("TEAM.ACTION_LEAVE_PROJECT"),confirm_leave_project_text=$translate.instant("TEAM.CONFIRM_LEAVE_PROJECT"),$confirm.ask(leave_project_text,confirm_leave_project_text).then(function(_this){return function(response){var promise;return promise=$rs.projects.leave($attrs.projectid),promise.then(function(){return response.finish(),$confirm.notify("success"),$location.path($navurls.resolve("home"))}),promise.then(null,function(response){return response.finish(),$confirm.notify("error",response.data._error_message)})}}(this))}},{scope:{},templateUrl:"team/leave-project.html",link:link}},module.directive("tgLeaveProject",["$tgRepo","$tgConfirm","$tgLocation","$tgResources","$tgNavUrls","$translate",LeaveProjectDirective]),membersFilter=function(){return function(members,filtersQ,filtersRole){return _.filter(members,function(m){return(!filtersRole||m.role===filtersRole.id)&&(!filtersQ||m.full_name.search(new RegExp(filtersQ,"i"))>=0)})}},module.filter("membersFilter",membersFilter)}.call(this),function(){var EditableWikiContentDirective,WikiDetailController,WikiSummaryDirective,bindOnce,debounce,groupBy,mixOf,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,groupBy=this.taiga.groupBy,bindOnce=this.taiga.bindOnce,debounce=this.taiga.debounce,module=angular.module("taigaWiki"),WikiDetailController=function(superClass){function WikiDetailController(scope,rootscope,repo,model,confirm,rs,params,q,location,filter,log,appMetaService,navUrls,analytics,translate){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.model=model,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.filter=filter,this.log=log,this.appMetaService=appMetaService,this.navUrls=navUrls,this.analytics=analytics,this.translate=translate,this.scope.projectSlug=this.params.pslug,this.scope.wikiSlug=this.params.slug,this.scope.wikiTitle=this.scope.wikiSlug,this.scope.sectionName="Wiki",this.scope.linksVisible=!1,promise=this.loadInitialData(),promise.then(function(_this){return function(){return _this._setMeta()}}(this)),promise.then(null,this.onInitialDataError.bind(this))}return extend(WikiDetailController,superClass),WikiDetailController.$inject=["$scope","$rootScope","$tgRepo","$tgModel","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$filter","$log","tgAppMetaService","$tgNavUrls","$tgAnalytics","$translate"],WikiDetailController.prototype._setMeta=function(){var description,ref,ref1,ref2,title;return title=this.translate.instant("WIKI.PAGE_TITLE",{wikiPageName:this.scope.wikiTitle,projectName:this.scope.project.name}),description=this.translate.instant("WIKI.PAGE_DESCRIPTION",{wikiPageContent:angular.element((null!=(ref=this.scope.wiki)?ref.html:void 0)||"").text(),totalEditions:(null!=(ref1=this.scope.wiki)?ref1.editions:void 0)||0,lastModifiedDate:moment(null!=(ref2=this.scope.wiki)?ref2.modified_date:void 0).format(this.translate.instant("WIKI.DATETIME"))}),this.appMetaService.setAll(title,description)},WikiDetailController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return project.is_wiki_activated||_this.location.path(_this.navUrls.resolve("permission-denied")),_this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),project}}(this))},WikiDetailController.prototype.loadWiki=function(){var promise;return promise=this.rs.wiki.getBySlug(this.scope.projectId,this.params.slug),promise.then(function(_this){return function(wiki){return _this.scope.wiki=wiki,_this.scope.wikiId=wiki.id,_this.scope.wiki}}(this)),promise.then(null,function(_this){return function(xhr){var data;return _this.scope.wikiId=null,-1===_this.scope.project.my_permissions.indexOf("add_wiki_page")?null:(data={project:_this.scope.projectId,slug:_this.scope.wikiSlug,content:""},_this.scope.wiki=_this.model.make_model("wiki",data),_this.scope.wiki)}}(this))},WikiDetailController.prototype.loadWikiLinks=function(){return this.rs.wiki.listLinks(this.scope.projectId).then(function(_this){return function(wikiLinks){var selectedWikiLink;return _this.scope.wikiLinks=wikiLinks,selectedWikiLink=_.find(wikiLinks,{href:_this.scope.wikiSlug}),null!=selectedWikiLink?_this.scope.wikiTitle=selectedWikiLink.title:void 0}}(this))},WikiDetailController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(project){return _this.fillUsersAndRoles(project.members,project.roles),_this.q.all([_this.loadWikiLinks(),_this.loadWiki()]).then(_this.checkLinksPerms.bind(_this))}}(this))},WikiDetailController.prototype.checkLinksPerms=function(){return-1!==this.scope.project.my_permissions.indexOf("modify_wiki_link")||-1!==this.scope.project.my_permissions.indexOf("view_wiki_links")&&this.scope.wikiLinks.length?this.scope.linksVisible=!0:void 0},WikiDetailController.prototype["delete"]=function(){var message,title;return title=this.translate.instant("WIKI.DELETE_LIGHTBOX_TITLE"),message=this.scope.wikiTitle,this.confirm.askOnDelete(title,message).then(function(_this){return function(askResponse){var onError,onSuccess;return onSuccess=function(){var ctx;return askResponse.finish(),ctx={project:_this.scope.projectSlug},_this.location.path(_this.navUrls.resolve("project-wiki",ctx)),_this.confirm.notify("success")},onError=function(){return askResponse.finish(!1),_this.confirm.notify("error")},_this.repo.remove(_this.scope.wiki).then(onSuccess,onError)}}(this))},WikiDetailController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("WikiDetailController",WikiDetailController),WikiSummaryDirective=function($log,$template,$compile,$translate){var link,template;return template=$template.get("wiki/wiki-summary.html",!0),link=function($scope,$el,$attrs,$model){var render;return render=function(wiki){var ctx,html,user;return null==$scope.usersById?$log.error("WikiSummaryDirective requires userById set in scope."):user=$scope.usersById[wiki.last_modifier],user=void 0===user?{name:"unknown",imgUrl:"/"+window._version+"/images/user-noimage.png"}:{name:user.full_name_display,imgUrl:user.photo},ctx={totalEditions:wiki.editions,lastModifiedDate:moment(wiki.modified_date).format($translate.instant("WIKI.DATETIME")),user:user},html=template(ctx),html=$compile(html)($scope),$el.html(html)},$scope.$watch($attrs.ngModel,function(wikiPage){return wikiPage?render(wikiPage):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgWikiSummary",["$log","$tgTemplate","$compile","$translate",WikiSummaryDirective]),EditableWikiContentDirective=function($window,$document,$repo,$confirm,$loading,$analytics,$qqueue){var link;return link=function($scope,$el,$attrs,$model){var cancelEdition,disableEdition,getSelectedText,isEditable,save,switchToEditMode,switchToReadMode;return isEditable=function(){return-1!==$scope.project.my_permissions.indexOf("modify_wiki_page")},switchToEditMode=function(){return $el.find(".edit-wiki-content").show(),$el.find(".view-wiki-content").hide(),$el.find("textarea").focus()},switchToReadMode=function(){return $el.find(".edit-wiki-content").hide(),$el.find(".view-wiki-content").show()},disableEdition=function(){return $el.find(".view-wiki-content .edit").remove(),$el.find(".edit-wiki-content").remove()},cancelEdition=function(){return $model.$modelValue.id?($scope.$apply(function(_this){return function(){return $model.$modelValue.revert()}}(this)),switchToReadMode()):void 0},getSelectedText=function(){return $window.getSelection?$window.getSelection().toString():$document.selection?$document.selection.createRange().text:null},save=$qqueue.bindAdd(function(wiki){var currentLoading,onError,onSuccess,promise;return onSuccess=function(wikiPage){return null==wiki.id&&$analytics.trackEvent("wikipage","create","create wiki page",1),$model.$setViewValue(wikiPage.clone()),$confirm.notify("success"),switchToReadMode()},onError=function(){return $confirm.notify("error")},currentLoading=$loading().removeClasses("icon-floppy").target($el.find(".icon-floppy")).start(),promise=null!=wiki.id?$repo.save(wiki).then(onSuccess,onError):$repo.create("wiki",wiki).then(onSuccess,onError),promise["finally"](function(){return currentLoading.finish()})}),$el.on("click","a",function(event){var href,target;return target=angular.element(event.target),href=target.attr("href"),0===href.indexOf("#")?(event.preventDefault(),$("body").scrollTop($(href).offset().top)):void 0}),$el.on("mousedown",".view-wiki-content",function(event){var target;target=angular.element(event.target),isEditable()&&2===event.button}),$el.on("mouseup",".view-wiki-content",function(event){var target;return target=angular.element(event.target),getSelectedText()||!isEditable()||target.is("a")||target.is("pre")?void 0:switchToEditMode()}),$el.on("click",".save",debounce(2e3,function(){return save($scope.wiki)})),$el.on("click",".cancel",function(){return cancelEdition()}),$el.on("keydown","textarea",function(event){return 27===event.keyCode?cancelEdition():void 0}),$scope.$watch($attrs.ngModel,function(wikiPage){return wikiPage?isEditable()?($el.addClass("editable"),null==wikiPage.id||0===$.trim(wikiPage.content).length?switchToEditMode():void 0):disableEdition():void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel",templateUrl:"wiki/editable-wiki-content.html" -}},module.directive("tgEditableWikiContent",["$window","$document","$tgRepo","$tgConfirm","$tgLoading","$tgAnalytics","$tgQqueue",EditableWikiContentDirective])}.call(this),function(){var WikiNavDirective,bindOnce,groupBy,mixOf,module,taiga;taiga=this.taiga,mixOf=this.taiga.mixOf,groupBy=this.taiga.groupBy,bindOnce=this.taiga.bindOnce,module=angular.module("taigaWiki"),WikiNavDirective=function($tgrepo,$log,$location,$confirm,$navUrls,$analytics,$loading,$template,$compile,$translate){var link,template;return template=$template.get("wiki/wiki-nav.html",!0),link=function($scope,$el,$attrs){var $ctrl,render;return $ctrl=$el.controller(),null==$attrs.ngModel?$log.error("WikiNavDirective: no ng-model attr is defined"):(render=function(wikiLinks){var addWikiLinkPermission,deleteWikiLinkPermission,html;return addWikiLinkPermission=$scope.project.my_permissions.indexOf("add_wiki_link")>-1,deleteWikiLinkPermission=$scope.project.my_permissions.indexOf("delete_wiki_link")>-1,html=template({wikiLinks:wikiLinks,projectSlug:$scope.projectSlug,addWikiLinkPermission:addWikiLinkPermission,deleteWikiLinkPermission:deleteWikiLinkPermission}),html=$compile(html)($scope),$el.off(),$el.html(html),$el.on("click",".wiki-link .link-title",function(event){var linkId,linkSlug,target;return event.preventDefault(),target=angular.element(event.currentTarget),linkId=target.parents(".wiki-link").data("id"),linkSlug=$scope.wikiLinks[linkId].href,$scope.$apply(function(){var ctx;return ctx={project:$scope.projectSlug,slug:linkSlug},$location.path($navUrls.resolve("project-wiki-page",ctx))})}),$el.on("click",".add-button",function(event){return event.preventDefault(),$el.find(".new").removeClass("hidden"),$el.find(".new input").focus(),$el.find(".add-button").hide()}),$el.on("click",".wiki-link .icon-delete",function(event){var linkId,message,target,title;return event.preventDefault(),event.stopPropagation(),target=angular.element(event.currentTarget),linkId=target.parents(".wiki-link").data("id"),title=$translate.instant("WIKI.DELETE_LIGHTBOX_TITLE"),message=$scope.wikiLinks[linkId].title,$confirm.askOnDelete(title,message).then(function(_this){return function(askResponse){var promise;return promise=$tgrepo.remove($scope.wikiLinks[linkId]),promise.then(function(){return promise=$ctrl.loadWikiLinks(),promise.then(function(){return askResponse.finish(),render($scope.wikiLinks)}),promise.then(null,function(){return askResponse.finish()})}),promise.then(null,function(){return askResponse.finish(!1),$confirm.notify("error")})}}(this))}),$el.on("keyup",".new input",function(event){var currentLoading,newLink,promise,target;return event.preventDefault(),13===event.keyCode?(target=angular.element(event.currentTarget),newLink=target.val(),currentLoading=$loading().target($el.find(".new")).start(),promise=$tgrepo.create("wiki-links",{project:$scope.projectId,title:newLink}),promise.then(function(){var loadPromise;return $analytics.trackEvent("wikilink","create","create wiki link",1),loadPromise=$ctrl.loadWikiLinks(),loadPromise.then(function(){return currentLoading.finish(),$el.find(".new").addClass("hidden"),$el.find(".new input").val(""),$el.find(".add-button").show(),render($scope.wikiLinks)}),loadPromise.then(null,function(){return currentLoading.finish(),$el.find(".new").addClass("hidden"),$el.find(".new input").val(""),$el.find(".add-button").show(),$confirm.notify("error","Error loading wiki links")})}),promise.then(null,function(error){var ref;return currentLoading.finish(),$el.find(".new input").val(newLink),$el.find(".new input").focus().select(),null!=(null!=error&&null!=(ref=error.__all__)?ref[0]:void 0)?$confirm.notify("error","The link already exists"):$confirm.notify("error")})):27===event.keyCode?(target=angular.element(event.currentTarget),$el.find(".new").addClass("hidden"),$el.find(".new input").val(""),$el.find(".add-button").show()):void 0})},bindOnce($scope,$attrs.ngModel,render))},{link:link}},module.directive("tgWikiNav",["$tgRepo","$log","$tgLocation","$tgConfirm","$tgNavUrls","$tgAnalytics","$tgLoading","$tgTemplate","$compile","$translate",WikiNavDirective])}.call(this),function(){var CreateMembersDirective,MAX_MEMBERSHIP_FIELDSETS,debounce,module,taiga;taiga=this.taiga,debounce=this.taiga.debounce,module=angular.module("taigaKanban"),MAX_MEMBERSHIP_FIELDSETS=4,CreateMembersDirective=function($rs,$rootScope,$confirm,$loading,lightboxService,$compile){var extraTextTemplate,link,template;return extraTextTemplate='
\n \n
',template=_.template('
\n
\n data-required="true" <% } %> data-type="email" />\n
\n
\n \n \n
\n
'),link=function($scope,$el,$attrs){var createFieldSet,resetForm,submit,submitButton;return createFieldSet=function(required){var ctx;return null==required&&(required=!0),ctx={roleList:$scope.project.roles,required:required},$compile(template(ctx))($scope)},resetForm=function(){var fieldSet,invitations;return $el.find("form textarea").remove(),$el.find("form .add-member-wrapper").remove(),invitations=$el.find(".add-member-forms"),invitations.html($compile(extraTextTemplate)($scope)),fieldSet=createFieldSet(),invitations.prepend(fieldSet)},$scope.$on("membersform:new",function(){return resetForm(),lightboxService.open($el)}),$scope.$on("$destroy",function(){return $el.off()}),$el.on("click",".delete-fieldset",function(event){var fieldSet,lastActionButton,target;return event.preventDefault(),target=angular.element(event.currentTarget),fieldSet=target.closest(".add-member-wrapper"),fieldSet.remove(),lastActionButton=$el.find(".add-member-wrapper fieldset:last > a"),lastActionButton.hasClass("icon-delete delete-fieldset")?lastActionButton.removeClass("icon-delete delete-fieldset").addClass("icon-plus add-fieldset"):void 0}),$el.on("click",".add-fieldset",function(event){var fieldSet,newFieldSet,target;return event.preventDefault(),target=angular.element(event.currentTarget),fieldSet=target.closest(".add-member-wrapper"),target.removeClass("icon-plus add-fieldset").addClass("icon-delete delete-fieldset"),newFieldSet=createFieldSet(!1),fieldSet.after(newFieldSet),$scope.$digest(),$el.find(".add-member-wrapper").length===MAX_MEMBERSHIP_FIELDSETS?$el.find(".add-member-wrapper fieldset:last > a").removeClass("icon-plus add-fieldset").addClass("icon-delete delete-fieldset"):void 0}),submit=debounce(2e3,function(_this){return function(event){var currentLoading,form,invitation_extra_text,invitations,memberWrappers,onError,onSuccess,promise;return event.preventDefault(),currentLoading=$loading().target(submitButton).start(),onSuccess=function(data){return currentLoading.finish(),lightboxService.close($el),$confirm.notify("success"),$rootScope.$broadcast("membersform:new:success")},onError=function(data){return currentLoading.finish(),lightboxService.close($el),$confirm.notify("error"),$rootScope.$broadcast("membersform:new:error")},form=$el.find("form").checksley(),form.destroy(),form.initialize(),form.validate()?(memberWrappers=$el.find("form .add-member-wrapper"),memberWrappers=_.filter(memberWrappers,function(mw){return angular.element(mw).find("input").hasClass("checksley-ok")}),invitations=_.map(memberWrappers,function(mw){var email,memberWrapper,role;return memberWrapper=angular.element(mw),email=memberWrapper.find("input"),role=memberWrapper.find("select"),{email:email.val(),role_id:role.val()}}),invitations.length?(invitation_extra_text=$el.find("form textarea").val(),promise=$rs.memberships.bulkCreateMemberships($scope.project.id,invitations,invitation_extra_text),promise.then(onSuccess,onError)):void 0):void 0}}(this)),submitButton=$el.find(".submit-button"),$el.on("submit","form",submit)},{link:link}},module.directive("tgLbCreateMembers",["$tgResources","$rootScope","$tgConfirm","$tgLoading","lightboxService","$compile",CreateMembersDirective])}.call(this),function(){var MembershipsController,MembershipsDirective,MembershipsRowActionsDirective,MembershipsRowAdminCheckboxDirective,MembershipsRowAvatarDirective,MembershipsRowRoleSelectorDirective,bindMethods,mixOf,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,bindMethods=this.taiga.bindMethods,module=angular.module("taigaAdmin"),MembershipsController=function(superClass){function MembershipsController(scope,rootscope,repo,confirm,rs,params,q,location,navUrls,analytics,appMetaService,translate){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.navUrls=navUrls,this.analytics=analytics,this.appMetaService=appMetaService,this.translate=translate,bindMethods(this),this.scope.project={},this.scope.filters={},promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,title;return title=_this.translate.instant("ADMIN.MEMBERSHIPS.PAGE_TITLE",{projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this)),this.scope.$on("membersform:new:success",function(_this){return function(){return _this.loadMembers(),_this.analytics.trackEvent("membership","create","create memberships on admin",1)}}(this))}return extend(MembershipsController,superClass),MembershipsController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAnalytics","tgAppMetaService","$translate"],MembershipsController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return project.i_am_owner||_this.location.path(_this.navUrls.resolve("permission-denied")),_this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),project}}(this))},MembershipsController.prototype.loadMembers=function(){var httpFilters;return httpFilters=this.getUrlFilters(),this.rs.memberships.list(this.scope.projectId,httpFilters).then(function(_this){return function(data){return _this.scope.memberships=_.filter(data.models,function(membership){return null===membership.user||membership.is_user_active}),_this.scope.page=data.current,_this.scope.count=data.count,_this.scope.paginatedBy=data.paginatedBy,data}}(this))},MembershipsController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(){return _this.loadMembers()}}(this)),promise},MembershipsController.prototype.getUrlFilters=function(){var filters;return filters=_.pick(this.location.search(),"page"),filters.page||(filters.page=1),filters},MembershipsController.prototype.addNewMembers=function(){return this.rootscope.$broadcast("membersform:new")},MembershipsController}(mixOf(taiga.Controller,taiga.PageMixin,taiga.FiltersMixin)),module.controller("MembershipsController",MembershipsController),MembershipsDirective=function($template,$compile){var link,linkPagination,template;return template=$template.get("admin/admin-membership-paginator.html",!0),linkPagination=function($scope,$el,$attrs,$ctrl){var $pagEl,afterCurrent,atBegin,atEnd,beforeCurrent,getNumPages,renderPagination;return afterCurrent=2,beforeCurrent=4,atBegin=2,atEnd=2,$pagEl=$el.find(".memberships-paginator"),getNumPages=function(){var numPages;return numPages=$scope.count/$scope.paginatedBy,numPages=parseInt(numPages,10)=numPages)return void $pagEl.hide();for(pages=[],options={},options.pages=pages,options.showPrevious=$scope.page>1,options.showNext=!($scope.page===numPages),cpage=$scope.page,i=j=1,ref=numPages;ref>=1?ref>=j:j>=ref;i=ref>=1?++j:--j)i===cpage+afterCurrent&&numPages>cpage+afterCurrent+atEnd?pages.push({classes:"dots",type:"dots"}):i===cpage-beforeCurrent&&cpage>atBegin+beforeCurrent?pages.push({classes:"dots",type:"dots"}):i>cpage+afterCurrent&&numPages-atEnd>=i||cpage-beforeCurrent>i&&i>atBegin||(i===cpage?pages.push({classes:"active",num:i,type:"page-active"}):pages.push({classes:"page",num:i,type:"page"}));return html=template(options),html=$compile(html)($scope),$pagEl.html(html),$pagEl.show()},$scope.$watch("memberships",function(value){return value?renderPagination():void 0}),$el.on("click",".memberships-paginator a.next",function(event){return event.preventDefault(),$scope.$apply(function(){return $ctrl.selectFilter("page",$scope.page+1),$ctrl.loadMembers()})}),$el.on("click",".memberships-paginator a.previous",function(event){return event.preventDefault(),$scope.$apply(function(){return $ctrl.selectFilter("page",$scope.page-1),$ctrl.loadMembers()})}),$el.on("click",".memberships-paginator li.page > a",function(event){var pagenum,target;return event.preventDefault(),target=angular.element(event.currentTarget),pagenum=target.data("pagenum"),$scope.$apply(function(){return $ctrl.selectFilter("page",pagenum),$ctrl.loadMembers()})})},link=function($scope,$el,$attrs){var $ctrl;return $ctrl=$el.controller(),linkPagination($scope,$el,$attrs,$ctrl),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgMemberships",["$tgTemplate","$compile",MembershipsDirective]),MembershipsRowAvatarDirective=function($log,$template,$translate){var link,template;return template=$template.get("admin/memberships-row-avatar.html",!0),link=function($scope,$el,$attrs){var member,pending,render;return pending=$translate.instant("ADMIN.MEMBERSHIP.STATUS_PENDING"),render=function(member){var ctx,html;return ctx={full_name:member.full_name?member.full_name:"",email:member.user_email?member.user_email:member.email,imgurl:member.photo?member.photo:"/"+window._version+"/images/unnamed.png",pending:member.is_user_active?"":pending},html=template(ctx),$el.html(html)},null==$attrs.tgMembershipsRowAvatar?$log.error("MembershipsRowAvatarDirective: the directive need a member"):(member=$scope.$eval($attrs.tgMembershipsRowAvatar),render(member),$scope.$on("$destroy",function(){return $el.off()}))},{link:link}},module.directive("tgMembershipsRowAvatar",["$log","$tgTemplate","$translate",MembershipsRowAvatarDirective]),MembershipsRowAdminCheckboxDirective=function($log,$repo,$confirm,$template,$compile){var link,template;return template=$template.get("admin/admin-memberships-row-checkbox.html",!0),link=function($scope,$el,$attrs){var html,member,render;return render=function(member){var ctx,html;return ctx={inputId:"is-admin-"+member.id},html=template(ctx),html=$compile(html)($scope),$el.html(html)},null==$attrs.tgMembershipsRowAdminCheckbox?$log.error("MembershipsRowAdminCheckboxDirective: the directive need a member"):(member=$scope.$eval($attrs.tgMembershipsRowAdminCheckbox),html=render(member),member.is_owner&&$el.find(":checkbox").prop("checked",!0),$el.on("click",":checkbox",function(_this){return function(event){var onError,onSuccess,target;return onSuccess=function(){return $confirm.notify("success")},onError=function(data){return member.revert(),$el.find(":checkbox").prop("checked",member.is_owner),$confirm.notify("error",data.is_owner[0])},target=angular.element(event.currentTarget),member.is_owner=target.prop("checked"),$repo.save(member).then(onSuccess,onError)}}(this)),$scope.$on("$destroy",function(){return $el.off()}))},{link:link}},module.directive("tgMembershipsRowAdminCheckbox",["$log","$tgRepo","$tgConfirm","$tgTemplate","$compile",MembershipsRowAdminCheckboxDirective]),MembershipsRowRoleSelectorDirective=function($log,$repo,$confirm){var link,template;return template=_.template(''),link=function($scope,$el,$attrs){var $ctrl,html,member,render;return render=function(member){var ctx,html;return ctx={roleList:$scope.project.roles,selectedRole:member.role},html=template(ctx),$el.html(html)},null==$attrs.tgMembershipsRowRoleSelector?$log.error("MembershipsRowRoleSelectorDirective: the directive need a member"):($ctrl=$el.controller(),member=$scope.$eval($attrs.tgMembershipsRowRoleSelector),html=render(member),$el.on("change","select",function(_this){return function(event){var newRole,onError,onSuccess,target;return onSuccess=function(){return $confirm.notify("success")},onError=function(){return $confirm.notify("error")},target=angular.element(event.currentTarget),newRole=parseInt(target.val(),10),member.role!==newRole?(member.role=newRole,$repo.save(member).then(onSuccess,onError)):void 0}}(this)),$scope.$on("$destroy",function(){return $el.off()}))},{link:link}},module.directive("tgMembershipsRowRoleSelector",["$log","$tgRepo","$tgConfirm",MembershipsRowRoleSelectorDirective]),MembershipsRowActionsDirective=function($log,$repo,$rs,$confirm,$compile,$translate){var activedTemplate,link,pendingTemplate;return activedTemplate='
\n
\n\n \n',pendingTemplate='\n\n\n \n',link=function($scope,$el,$attrs){var $ctrl,member,render;return render=function(member){var html;return html=member.user?$compile(activedTemplate)($scope):$compile(pendingTemplate)($scope),$el.html(html)},null==$attrs.tgMembershipsRowActions?$log.error("MembershipsRowActionsDirective: the directive need a member"):($ctrl=$el.controller(),member=$scope.$eval($attrs.tgMembershipsRowActions),render(member),$el.on("click",".js-resend",function(event){var onError,onSuccess;return event.preventDefault(),onSuccess=function(){var text;return text=$translate.instant("ADMIN.MEMBERSHIP.SUCCESS_SEND_INVITATION",{email:$scope.member.email}),$confirm.notify("success",text)},onError=function(){var text;return text=$translate.instant("ADMIM.MEMBERSHIP.ERROR_SEND_INVITATION"),$confirm.notify("error",text)},$rs.memberships.resendInvitation($scope.member.id).then(onSuccess,onError)}),$el.on("click",".delete",function(event){var defaultMsg,message,title;return event.preventDefault(),title=$translate.instant("ADMIN.MEMBERSHIP.DELETE_MEMBER"),defaultMsg=$translate.instant("ADMIN.MEMBERSHIP.DEFAULT_DELETE_MESSAGE",{email:member.email}),message=member.user?member.full_name:defaultMsg,$confirm.askOnDelete(title,message).then(function(askResponse){var onError,onSuccess;return onSuccess=function(_this){return function(){var text;return askResponse.finish(),$scope.page>1&&$scope.count-1<=$scope.paginatedBy&&$ctrl.selectFilter("page",$scope.page-1),$ctrl.loadMembers(),text=$translate.instant("ADMIN.MEMBERSHIP.SUCCESS_DELETE"),$confirm.notify("success",null,text)}}(this),onError=function(_this){return function(){var text;return askResponse.finish(!1),text=$translate.instant("ADMIN.MEMBERSHIP.ERROR_DELETE",{message:message}),$confirm.notify("error",null,text)}}(this),$repo.remove(member).then(onSuccess,onError)})}),$scope.$on("$destroy",function(){return $el.off()}))},{link:link}},module.directive("tgMembershipsRowActions",["$log","$tgRepo","$tgResources","$tgConfirm","$compile","$translate",MembershipsRowActionsDirective])}.call(this),function(){var AdminNavigationDirective,module;AdminNavigationDirective=function(){var link;return link=function($scope,$el,$attrs){var section;return section=$attrs.tgAdminNavigation,$el.find(".active").removeClass("active"),$el.find("#adminmenu-"+section+" a").addClass("active"),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module=angular.module("taigaAdmin"),module.directive("tgAdminNavigation",AdminNavigationDirective)}.call(this),function(){var CsvExporterController,CsvExporterIssuesController,CsvExporterTasksController,CsvExporterUserstoriesController,CsvIssueDirective,CsvTaskDirective,CsvUsDirective,ProjectDefaultValuesDirective,ProjectExportDirective,ProjectLogoDirective,ProjectLogoModelDirective,ProjectModulesDirective,ProjectProfileController,ProjectProfileDirective,bindOnce,debounce,groupBy,joinStr,mixOf,module,taiga,toString,trim,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty,bind=function(fn,me){return function(){return fn.apply(me,arguments)}};taiga=this.taiga,mixOf=this.taiga.mixOf,trim=this.taiga.trim,toString=this.taiga.toString,joinStr=this.taiga.joinStr,groupBy=this.taiga.groupBy,bindOnce=this.taiga.bindOnce,debounce=this.taiga.debounce,module=angular.module("taigaAdmin"),ProjectProfileController=function(superClass){function ProjectProfileController(scope,rootscope,repo,confirm,rs,params,q,location,navUrls,appMetaService,translate){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.navUrls=navUrls,this.appMetaService=appMetaService,this.translate=translate,this.scope.project={},promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,sectionName,title;return sectionName=_this.translate.instant(_this.scope.sectionName),title=_this.translate.instant("ADMIN.PROJECT_PROFILE.PAGE_TITLE",{sectionName:sectionName,projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this)),this.scope.$on("project:loaded",function(_this){return function(){var description,sectionName,title;return sectionName=_this.translate.instant(_this.scope.sectionName),title=_this.translate.instant("ADMIN.PROJECT_PROFILE.PAGE_TITLE",{sectionName:sectionName,projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this))}return extend(ProjectProfileController,superClass),ProjectProfileController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","tgAppMetaService","$translate"],ProjectProfileController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return project.i_am_owner||_this.location.path(_this.navUrls.resolve("permission-denied")),_this.scope.projectId=project.id,_this.scope.project=project,_this.scope.pointsList=_.sortBy(project.points,"order"),_this.scope.usStatusList=_.sortBy(project.us_statuses,"order"),_this.scope.taskStatusList=_.sortBy(project.task_statuses,"order"),_this.scope.prioritiesList=_.sortBy(project.priorities,"order"),_this.scope.severitiesList=_.sortBy(project.severities,"order"),_this.scope.issueTypesList=_.sortBy(project.issue_types,"order"),_this.scope.issueStatusList=_.sortBy(project.issue_statuses,"order"),_this.scope.$emit("project:loaded",project),project}}(this))},ProjectProfileController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject()},ProjectProfileController.prototype.openDeleteLightbox=function(){return this.rootscope.$broadcast("deletelightbox:new",this.scope.project)},ProjectProfileController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("ProjectProfileController",ProjectProfileController),ProjectProfileDirective=function($repo,$confirm,$loading,$navurls,$location,projectService,currentUserService){var link;return link=function($scope,$el,$attrs){var $ctrl,form,submit,submitButton;return $ctrl=$el.controller(),form=$el.find("form").checksley({onlyOneErrorElement:!0}),submit=debounce(2e3,function(_this){return function(event){var currentLoading,promise;return event.preventDefault(),form.validate()?(currentLoading=$loading().target(submitButton).start(),promise=$repo.save($scope.project),promise.then(function(){var newUrl;return currentLoading.finish(),$confirm.notify("success"),newUrl=$navurls.resolve("project-admin-project-profile-details",{project:$scope.project.slug}),$location.path(newUrl),$ctrl.loadInitialData(),projectService.fetchProject(),currentUserService.loadProjects()}),promise.then(null,function(data){return currentLoading.finish(),form.setErrors(data),data._error_message?$confirm.notify("error",data._error_message):void 0})):void 0}}(this)),submitButton=$el.find(".submit-button"),$el.on("submit","form",submit)},{link:link}},module.directive("tgProjectProfile",["$tgRepo","$tgConfirm","$tgLoading","$tgNavUrls","$tgLocation","tgProjectService","tgCurrentUserService",ProjectProfileDirective]),ProjectDefaultValuesDirective=function($repo,$confirm,$loading){var link;return link=function($scope,$el,$attrs){var form,submit,submitButton;return form=$el.find("form").checksley({onlyOneErrorElement:!0}),submit=debounce(2e3,function(_this){return function(event){var currentLoading,promise;return event.preventDefault(),form.validate()?(currentLoading=$loading().target(submitButton).start(),promise=$repo.save($scope.project),promise.then(function(){return currentLoading.finish(),$confirm.notify("success")}),promise.then(null,function(data){return currentLoading.finish(),form.setErrors(data),data._error_message?$confirm.notify("error",data._error_message):void 0})):void 0}}(this)),submitButton=$el.find(".submit-button"),$el.on("submit","form",submit),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgProjectDefaultValues",["$tgRepo","$tgConfirm","$tgLoading",ProjectDefaultValuesDirective]),ProjectModulesDirective=function($repo,$confirm,$loading,projectService){var link;return link=function($scope,$el,$attrs){var submit;return submit=function(_this){return function(){var currentLoading,form,promise,target;return form=$el.find("form").checksley(),form.validate()?(target=angular.element(".admin-functionalities .submit-button"),currentLoading=$loading().target(target).start(),promise=$repo.save($scope.project),promise.then(function(){return currentLoading.finish(),$confirm.notify("success"),$scope.$emit("project:loaded",$scope.project),projectService.fetchProject()}),promise.then(null,function(data){return currentLoading.finish(),$confirm.notify("error",data._error_message)})):void 0}}(this),$el.on("submit","form",function(event){return event.preventDefault(),submit()}),$el.on("click",".admin-functionalities a.button-green",function(event){return event.preventDefault(),submit()}),$scope.$watch("isVideoconferenceActivated",function(isVideoconferenceActivated){return isVideoconferenceActivated?$el.find(".videoconference-attributes").removeClass("hidden"):($el.find(".videoconference-attributes").addClass("hidden"),$scope.project.videoconferences=null,$scope.project.videoconferences_extra_data="")}),$scope.$watch("project",function(project){return null!=project.videoconferences?$scope.isVideoconferenceActivated=!0:$scope.isVideoconferenceActivated=!1})},{link:link}},module.directive("tgProjectModules",["$tgRepo","$tgConfirm","$tgLoading","tgProjectService",ProjectModulesDirective]),ProjectExportDirective=function($window,$rs,$confirm,$translate){var link;return link=function($scope,$el,$attrs){var asyn_message,buttonsEl,dump_ready_text,hideButtons,hideResult,hideSpinner,loading_msg,loading_title,resultEl,resultMessageEl,resultTitleEl,setAsyncMessage,setAsyncTitle,setLoadingMessage,setLoadingTitle,setSyncMessage,setSyncTitle,showButtons,showErrorMode,showExportResultAsyncMode,showExportResultSyncMode,showLoadingMode,showResult,showSpinner,spinnerEl,syn_message;return buttonsEl=$el.find(".admin-project-export-buttons"),showButtons=function(){return buttonsEl.removeClass("hidden")},hideButtons=function(){return buttonsEl.addClass("hidden")},resultEl=$el.find(".admin-project-export-result"),showResult=function(){return resultEl.removeClass("hidden")},hideResult=function(){return resultEl.addClass("hidden")},spinnerEl=$el.find(".spin"),showSpinner=function(){return spinnerEl.removeClass("hidden")},hideSpinner=function(){return spinnerEl.addClass("hidden")},resultTitleEl=$el.find(".result-title"),loading_title=$translate.instant("ADMIN.PROJECT_EXPORT.LOADING_TITLE"),loading_msg=$translate.instant("ADMIN.PROJECT_EXPORT.LOADING_MESSAGE"),dump_ready_text=function(){return resultTitleEl.html($translate.instant("ADMIN.PROJECT_EXPORT.DUMP_READY"))},asyn_message=function(){return resultTitleEl.html($translate.instant("ADMIN.PROJECT_EXPORT.ASYNC_MESSAGE"))},syn_message=function(url){return resultTitleEl.html($translate.instant("ADMIN.PROJECT_EXPORT.SYNC_MESSAGE",{url:url}))},setLoadingTitle=function(){return resultTitleEl.html(loading_title)},setAsyncTitle=function(){return resultTitleEl.html(loading_msg)},setSyncTitle=function(){return resultTitleEl.html(dump_ready_text)},resultMessageEl=$el.find(".result-message "),setLoadingMessage=function(){return resultMessageEl.html(loading_msg)},setAsyncMessage=function(){return resultMessageEl.html(asyn_message)},setSyncMessage=function(url){return resultMessageEl.html(syn_message(url))},showLoadingMode=function(){return showSpinner(),setLoadingTitle(),setLoadingMessage(),hideButtons(),showResult()},showExportResultAsyncMode=function(){return hideSpinner(),setAsyncTitle(),setAsyncMessage()},showExportResultSyncMode=function(url){return hideSpinner(),setSyncTitle(),setSyncMessage(url)},showErrorMode=function(){return hideSpinner(),hideResult(),showButtons()},$el.on("click","a.button-export",debounce(2e3,function(_this){return function(event){var onError,onSuccess;return event.preventDefault(),onSuccess=function(result){var dumpUrl;return 202===result.status?showExportResultAsyncMode():(dumpUrl=result.data.url,showExportResultSyncMode(dumpUrl),$window.open(dumpUrl,"_blank"))},onError=function(result){var errorMsg,ref;return showErrorMode(),errorMsg=$translate.instant("ADMIN.PROJECT_EXPORT.ERROR"),429===result.status?errorMsg=$translate.instant("ADMIN.PROJECT_EXPORT.ERROR_BUSY"):(null!=(ref=result.data)?ref._error_message:void 0)&&(errorMsg=$translate.instant("ADMIN.PROJECT_EXPORT.ERROR_BUSY",{message:result.data._error_message})),$confirm.notify("error",errorMsg)},showLoadingMode(),$rs.projects["export"]($scope.projectId).then(onSuccess,onError)}}(this)))},{link:link}},module.directive("tgProjectExport",["$window","$tgResources","$tgConfirm","$translate",ProjectExportDirective]),CsvExporterController=function(superClass){function CsvExporterController(scope,rootscope,urls,confirm,rs,translate){this.scope=scope,this.rootscope=rootscope,this.urls=urls,this.confirm=confirm,this.rs=rs,this.translate=translate,this._generateUuid=bind(this._generateUuid,this),this.setCsvUuid=bind(this.setCsvUuid,this), -this.rootscope.$on("project:loaded",this.setCsvUuid),this.scope.$watch("csvUuid",function(_this){return function(value){return value?_this.scope.csvUrl=_this.urls.resolveAbsolute(_this.type+"-csv",value):_this.scope.csvUrl=""}}(this))}return extend(CsvExporterController,superClass),CsvExporterController.$inject=["$scope","$rootScope","$tgUrls","$tgConfirm","$tgResources","$translate"],CsvExporterController.prototype.setCsvUuid=function(){return this.scope.csvUuid=this.scope.project[this.type+"_csv_uuid"]},CsvExporterController.prototype._generateUuid=function(response){var promise;return null==response&&(response=null),promise=this.rs.projects["regenerate_"+this.type+"_csv_uuid"](this.scope.projectId),promise.then(function(_this){return function(data){var ref;return _this.scope.csvUuid=null!=(ref=data.data)?ref.uuid:void 0}}(this)),promise.then(null,function(_this){return function(){return _this.confirm.notify("error")}}(this)),promise["finally"](function(){return response?response.finish():void 0}),promise},CsvExporterController.prototype.regenerateUuid=function(){var subtitle,title;return this.scope.csvUuid?(title=this.translate.instant("ADMIN.REPORTS.REGENERATE_TITLE"),subtitle=this.translate.instant("ADMIN.REPORTS.REGENERATE_SUBTITLE"),this.confirm.ask(title,subtitle).then(this._generateUuid)):this._generateUuid()},CsvExporterController}(taiga.Controller),CsvExporterUserstoriesController=function(superClass){function CsvExporterUserstoriesController(){return CsvExporterUserstoriesController.__super__.constructor.apply(this,arguments)}return extend(CsvExporterUserstoriesController,superClass),CsvExporterUserstoriesController.prototype.type="userstories",CsvExporterUserstoriesController}(CsvExporterController),CsvExporterTasksController=function(superClass){function CsvExporterTasksController(){return CsvExporterTasksController.__super__.constructor.apply(this,arguments)}return extend(CsvExporterTasksController,superClass),CsvExporterTasksController.prototype.type="tasks",CsvExporterTasksController}(CsvExporterController),CsvExporterIssuesController=function(superClass){function CsvExporterIssuesController(){return CsvExporterIssuesController.__super__.constructor.apply(this,arguments)}return extend(CsvExporterIssuesController,superClass),CsvExporterIssuesController.prototype.type="issues",CsvExporterIssuesController}(CsvExporterController),module.controller("CsvExporterUserstoriesController",CsvExporterUserstoriesController),module.controller("CsvExporterTasksController",CsvExporterTasksController),module.controller("CsvExporterIssuesController",CsvExporterIssuesController),CsvUsDirective=function($translate){var link;return link=function($scope){return $scope.sectionTitle="ADMIN.CSV.SECTION_TITLE_US"},{controller:"CsvExporterUserstoriesController",controllerAs:"ctrl",templateUrl:"admin/project-csv.html",link:link,scope:!0}},module.directive("tgCsvUs",["$translate",CsvUsDirective]),CsvTaskDirective=function($translate){var link;return link=function($scope){return $scope.sectionTitle="ADMIN.CSV.SECTION_TITLE_TASK"},{controller:"CsvExporterTasksController",controllerAs:"ctrl",templateUrl:"admin/project-csv.html",link:link,scope:!0}},module.directive("tgCsvTask",["$translate",CsvTaskDirective]),CsvIssueDirective=function($translate){var link;return link=function($scope){return $scope.sectionTitle="ADMIN.CSV.SECTION_TITLE_ISSUE"},{controller:"CsvExporterIssuesController",controllerAs:"ctrl",templateUrl:"admin/project-csv.html",link:link,scope:!0}},module.directive("tgCsvIssue",["$translate",CsvIssueDirective]),ProjectLogoDirective=function($auth,$model,$rs,$confirm){var link;return link=function($scope,$el,$attrs){var onError,onSuccess,showSizeInfo;return showSizeInfo=function(){return $el.find(".size-info").addClass("active")},onSuccess=function(response){var project;return project=$model.make_model("projects",response.data),$scope.project=project,$el.find(".loading-overlay").removeClass("active"),$confirm.notify("success")},onError=function(response){return 413===response.status&&showSizeInfo(),$el.find(".loading-overlay").removeClass("active"),$confirm.notify("error",response.data._error_message)},$el.on("click",".js-change-logo",function(){return $el.find("#logo-field").click()}),$el.on("change","#logo-field",function(event){return $scope.logoAttachment?($el.find(".loading-overlay").addClass("active"),$rs.projects.changeLogo($scope.project.id,$scope.logoAttachment).then(onSuccess,onError)):void 0}),$el.on("click","a.js-use-default-logo",function(event){return $el.find(".loading-overlay").addClass("active"),$rs.projects.removeLogo($scope.project.id).then(onSuccess,onError)}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgProjectLogo",["$tgAuth","$tgModel","$tgResources","$tgConfirm",ProjectLogoDirective]),ProjectLogoModelDirective=function($parse){var link;return link=function($scope,$el,$attrs){var model,modelSetter;return model=$parse($attrs.tgProjectLogoModel),modelSetter=model.assign,$el.bind("change",function(){return $scope.$apply(function(){return modelSetter($scope,$el[0].files[0])})})},{link:link}},module.directive("tgProjectLogoModel",["$parse",ProjectLogoModelDirective])}.call(this),function(){var ColorSelectionDirective,DATE_TYPE,MULTILINE_TYPE,ProjectCustomAttributesController,ProjectCustomAttributesDirective,ProjectValuesController,ProjectValuesDirective,ProjectValuesSectionController,TEXT_TYPE,TYPE_CHOICES,bindOnce,debounce,groupBy,joinStr,mixOf,module,taiga,toString,trim,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty,bind=function(fn,me){return function(){return fn.apply(me,arguments)}};taiga=this.taiga,mixOf=this.taiga.mixOf,trim=this.taiga.trim,toString=this.taiga.toString,joinStr=this.taiga.joinStr,groupBy=this.taiga.groupBy,bindOnce=this.taiga.bindOnce,debounce=this.taiga.debounce,module=angular.module("taigaAdmin"),ProjectValuesSectionController=function(superClass){function ProjectValuesSectionController(scope,rootscope,repo,confirm,rs,params,q,location,navUrls,appMetaService,translate){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.navUrls=navUrls,this.appMetaService=appMetaService,this.translate=translate,this.scope.project={},promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,sectionName,title;return sectionName=_this.translate.instant(_this.scope.sectionName),title=_this.translate.instant("ADMIN.PROJECT_VALUES.PAGE_TITLE",{sectionName:sectionName,projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this))}return extend(ProjectValuesSectionController,superClass),ProjectValuesSectionController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","tgAppMetaService","$translate"],ProjectValuesSectionController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return project.i_am_owner||_this.location.path(_this.navUrls.resolve("permission-denied")),_this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),project}}(this))},ProjectValuesSectionController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject()},ProjectValuesSectionController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("ProjectValuesSectionController",ProjectValuesSectionController),ProjectValuesController=function(superClass){function ProjectValuesController(scope,rootscope,repo,confirm,rs){this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.moveValue=bind(this.moveValue,this),this.loadValues=bind(this.loadValues,this),this.scope.$on("admin:project-values:move",this.moveValue),this.rootscope.$on("project:loaded",this.loadValues)}return extend(ProjectValuesController,superClass),ProjectValuesController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources"],ProjectValuesController.prototype.loadValues=function(){return this.rs[this.scope.resource].listValues(this.scope.projectId,this.scope.type).then(function(_this){return function(values){return _this.scope.values=values,_this.scope.maxValueOrder=_.max(values,"order").order,values}}(this))},ProjectValuesController.prototype.moveValue=function(ctx,itemValue,itemIndex){var r,values;return values=this.scope.values,r=values.indexOf(itemValue),values.splice(r,1),values.splice(itemIndex,0,itemValue),_.each(values,function(value,index){return value.order=index}),this.repo.saveAll(values)},ProjectValuesController}(taiga.Controller),module.controller("ProjectValuesController",ProjectValuesController),ProjectValuesDirective=function($log,$repo,$confirm,$location,animationFrame,$translate,$rootscope){var link,linkDragAndDrop,linkValue;return linkDragAndDrop=function($scope,$el,$attrs){var itemEl,newParentScope,oldParentScope,tdom;return oldParentScope=null,newParentScope=null,itemEl=null,tdom=$el.find(".sortable"),tdom.sortable({handle:".row.table-main.visualization",dropOnEmpty:!0,connectWith:".project-values-body",revert:400,axis:"y"}),tdom.on("sortstop",function(event,ui){var itemIndex,itemValue;return itemEl=ui.item,itemValue=itemEl.scope().value,itemIndex=itemEl.index(),$scope.$broadcast("admin:project-values:move",itemValue,itemIndex)}),$scope.$on("$destroy",function(){return $el.off()})},linkValue=function($scope,$el,$attrs){var $ctrl,cancel,goToBottomList,initializeNewValue,initializeTextTranslations,objName,saveNewValue,saveValue,valueType;return $ctrl=$el.controller(),valueType=$attrs.type,objName=$attrs.objname,initializeNewValue=function(){return $scope.newValue={name:"",is_closed:!1,is_archived:!1}},initializeTextTranslations=function(){return $scope.addNewElementText=$translate.instant("ADMIN.PROJECT_VALUES_"+objName.toUpperCase()+".ACTION_ADD")},initializeNewValue(),initializeTextTranslations(),$rootscope.$on("$translateChangeEnd",function(){return $scope.$evalAsync(initializeTextTranslations)}),goToBottomList=function(_this){return function(focus){var table;return null==focus&&(focus=!1),table=$el.find(".table-main"),$(document.body).scrollTop(table.offset().top+table.height()),focus?$el.find(".new-value input:visible").first().focus():void 0}}(this),saveValue=function(target){var form,formEl,promise,value;return formEl=target.parents("form"),form=formEl.checksley(),form.validate()?(value=formEl.scope().value,promise=$repo.save(value),promise.then(function(_this){return function(){var row;return row=target.parents(".row.table-main"),row.addClass("hidden"),row.siblings(".visualization").removeClass("hidden")}}(this)),promise.then(null,function(data){return form.setErrors(data)})):void 0},saveNewValue=function(target){var form,formEl,promise;return formEl=target.parents("form"),form=formEl.checksley(),form.validate()?($scope.newValue.project=$scope.project.id,$scope.newValue.order=$scope.maxValueOrder?$scope.maxValueOrder+1:1,promise=$repo.create(valueType,$scope.newValue),promise.then(function(_this){return function(data){return target.addClass("hidden"),$scope.values.push(data),$scope.maxValueOrder=data.order,initializeNewValue()}}(this)),promise.then(null,function(data){return form.setErrors(data)})):void 0},cancel=function(target){var formEl,row,value;return row=target.parents(".row.table-main"),formEl=target.parents("form"),value=formEl.scope().value,$scope.$apply(function(){return row.addClass("hidden"),value.revert(),row.siblings(".visualization").removeClass("hidden")})},$el.on("click",".show-add-new",function(event){return event.preventDefault(),$el.find(".new-value").removeClass("hidden"),goToBottomList(!0)}),$el.on("click",".add-new",debounce(2e3,function(event){var target;return event.preventDefault(),target=$el.find(".new-value"),saveNewValue(target)})),$el.on("click",".delete-new",function(event){return event.preventDefault(),$el.find(".new-value").addClass("hidden"),initializeNewValue()}),$el.on("click",".edit-value",function(event){var editionRow,row,target;return event.preventDefault(),target=angular.element(event.currentTarget),row=target.parents(".row.table-main"),row.addClass("hidden"),editionRow=row.siblings(".edition"),editionRow.removeClass("hidden"),editionRow.find("input:visible").first().focus().select()}),$el.on("keyup",".edition input",function(event){var target;return 13===event.keyCode?(target=angular.element(event.currentTarget),saveValue(target)):27===event.keyCode?(target=angular.element(event.currentTarget),cancel(target)):void 0}),$el.on("keyup",".new-value input",function(event){var target;return 13===event.keyCode?(target=$el.find(".new-value"),saveNewValue(target)):27===event.keyCode?($el.find(".new-value").addClass("hidden"),initializeNewValue()):void 0}),$el.on("click",".save",function(event){var target;return event.preventDefault(),target=angular.element(event.currentTarget),saveValue(target)}),$el.on("click",".cancel",function(event){var target;return event.preventDefault(),target=angular.element(event.currentTarget),cancel(target)}),$el.on("click",".delete-value",function(event){var choices,formEl,subtitle,target,text,title,value;return event.preventDefault(),target=angular.element(event.currentTarget),formEl=target.parents("form"),value=formEl.scope().value,choices={},_.each($scope.values,function(option){return value.id!==option.id?choices[option.id]=option.name:void 0}),subtitle=value.name,0===_.keys(choices).length?$confirm.error($translate.instant("ADMIN.PROJECT_VALUES.ERROR_DELETE_ALL")):(title=$translate.instant("ADMIN.COMMON.TITLE_ACTION_DELETE_VALUE"),text=$translate.instant("ADMIN.PROJECT_VALUES.REPLACEMENT"),$confirm.askChoice(title,subtitle,choices,text).then(function(response){var onError,onSucces;return onSucces=function(){return $ctrl.loadValues()["finally"](function(){return response.finish()})},onError=function(){return $confirm.notify("error")},$repo.remove(value,{moveTo:response.selected}).then(onSucces,onError)}))})},link=function($scope,$el,$attrs){return linkDragAndDrop($scope,$el,$attrs),linkValue($scope,$el,$attrs),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgProjectValues",["$log","$tgRepo","$tgConfirm","$tgLocation","animationFrame","$translate","$rootScope",ProjectValuesDirective]),ColorSelectionDirective=function(){var link;return link=function($scope,$el,$attrs,$model){var $ctrl;return $ctrl=$el.controller(),$scope.$watch($attrs.ngModel,function(element){return $scope.color=element.color}),$el.on("click",".current-color",function(event){var body,target;return event.preventDefault(),event.stopPropagation(),target=angular.element(event.currentTarget),$el.find(".select-color").hide(),target.siblings(".select-color").show(),body=angular.element("body"),body.on("click",function(_this){return function(event){return 0===angular.element(event.target).parent(".select-color").length?($el.find(".select-color").hide(),body.unbind("click")):void 0}}(this))}),$el.on("click",".select-color .color",function(event){var target;return event.preventDefault(),target=angular.element(event.currentTarget),$scope.$apply(function(){return $model.$modelValue.color=target.data("color")}),$el.find(".select-color").hide()}),$el.on("click",".select-color .selected-color",function(event){return event.preventDefault(),$scope.$apply(function(){return $model.$modelValue.color=$scope.color}),$el.find(".select-color").hide()}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,require:"ngModel"}},module.directive("tgColorSelection",ColorSelectionDirective),TEXT_TYPE="text",MULTILINE_TYPE="multiline",DATE_TYPE="date",TYPE_CHOICES=[{key:TEXT_TYPE,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT"},{key:MULTILINE_TYPE,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI"},{key:DATE_TYPE,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE"}],ProjectCustomAttributesController=function(superClass){function ProjectCustomAttributesController(scope,rootscope,repo,rs,params,q,location,navUrls,appMetaService,translate){this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.rs=rs,this.params=params,this.q=q,this.location=location,this.navUrls=navUrls,this.appMetaService=appMetaService,this.translate=translate,this.moveCustomAttributes=bind(this.moveCustomAttributes,this),this.deleteCustomAttribute=bind(this.deleteCustomAttribute,this),this.saveCustomAttribute=bind(this.saveCustomAttribute,this),this.createCustomAttribute=bind(this.createCustomAttribute,this),this.loadCustomAttributes=bind(this.loadCustomAttributes,this),this.scope.TYPE_CHOICES=TYPE_CHOICES,this.scope.project={},this.rootscope.$on("project:loaded",function(_this){return function(){var description,sectionName,title;return _this.loadCustomAttributes(),sectionName=_this.translate.instant(_this.scope.sectionName),title=_this.translate.instant("ADMIN.CUSTOM_ATTRIBUTES.PAGE_TITLE",{sectionName:sectionName,projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this))}return extend(ProjectCustomAttributesController,superClass),ProjectCustomAttributesController.$inject=["$scope","$rootScope","$tgRepo","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","tgAppMetaService","$translate"],ProjectCustomAttributesController.prototype.loadCustomAttributes=function(){return this.rs.customAttributes[this.scope.type].list(this.scope.projectId).then(function(_this){return function(customAttributes){return _this.scope.customAttributes=customAttributes,_this.scope.maxOrder=_.max(customAttributes,"order").order,customAttributes}}(this))},ProjectCustomAttributesController.prototype.createCustomAttribute=function(attrValues){return this.repo.create("custom-attributes/"+this.scope.type,attrValues)},ProjectCustomAttributesController.prototype.saveCustomAttribute=function(attrModel){return this.repo.save(attrModel)},ProjectCustomAttributesController.prototype.deleteCustomAttribute=function(attrModel){return this.repo.remove(attrModel)},ProjectCustomAttributesController.prototype.moveCustomAttributes=function(attrModel,newIndex){var customAttributes,r;return customAttributes=this.scope.customAttributes,r=customAttributes.indexOf(attrModel),customAttributes.splice(r,1),customAttributes.splice(newIndex,0,attrModel),_.each(customAttributes,function(val,idx){return val.order=idx}),this.repo.saveAll(customAttributes)},ProjectCustomAttributesController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("ProjectCustomAttributesController",ProjectCustomAttributesController),ProjectCustomAttributesDirective=function($log,$confirm,animationFrame,$translate){var link;return link=function($scope,$el,$attrs){var $ctrl,cancelCreate,cancelUpdate,create,deleteCustomAttribute,hideAddButton,hideCancelButton,hideCreateForm,hideEditForm,resetNewAttr,revertChangesInCustomAttribute,showAddButton,showCancelButton,showCreateForm,showEditForm,sortableEl,update;return $ctrl=$el.controller(),$scope.$on("$destroy",function(){return $el.off()}),sortableEl=$el.find(".js-sortable"),sortableEl.sortable({handle:".js-view-custom-field",dropOnEmpty:!0,revert:400,axis:"y"}),sortableEl.on("sortstop",function(event,ui){var itemAttr,itemEl,itemIndex;return itemEl=ui.item,itemAttr=itemEl.scope().attr,itemIndex=itemEl.index(),$ctrl.moveCustomAttributes(itemAttr,itemIndex)}),showCreateForm=function(){return $el.find(".js-new-custom-field").removeClass("hidden"),$el.find(".js-new-custom-field input:visible").first().focus()},hideCreateForm=function(){return $el.find(".js-new-custom-field").addClass("hidden")},showAddButton=function(){return $el.find(".js-add-custom-field-button").removeClass("hidden")},hideAddButton=function(){return $el.find(".js-add-custom-field-button").addClass("hidden")},showCancelButton=function(){return $el.find(".js-cancel-new-custom-field-button").removeClass("hidden")},hideCancelButton=function(){return $el.find(".js-cancel-new-custom-field-button").addClass("hidden")},resetNewAttr=function(){return $scope.newAttr={}},create=function(formEl){var attr,form,onError,onSucces;return form=formEl.checksley(),form.validate()?(onSucces=function(_this){return function(){return $ctrl.loadCustomAttributes(),hideCreateForm(),resetNewAttr(),$confirm.notify("success")}}(this),onError=function(_this){return function(data){return form.setErrors(data)}}(this),attr=$scope.newAttr,attr.project=$scope.projectId,attr.order=$scope.maxOrder?$scope.maxOrder+1:1,$ctrl.createCustomAttribute(attr).then(onSucces,onError)):void 0},cancelCreate=function(){return hideCreateForm(),resetNewAttr()},$scope.$watch("customAttributes",function(customAttributes){return customAttributes?0===customAttributes.length?(hideCancelButton(),hideAddButton(),showCreateForm()):(hideCreateForm(),showAddButton(),showCancelButton()):void 0}),$el.on("click",".js-add-custom-field-button",function(event){return event.preventDefault(),showCreateForm()}),$el.on("click",".js-create-custom-field-button",debounce(2e3,function(event){var formEl,target;return event.preventDefault(),target=angular.element(event.currentTarget),formEl=target.closest("form"),create(formEl)})),$el.on("click",".js-cancel-new-custom-field-button",function(event){return event.preventDefault(),cancelCreate()}),$el.on("keyup",".js-new-custom-field input",function(event){var formEl,target;return 13===event.keyCode?(target=angular.element(event.currentTarget),formEl=target.closest("form"),create(formEl)):27===event.keyCode?cancelCreate():void 0}),showEditForm=function(formEl){return formEl.find(".js-view-custom-field").addClass("hidden"),formEl.find(".js-edit-custom-field").removeClass("hidden"),formEl.find(".js-edit-custom-field input:visible").first().focus().select()},hideEditForm=function(formEl){return formEl.find(".js-edit-custom-field").addClass("hidden"),formEl.find(".js-view-custom-field").removeClass("hidden")},revertChangesInCustomAttribute=function(formEl){return $scope.$apply(function(){return formEl.scope().attr.revert()})},update=function(formEl){var attr,form,onError,onSucces;return form=formEl.checksley(),form.validate()?(onSucces=function(_this){return function(){return $ctrl.loadCustomAttributes(),hideEditForm(formEl),$confirm.notify("success")}}(this),onError=function(_this){return function(data){return form.setErrors(data)}}(this),attr=formEl.scope().attr,$ctrl.saveCustomAttribute(attr).then(onSucces,onError)):void 0},cancelUpdate=function(formEl){return hideEditForm(formEl),revertChangesInCustomAttribute(formEl)},$el.on("click",".js-edit-custom-field-button",function(event){var formEl,target;return event.preventDefault(),target=angular.element(event.currentTarget),formEl=target.closest("form"),showEditForm(formEl)}),$el.on("click",".js-update-custom-field-button",debounce(2e3,function(event){var formEl,target;return event.preventDefault(),target=angular.element(event.currentTarget),formEl=target.closest("form"),update(formEl)})),$el.on("click",".js-cancel-edit-custom-field-button",function(event){var formEl,target;return event.preventDefault(),target=angular.element(event.currentTarget),formEl=target.closest("form"),cancelUpdate(formEl)}),$el.on("keyup",".js-edit-custom-field input",function(event){var formEl,target;return 13===event.keyCode?(target=angular.element(event.currentTarget),formEl=target.closest("form"),update(formEl)):27===event.keyCode?(target=angular.element(event.currentTarget),formEl=target.closest("form"),cancelUpdate(formEl)):void 0}),deleteCustomAttribute=function(formEl){var attr,message,text,title;return attr=formEl.scope().attr,message=attr.name,title=$translate.instant("COMMON.CUSTOM_ATTRIBUTES.DELETE"),text=$translate.instant("COMMON.CUSTOM_ATTRIBUTES.CONFIRM_DELETE"),$confirm.ask(title,text,message).then(function(response){var onError,onSucces;return onSucces=function(){return $ctrl.loadCustomAttributes()["finally"](function(){return response.finish()})},onError=function(){return $confirm.notify("error",null,"We have not been able to delete '"+message+"'.")},$ctrl.deleteCustomAttribute(attr).then(onSucces,onError)})},$el.on("click",".js-delete-custom-field-button",debounce(2e3,function(event){var formEl,target;return event.preventDefault(),target=angular.element(event.currentTarget),formEl=target.closest("form"),deleteCustomAttribute(formEl)}))},{link:link}},module.directive("tgProjectCustomAttributes",["$log","$tgConfirm","animationFrame","$translate",ProjectCustomAttributesDirective])}.call(this),function(){var EditRoleDirective,NewRoleDirective,RolePermissionsDirective,RolesController,RolesDirective,bindMethods,bindOnce,debounce,mixOf,module,taiga,bind=function(fn,me){return function(){return fn.apply(me,arguments)}},extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty,indexOf=[].indexOf||function(item){for(var i=0,l=this.length;l>i;i++)if(i in this&&this[i]===item)return i;return-1};taiga=this.taiga,mixOf=this.taiga.mixOf,bindOnce=this.taiga.bindOnce,debounce=this.taiga.debounce,bindMethods=this.taiga.bindMethods,module=angular.module("taigaAdmin"),RolesController=function(superClass){function RolesController(scope,rootscope,repo,confirm,rs,params,q,location,navUrls,appMetaService,translate){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.navUrls=navUrls,this.appMetaService=appMetaService,this.translate=translate,this._disableComputable=bind(this._disableComputable,this),this._enableComputable=bind(this._enableComputable,this),bindMethods(this),this.scope.sectionName="ADMIN.MENU.PERMISSIONS",this.scope.project={},this.scope.anyComputableRole=!0,promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,title;return title=_this.translate.instant("ADMIN.ROLES.PAGE_TITLE",{projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this))}return extend(RolesController,superClass),RolesController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","tgAppMetaService","$translate"],RolesController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return project.i_am_owner||_this.location.path(_this.navUrls.resolve("permission-denied")),_this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),_this.scope.anyComputableRole=_.some(_.map(project.roles,function(point){return point.computable})),project}}(this))},RolesController.prototype.loadRoles=function(){return this.rs.roles.list(this.scope.projectId).then(function(_this){return function(roles){var public_permission;return roles=roles.map(function(role){return role.external_user=!1,role}),public_permission={name:_this.translate.instant("ADMIN.ROLES.EXTERNAL_USER"),permissions:_this.scope.project.public_permissions,external_user:!0},roles.push(public_permission),_this.scope.roles=roles,_this.scope.role=_this.scope.roles[0],roles}}(this))},RolesController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(){return _this.loadRoles()}}(this)),promise},RolesController.prototype.setRole=function(role){return this.scope.role=role,this.scope.$broadcast("role:changed",this.scope.role)},RolesController.prototype["delete"]=function(){var choices,i,len,ref,replacement,role,subtitle,title,warning;for(choices={},ref=this.scope.roles,i=0,len=ref.length;len>i;i++)role=ref[i],role.id!==this.scope.role.id&&(choices[role.id]=role.name);return 0===_.keys(choices).length?this.confirm.error(this.translate.instant("ADMIN.ROLES.ERROR_DELETE_ALL")):(title=this.translate.instant("ADMIN.ROLES.TITLE_DELETE_ROLE"),subtitle=this.scope.role.name,replacement=this.translate.instant("ADMIN.ROLES.REPLACEMENT_ROLE"),warning=this.translate.instant("ADMIN.ROLES.WARNING_DELETE_ROLE"),this.confirm.askChoice(title,subtitle,choices,replacement,warning).then(function(_this){return function(response){var onError,onSuccess;return onSuccess=function(){return _this.loadProject(),_this.loadRoles()["finally"](function(){return response.finish()})},onError=function(){return _this.confirm.notify("error")},_this.repo.remove(_this.scope.role,{moveTo:response.selected}).then(onSuccess,onError)}}(this)))},RolesController.prototype._enableComputable=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.confirm.notify("success"),_this.loadProject()}}(this),onError=function(_this){return function(){return _this.confirm.notify("error"),_this.scope.role.revert()}}(this),this.repo.save(this.scope.role).then(onSuccess,onError)},RolesController.prototype._disableComputable=function(){var askOnError,askOnSuccess,message,subtitle,title;return askOnSuccess=function(_this){return function(response){var onError,onSuccess;return onSuccess=function(){return response.finish(),_this.confirm.notify("success"),_this.loadProject()},onError=function(){return response.finish(),_this.confirm.notify("error"),_this.scope.role.revert()},_this.repo.save(_this.scope.role).then(onSuccess,onError)}}(this),askOnError=function(_this){return function(response){return _this.scope.role.revert()}}(this),title=this.translate.instant("ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_TITLE"),subtitle=this.translate.instant("ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_SUBTITLE",{roleName:this.scope.role.name}),message=this.translate.instant("ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_MESSAGE"),this.confirm.ask(title,subtitle,message).then(askOnSuccess,askOnError)},RolesController.prototype.toggleComputable=debounce(2e3,function(){return this.scope.role.computable?this._enableComputable():this._disableComputable()}),RolesController}(mixOf(taiga.Controller,taiga.PageMixin,taiga.FiltersMixin)),module.controller("RolesController",RolesController),EditRoleDirective=function($repo,$confirm){var link;return link=function($scope,$el,$attrs){var submit,toggleView;return toggleView=function(){return $el.find(".total").toggle(),$el.find(".edit-role").toggle()},submit=function(){var promise;return $scope.role.name=$el.find("input").val(),promise=$repo.save($scope.role),promise.then(function(){return $confirm.notify("success")}),promise.then(null,function(data){return $confirm.notify("error")}),toggleView()},$el.on("click","a.icon-edit",function(){return toggleView(),$el.find("input").focus(),$el.find("input").val($scope.role.name)}),$el.on("click","a.save",submit),$el.on("keyup","input",function(event){return 13===event.keyCode?submit():27===event.keyCode?toggleView():void 0}),$scope.$on("role:changed",function(){return $el.find(".edit-role").is(":visible")?toggleView():void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgEditRole",["$tgRepo","$tgConfirm",EditRoleDirective]),RolesDirective=function(){var link;return link=function($scope,$el,$attrs){var $ctrl;return $ctrl=$el.controller(),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgRoles",RolesDirective),NewRoleDirective=function($tgrepo,$confirm){var DEFAULT_PERMISSIONS,link;return DEFAULT_PERMISSIONS=["view_project","view_milestones","view_us","view_tasks","view_issues"], -link=function($scope,$el,$attrs){var $ctrl;return $ctrl=$el.controller(),$scope.$on("$destroy",function(){return $el.off()}),$el.on("click","a.add-button",function(event){return event.preventDefault(),$el.find(".new").removeClass("hidden"),$el.find(".new").focus(),$el.find(".add-button").hide()}),$el.on("keyup",".new",function(event){var newRole,onError,onSuccess,target;return event.preventDefault(),13===event.keyCode?(target=angular.element(event.currentTarget),newRole={project:$scope.projectId,name:target.val(),permissions:DEFAULT_PERMISSIONS,order:_.max($scope.roles,function(r){return r.order}).order+1,computable:!1},$el.find(".new").addClass("hidden"),$el.find(".new").val(""),onSuccess=function(role){var insertPosition;return insertPosition=$scope.roles.length-1,$scope.roles.splice(insertPosition,0,role),$ctrl.setRole(role),$el.find(".add-button").show(),$ctrl.loadProject()},onError=function(){return $confirm.notify("error")},$tgrepo.create("roles",newRole).then(onSuccess,onError)):27===event.keyCode?(target=angular.element(event.currentTarget),$el.find(".new").addClass("hidden"),$el.find(".new").val(""),$el.find(".add-button").show()):void 0})},{link:link}},module.directive("tgNewRole",["$tgRepo","$tgConfirm",NewRoleDirective]),RolePermissionsDirective=function($rootscope,$repo,$confirm,$compile){var baseTemplate,categoryTemplate,link,resumeTemplate;return resumeTemplate=_.template('
\n
\n
<%- category.activePermissions %>/<%- category.permissions.length %>
\n <% _.each(category.permissions, function(permission) { %>\n
\n <% }) %>\n
\n
'),categoryTemplate=_.template('
\n
\n
\n
\n
\n <% _.each(category.permissions, function(permission) { %>\n
\n \n
\n disabled="disabled" <% } %>\n <% if(permission.active) { %> checked="checked" <% } %>/>\n
\n \n \n
\n
\n <% }) %>\n
\n
\n
'),baseTemplate=_.template('
'),link=function($scope,$el,$attrs){var $ctrl,generateCategoriesFromRole,renderCategory,renderPermissions,renderResume;return $ctrl=$el.controller(),generateCategoriesFromRole=function(role){var categories,isPermissionEditable,issuePermissions,milestonePermissions,setActivePermissions,setActivePermissionsPerCategory,taskPermissions,userStoryPermissions,wikiPermissions;return setActivePermissions=function(permissions){return _.map(permissions,function(x){var ref;return _.extend({},x,{active:(ref=x.key,indexOf.call(role.permissions,ref)>=0)})})},isPermissionEditable=function(permission,role,project){return role.external_user&&!project.is_private&&0===permission.key.indexOf("view_")?!1:!0},setActivePermissionsPerCategory=function(category){return _.map(category,function(cat){return cat.permissions=cat.permissions.map(function(permission){return permission.editable=isPermissionEditable(permission,role,$scope.project),permission}),_.extend({},cat,{activePermissions:_.filter(cat.permissions,"active").length})})},categories=[],milestonePermissions=[{key:"view_milestones",name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.VIEW_SPRINTS"},{key:"add_milestone",name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.ADD_SPRINTS"},{key:"modify_milestone",name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.MODIFY_SPRINTS"},{key:"delete_milestone",name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.DELETE_SPRINTS"}],categories.push({name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.NAME",permissions:setActivePermissions(milestonePermissions)}),userStoryPermissions=[{key:"view_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.VIEW_USER_STORIES"},{key:"add_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.ADD_USER_STORIES"},{key:"modify_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.MODIFY_USER_STORIES"},{key:"delete_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.DELETE_USER_STORIES"}],categories.push({name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.NAME",permissions:setActivePermissions(userStoryPermissions)}),taskPermissions=[{key:"view_tasks",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.VIEW_TASKS"},{key:"add_task",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.ADD_TASKS"},{key:"modify_task",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.MODIFY_TASKS"},{key:"delete_task",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.DELETE_TASKS"}],categories.push({name:"COMMON.PERMISIONS_CATEGORIES.TASKS.NAME",permissions:setActivePermissions(taskPermissions)}),issuePermissions=[{key:"view_issues",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.VIEW_ISSUES"},{key:"add_issue",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.ADD_ISSUES"},{key:"modify_issue",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.MODIFY_ISSUES"},{key:"delete_issue",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.DELETE_ISSUES"}],categories.push({name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.NAME",permissions:setActivePermissions(issuePermissions)}),wikiPermissions=[{key:"view_wiki_pages",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_PAGES"},{key:"add_wiki_page",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_PAGES"},{key:"modify_wiki_page",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.MODIFY_WIKI_PAGES"},{key:"delete_wiki_page",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_PAGES"},{key:"view_wiki_links",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_LINKS"},{key:"add_wiki_link",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_LINKS"},{key:"delete_wiki_link",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_LINKS"}],categories.push({name:"COMMON.PERMISIONS_CATEGORIES.WIKI.NAME",permissions:setActivePermissions(wikiPermissions)}),setActivePermissionsPerCategory(categories)},renderResume=function(element,category){return element.find(".resume").html($compile(resumeTemplate({category:category}))($scope))},renderCategory=function(category,index){var html;return html=categoryTemplate({category:category,index:index}),html=angular.element(html),renderResume(html,category),$compile(html)($scope)},renderPermissions=function(){var html;return $el.off(),html=baseTemplate(),_.each(generateCategoriesFromRole($scope.role),function(category,index){return html=angular.element(html).append(renderCategory(category,index))}),$el.html(html),$el.on("click",".resume",function(event){var target;return event.preventDefault(),target=angular.element(event.currentTarget),target.next().toggleClass("open")}),$el.on("change",".category-item input",function(event){var getActivePermissions,onError,onSuccess,target;return getActivePermissions=function(){var activePermissions;return activePermissions=_.filter($el.find(".category-item input"),function(t){return angular.element(t).is(":checked")}),activePermissions=_.sortBy(_.map(activePermissions,function(t){var permission;return permission=angular.element(t).parents(".category-item").data("id")})),activePermissions.length&&activePermissions.push("view_project"),activePermissions},target=angular.element(event.currentTarget),$scope.role.permissions=getActivePermissions(),onSuccess=function(){var categories,categoryId;return categories=generateCategoriesFromRole($scope.role),categoryId=target.parents(".category-config").data("id"),renderResume(target.parents(".category-config"),categories[categoryId]),$rootscope.$broadcast("projects:reload"),$confirm.notify("success"),$ctrl.loadProject()},onError=function(){return $confirm.notify("error"),target.prop("checked",!target.prop("checked")),$scope.role.permissions=getActivePermissions()},$scope.role.external_user?($scope.project.public_permissions=$scope.role.permissions,$scope.project.anon_permissions=$scope.role.permissions.filter(function(permission){return 0===permission.indexOf("view_")}),$repo.save($scope.project).then(onSuccess,onError)):$repo.save($scope.role).then(onSuccess,onError)})},$scope.$on("$destroy",function(){return $el.off()}),$scope.$on("role:changed",function(){return renderPermissions()}),bindOnce($scope,$attrs.ngModel,renderPermissions)},{link:link}},module.directive("tgRolePermissions",["$rootScope","$tgRepo","$tgConfirm","$compile",RolePermissionsDirective])}.call(this),function(){var BitbucketController,BitbucketWebhooksDirective,GithubController,GithubWebhooksDirective,GitlabController,GitlabWebhooksDirective,NewWebhookDirective,SelectInputText,ValidOriginIpsDirective,WebhookDirective,WebhooksController,bindMethods,debounce,mixOf,module,taiga,timeout,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,bindMethods=this.taiga.bindMethods,debounce=this.taiga.debounce,timeout=this.taiga.timeout,module=angular.module("taigaAdmin"),WebhooksController=function(superClass){function WebhooksController(scope,repo,rs,params,location,navUrls,appMetaService,translate){var promise;this.scope=scope,this.repo=repo,this.rs=rs,this.params=params,this.location=location,this.navUrls=navUrls,this.appMetaService=appMetaService,this.translate=translate,bindMethods(this),this.scope.sectionName="ADMIN.WEBHOOKS.SECTION_NAME",this.scope.project={},promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,title;return title=_this.translate.instant("ADMIN.WEBHOOKS.PAGE_TITLE",{projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this)),this.scope.$on("webhooks:reload",this.loadWebhooks)}return extend(WebhooksController,superClass),WebhooksController.$inject=["$scope","$tgRepo","$tgResources","$routeParams","$tgLocation","$tgNavUrls","tgAppMetaService","$translate"],WebhooksController.prototype.loadWebhooks=function(){return this.rs.webhooks.list(this.scope.projectId).then(function(_this){return function(webhooks){return _this.scope.webhooks=webhooks}}(this))},WebhooksController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return project.i_am_owner||_this.location.path(_this.navUrls.resolve("permission-denied")),_this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),project}}(this))},WebhooksController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(){return _this.loadWebhooks()}}(this)),promise},WebhooksController}(mixOf(taiga.Controller,taiga.PageMixin,taiga.FiltersMixin)),module.controller("WebhooksController",WebhooksController),WebhookDirective=function($rs,$repo,$confirm,$loading,$translate){var link;return link=function($scope,$el,$attrs){var cancel,openHistory,save,showEditMode,showVisualizationMode,updateLogs,updateShowHideHistoryText,webhook;return webhook=$scope.$eval($attrs.tgWebhook),updateLogs=function(){var prettyDate;return prettyDate=$translate.instant("ADMIN.WEBHOOKS.DATE"),$rs.webhooklogs.list(webhook.id).then(function(_this){return function(webhooklogs){var i,len,log,ref;for(i=0,len=webhooklogs.length;len>i;i++)log=webhooklogs[i],log.validStatus=200<=(ref=log.status)&&300>ref,log.prettySentHeaders=_.map(_.pairs(log.request_headers),function(arg){var header,value;return header=arg[0],value=arg[1],header+": "+value}).join("\n"),log.prettySentData=JSON.stringify(log.request_data),log.prettyDate=moment(log.created).format(prettyDate);return webhook.logs_counter=webhooklogs.length,webhook.logs=webhooklogs,updateShowHideHistoryText()}}(this))},updateShowHideHistoryText=function(){var historyElement,text,textElement,title;return textElement=$el.find(".toggle-history"),historyElement=textElement.parents(".single-webhook-wrapper").find(".webhooks-history"),historyElement.hasClass("open")?(text=$translate.instant("ADMIN.WEBHOOKS.ACTION_HIDE_HISTORY"),title=$translate.instant("ADMIN.WEBHOOKS.ACTION_HIDE_HISTORY_TITLE")):(text=$translate.instant("ADMIN.WEBHOOKS.ACTION_SHOW_HISTORY"),title=$translate.instant("ADMIN.WEBHOOKS.ACTION_SHOW_HISTORY_TITLE")),textElement.text(text),textElement.prop("title",title)},showVisualizationMode=function(){return $el.find(".edition-mode").addClass("hidden"),$el.find(".visualization-mode").removeClass("hidden")},showEditMode=function(){return $el.find(".visualization-mode").addClass("hidden"),$el.find(".edition-mode").removeClass("hidden")},openHistory=function(){return $el.find(".webhooks-history").addClass("open")},cancel=function(){return showVisualizationMode(),$scope.$apply(function(){return webhook.revert()})},save=debounce(2e3,function(target){var form,promise;return form=target.parents("form").checksley(),form.validate()?(promise=$repo.save(webhook),promise.then(function(_this){return function(){return showVisualizationMode()}}(this)),promise.then(null,function(data){return $confirm.notify("error"),form.setErrors(data)})):void 0}),$el.on("click",".test-webhook",function(){return openHistory(),$rs.webhooks.test(webhook.id).then(function(_this){return function(){return updateLogs()}}(this))}),$el.on("click",".edit-webhook",function(){return showEditMode()}),$el.on("click",".cancel-existing",function(){return cancel()}),$el.on("click",".edit-existing",function(event){var target;return event.preventDefault(),target=angular.element(event.currentTarget),save(target)}),$el.on("keyup",".edition-mode input",function(event){var target;return 13===event.keyCode?(target=angular.element(event.currentTarget),save(target)):27===event.keyCode?(target=angular.element(event.currentTarget),cancel(target)):void 0}),$el.on("click",".delete-webhook",function(){var message,title;return title=$translate.instant("ADMIN.WEBHOOKS.DELETE"),message=$translate.instant("ADMIN.WEBHOOKS.WEBHOOK_NAME",{name:webhook.name}),$confirm.askOnDelete(title,message).then(function(_this){return function(askResponse){var onError,onSucces;return onSucces=function(){return askResponse.finish(),$scope.$emit("webhooks:reload")},onError=function(){return askResponse.finish(!1),$confirm.notify("error")},$repo.remove(webhook).then(onSucces,onError)}}(this))}),$el.on("click",".toggle-history",function(event){var target;return target=angular.element(event.currentTarget),null==webhook.logs||0===webhook.logs.length?updateLogs().then(function(){return timeout(0,function(){return $el.find(".webhooks-history").toggleClass("open"),updateShowHideHistoryText()})}):($el.find(".webhooks-history").toggleClass("open"),$scope.$apply(function(){return updateShowHideHistoryText()}))}),$el.on("click",".history-single",function(event){var target;return target=angular.element(event.currentTarget),target.toggleClass("history-single-open"),target.siblings(".history-single-response").toggleClass("open")}),$el.on("click",".resend-request",function(event){var log,target;return target=angular.element(event.currentTarget),log=target.data("log"),$rs.webhooklogs.resend(log).then(function(_this){return function(){return updateLogs()}}(this))})},{link:link}},module.directive("tgWebhook",["$tgResources","$tgRepo","$tgConfirm","$tgLoading","$translate",WebhookDirective]),NewWebhookDirective=function($rs,$repo,$confirm,$loading){var link;return link=function($scope,$el,$attrs){var addWebhookDOMNode,formDOMNode,initializeNewValue,save,webhook;return webhook=$scope.$eval($attrs.tgWebhook),formDOMNode=$el.find(".new-webhook-form"),addWebhookDOMNode=$el.find(".add-webhook"),initializeNewValue=function(){return $scope.newValue={name:"",url:"",key:""}},initializeNewValue(),$scope.$watch("webhooks",function(webhooks){return null!=webhooks?0===webhooks.length?(formDOMNode.removeClass("hidden"),addWebhookDOMNode.addClass("hidden"),formDOMNode.find("input")[0].focus()):(formDOMNode.addClass("hidden"),addWebhookDOMNode.removeClass("hidden")):void 0}),save=debounce(2e3,function(){var form,promise;return form=formDOMNode.checksley(),form.validate()?($scope.newValue.project=$scope.project.id,promise=$repo.create("webhooks",$scope.newValue),promise.then(function(_this){return function(){return $scope.$emit("webhooks:reload"),initializeNewValue()}}(this)),promise.then(null,function(data){return $confirm.notify("error"),form.setErrors(data)})):void 0}),formDOMNode.on("click",".add-new",function(event){return event.preventDefault(),save()}),formDOMNode.on("keyup","input",function(event){return 13===event.keyCode?save():void 0}),formDOMNode.on("click",".cancel-new",function(event){return $scope.$apply(function(){return initializeNewValue()})}),addWebhookDOMNode.on("click",function(event){return formDOMNode.removeClass("hidden"),formDOMNode.find("input")[0].focus()})},{link:link}},module.directive("tgNewWebhook",["$tgResources","$tgRepo","$tgConfirm","$tgLoading",NewWebhookDirective]),GithubController=function(superClass){function GithubController(scope,repo,rs,params,appMetaService,translate){var promise;this.scope=scope,this.repo=repo,this.rs=rs,this.params=params,this.appMetaService=appMetaService,this.translate=translate,bindMethods(this),this.scope.sectionName=this.translate.instant("ADMIN.GITHUB.SECTION_NAME"),this.scope.project={},promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,title;return title=_this.translate.instant("ADMIN.GITHUB.PAGE_TITLE",{projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this))}return extend(GithubController,superClass),GithubController.$inject=["$scope","$tgRepo","$tgResources","$routeParams","tgAppMetaService","$translate"],GithubController.prototype.loadModules=function(){return this.rs.modules.list(this.scope.projectId,"github").then(function(_this){return function(github){return _this.scope.github=github}}(this))},GithubController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return _this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),project}}(this))},GithubController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(){return _this.loadModules()}}(this)),promise},GithubController}(mixOf(taiga.Controller,taiga.PageMixin,taiga.FiltersMixin)),module.controller("GithubController",GithubController),GitlabController=function(superClass){function GitlabController(scope,repo,rs,params,appMetaService,translate){var promise;this.scope=scope,this.repo=repo,this.rs=rs,this.params=params,this.appMetaService=appMetaService,this.translate=translate,bindMethods(this),this.scope.sectionName=this.translate.instant("ADMIN.GITLAB.SECTION_NAME"),this.scope.project={},promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,title;return title=_this.translate.instant("ADMIN.GITLAB.PAGE_TITLE",{projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this)),this.scope.$on("project:modules:reload",function(_this){return function(){return _this.loadModules()}}(this))}return extend(GitlabController,superClass),GitlabController.$inject=["$scope","$tgRepo","$tgResources","$routeParams","tgAppMetaService","$translate"],GitlabController.prototype.loadModules=function(){return this.rs.modules.list(this.scope.projectId,"gitlab").then(function(_this){return function(gitlab){return _this.scope.gitlab=gitlab}}(this))},GitlabController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return _this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),project}}(this))},GitlabController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(){return _this.loadModules()}}(this)),promise},GitlabController}(mixOf(taiga.Controller,taiga.PageMixin,taiga.FiltersMixin)),module.controller("GitlabController",GitlabController),BitbucketController=function(superClass){function BitbucketController(scope,repo,rs,params,appMetaService,translate){var promise;this.scope=scope,this.repo=repo,this.rs=rs,this.params=params,this.appMetaService=appMetaService,this.translate=translate,bindMethods(this),this.scope.sectionName=this.translate.instant("ADMIN.BITBUCKET.SECTION_NAME"),this.scope.project={},promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,title;return title=_this.translate.instant("ADMIN.BITBUCKET.PAGE_TITLE",{projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this)),this.scope.$on("project:modules:reload",function(_this){return function(){return _this.loadModules()}}(this))}return extend(BitbucketController,superClass),BitbucketController.$inject=["$scope","$tgRepo","$tgResources","$routeParams","tgAppMetaService","$translate"],BitbucketController.prototype.loadModules=function(){return this.rs.modules.list(this.scope.projectId,"bitbucket").then(function(_this){return function(bitbucket){return _this.scope.bitbucket=bitbucket}}(this))},BitbucketController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return _this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),project}}(this))},BitbucketController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(){return _this.loadModules()}}(this)),promise},BitbucketController}(mixOf(taiga.Controller,taiga.PageMixin,taiga.FiltersMixin)),module.controller("BitbucketController",BitbucketController),SelectInputText=function(){var link;return link=function($scope,$el,$attrs){return $el.on("click",".select-input-content",function(){return $el.find("input").select(),$el.find(".help-copy").addClass("visible")})},{link:link}},module.directive("tgSelectInputText",SelectInputText),GithubWebhooksDirective=function($repo,$confirm,$loading){var link;return link=function($scope,$el,$attrs){var form,submit,submitButton;return form=$el.find("form").checksley({onlyOneErrorElement:!0}),submit=debounce(2e3,function(_this){return function(event){var currentLoading,promise;return event.preventDefault(),form.validate()?(currentLoading=$loading().target(submitButton).start(),promise=$repo.saveAttribute($scope.github,"github"),promise.then(function(){return currentLoading.finish(),$confirm.notify("success")}),promise.then(null,function(data){return currentLoading.finish(),form.setErrors(data),data._error_message?$confirm.notify("error",data._error_message):void 0})):void 0}}(this)),submitButton=$el.find(".submit-button"),$el.on("submit","form",submit)},{link:link}},module.directive("tgGithubWebhooks",["$tgRepo","$tgConfirm","$tgLoading",GithubWebhooksDirective]),GitlabWebhooksDirective=function($repo,$confirm,$loading){var link;return link=function($scope,$el,$attrs){var form,submit,submitButton;return form=$el.find("form").checksley({onlyOneErrorElement:!0}),submit=debounce(2e3,function(_this){return function(event){var currentLoading,promise;return event.preventDefault(),form.validate()?(currentLoading=$loading().target(submitButton).start(),promise=$repo.saveAttribute($scope.gitlab,"gitlab"),promise.then(function(){return currentLoading.finish(),$confirm.notify("success"),$scope.$emit("project:modules:reload")}),promise.then(null,function(data){return currentLoading.finish(),form.setErrors(data),data._error_message?$confirm.notify("error",data._error_message):void 0})):void 0}}(this)),submitButton=$el.find(".submit-button"),$el.on("submit","form",submit)},{link:link}},module.directive("tgGitlabWebhooks",["$tgRepo","$tgConfirm","$tgLoading",GitlabWebhooksDirective]),BitbucketWebhooksDirective=function($repo,$confirm,$loading){var link;return link=function($scope,$el,$attrs){var form,submit,submitButton;return form=$el.find("form").checksley({onlyOneErrorElement:!0}),submit=debounce(2e3,function(_this){return function(event){var currentLoading,promise;return event.preventDefault(),form.validate()?(currentLoading=$loading().target(submitButton).start(),promise=$repo.saveAttribute($scope.bitbucket,"bitbucket"),promise.then(function(){return currentLoading.finish(),$confirm.notify("success"),$scope.$emit("project:modules:reload")}),promise.then(null,function(data){return currentLoading.finish(),form.setErrors(data),data._error_message?$confirm.notify("error",data._error_message):void 0})):void 0}}(this)),submitButton=$el.find(".submit-button"),$el.on("submit","form",submit)},{link:link}},module.directive("tgBitbucketWebhooks",["$tgRepo","$tgConfirm","$tgLoading",BitbucketWebhooksDirective]),ValidOriginIpsDirective=function(){var link;return link=function($scope,$el,$attrs,$ngModel){return $ngModel.$parsers.push(function(value){return value=$.trim(value),""===value?[]:value.split(",")})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgValidOriginIps",ValidOriginIpsDirective)}.call(this),function(){var CreateProject,DeleteProjectDirective,bindOnce,debounce,module,taiga,timeout;taiga=this.taiga,bindOnce=this.taiga.bindOnce,timeout=this.taiga.timeout,debounce=this.taiga.debounce,module=angular.module("taigaProject"),CreateProject=function($rootscope,$repo,$confirm,$location,$navurls,$rs,$projectUrl,$loading,lightboxService,$cacheFactory,$translate,currentUserService){var directive,link;return link=function($scope,$el,attrs){var currentLoading,form,onErrorSubmit,onSuccessSubmit,openLightbox,submit,submitButton;return $scope.data={},$scope.templates=[],currentLoading=null,form=$el.find("form").checksley({onlyOneErrorElement:!0}),onSuccessSubmit=function(response){return $cacheFactory.get("$http").removeAll(),currentLoading.finish(),$rootscope.$broadcast("projects:reload"),$confirm.notify("success",$translate.instant("COMMON.SAVE")),$location.url($projectUrl.get(response)),lightboxService.close($el),currentUserService.loadProjects()},onErrorSubmit=function(response){var error_field,error_step,i,len,ref,selectors;for(currentLoading.finish(),form.setErrors(response),selectors=[],ref=_.keys(response),i=0,len=ref.length;len>i;i++)error_field=ref[i],selectors.push("[name="+error_field+"]");return $el.find(".active").removeClass("active"),error_step=$el.find(selectors.join(",")).first().parents(".wizard-step"),error_step.addClass("active"),$el.find(".progress-bar").removeClass().addClass("progress-bar").addClass(error_step.data("step"))},submit=function(_this){return function(event){var promise;return event.preventDefault(),form.validate()?(currentLoading=$loading().target(submitButton).start(),promise=$repo.create("projects",$scope.data),promise.then(onSuccessSubmit,onErrorSubmit)):void 0}}(this),openLightbox=function(){return $scope.data={},$scope.templates.length?$scope.data.creation_template=_.head(_.filter($scope.templates,function(x){return"scrum"===x.slug})).id:$rs.projects.templates().then(function(_this){return function(result){return $scope.templates=result,$scope.data.creation_template=_.head(_.filter($scope.templates,function(x){return"scrum"===x.slug})).id}}(this)),$el.find(".active").removeClass("active"),$el.find(".create-step1").addClass("active"),lightboxService.open($el),timeout(600,function(){return $el.find(".progress-bar").addClass("step1")})},$el.on("click",".button-next",function(event){var current,field,i,len,next,ref,step,valid;for(event.preventDefault(),current=$el.find(".active"),valid=!0,ref=form.fields,i=0,len=ref.length;len>i;i++)field=ref[i],current.find("[name="+field.element.attr("name")+"]").length&&(valid=field.validate()!==!1&&valid);return valid?(next=current.next(),current.toggleClass("active"),next.toggleClass("active"),step=next.data("step"),$el.find(".progress-bar").removeClass().addClass("progress-bar").addClass(step)):void 0}),$el.on("click",".button-prev",function(event){var current,prev,step;return event.preventDefault(),current=$el.find(".active"),prev=current.prev(),current.toggleClass("active"),prev.toggleClass("active"),step=prev.data("step"),$el.find(".progress-bar").removeClass().addClass("progress-bar").addClass(step)}),submitButton=$el.find(".submit-button"),$el.on("submit","form",submit),$el.on("click",".close",function(event){return event.preventDefault(),lightboxService.close($el)}),$scope.$on("$destroy",function(){return $el.off()}),openLightbox()},directive={link:link,templateUrl:"project/wizard-create-project.html",scope:{}}},module.directive("tgLbCreateProject",["$rootScope","$tgRepo","$tgConfirm","$location","$tgNavUrls","$tgResources","$projectUrl","$tgLoading","lightboxService","$cacheFactory","$translate","tgCurrentUserService",CreateProject]),DeleteProjectDirective=function($repo,$rootscope,$auth,$location,$navUrls,$confirm,lightboxService,tgLoader,currentUserService){var link;return link=function($scope,$el,$attrs){var projectToDelete,submit;return projectToDelete=null,$scope.$on("deletelightbox:new",function(ctx,project){return lightboxService.open($el),projectToDelete=project}),$scope.$on("$destroy",function(){return $el.off()}),submit=function(){var promise;return tgLoader.start(),lightboxService.close($el),promise=$repo.remove(projectToDelete),promise.then(function(data){return tgLoader.pageLoaded(),$rootscope.$broadcast("projects:reload"),$location.path($navUrls.resolve("home")),$confirm.notify("success"),currentUserService.loadProjects()}),promise.then(null,function(){return $confirm.notify("error"),lightboxService.close($el)})},$el.on("click",".button-red",function(event){return event.preventDefault(),lightboxService.close($el)}),$el.on("click",".button-green",function(event){return event.preventDefault(),submit()})},{link:link}},module.directive("tgLbDeleteProject",["$tgRepo","$rootScope","$tgAuth","$tgLocation","$tgNavUrls","$tgConfirm","lightboxService","tgLoader","tgCurrentUserService",DeleteProjectDirective])}.call(this),function(){var BindHtmlDirective,BindOnceAltDirective,BindOnceBindDirective,BindOnceHrefDirective,BindOnceHtmlDirective,BindOnceRefDirective,BindOnceSrcDirective,BindOnceTitleDirective,BindTitleDirective,bindOnce,module;bindOnce=this.taiga.bindOnce,BindOnceBindDirective=function(){var link;return link=function($scope,$el,$attrs){return bindOnce($scope,$attrs.tgBoBind,function(val){return $el.text(val)})},{link:link}},BindOnceHtmlDirective=function(){var link;return link=function($scope,$el,$attrs){return bindOnce($scope,$attrs.tgBoHtml,function(val){return $el.html(val)})},{link:link}},BindOnceRefDirective=function(){var link;return link=function($scope,$el,$attrs){return bindOnce($scope,$attrs.tgBoRef,function(val){return $el.html("#"+val+" ")})},{link:link}},BindOnceSrcDirective=function(){ -var link;return link=function($scope,$el,$attrs){return bindOnce($scope,$attrs.tgBoSrc,function(val){return $el.attr("src",val)})},{link:link}},BindOnceHrefDirective=function(){var link;return link=function($scope,$el,$attrs){return bindOnce($scope,$attrs.tgBoHref,function(val){return $el.attr("href",val)})},{link:link}},BindOnceAltDirective=function(){var link;return link=function($scope,$el,$attrs){return bindOnce($scope,$attrs.tgBoAlt,function(val){return $el.attr("alt",val)})},{link:link}},BindOnceTitleDirective=function(){var link;return link=function($scope,$el,$attrs){return bindOnce($scope,$attrs.tgBoTitle,function(val){return $el.attr("title",val)})},{link:link}},BindTitleDirective=function(){var link;return link=function($scope,$el,$attrs){return $scope.$watch($attrs.tgTitleHtml,function(val){return null!=val?$el.attr("title",val):void 0})},{link:link}},BindHtmlDirective=function(){var link;return link=function($scope,$el,$attrs){return $scope.$watch($attrs.tgBindHtml,function(val){return null!=val?$el.html(val):void 0})},{link:link}},module=angular.module("taigaBase"),module.directive("tgBoBind",BindOnceBindDirective),module.directive("tgBoHtml",BindOnceHtmlDirective),module.directive("tgBoRef",BindOnceRefDirective),module.directive("tgBoSrc",BindOnceSrcDirective),module.directive("tgBoHref",BindOnceHrefDirective),module.directive("tgBoAlt",BindOnceAltDirective),module.directive("tgBoTitle",BindOnceTitleDirective),module.directive("tgBindTitle",BindTitleDirective),module.directive("tgBindHtml",BindHtmlDirective)}.call(this),function(){var ConfigurationService,module;ConfigurationService=function(){function ConfigurationService(){this.config=window.taigaConfig}return ConfigurationService.prototype.get=function(key,defaultValue){return null==defaultValue&&(defaultValue=null),_.has(this.config,key)?this.config[key]:defaultValue},ConfigurationService}(),module=angular.module("taigaBase"),module.service("$tgConfig",ConfigurationService)}.call(this),function(){var ContribController,module,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;module=angular.module("taigaBase"),ContribController=function(superClass){function ContribController(rootScope,scope,params,repo,rs,confirm){var promise;this.rootScope=rootScope,this.scope=scope,this.params=params,this.repo=repo,this.rs=rs,this.confirm=confirm,this.scope.currentPlugin=_.first(_.where(this.rootScope.adminPlugins,{slug:this.params.plugin})),this.scope.projectSlug=this.params.pslug,promise=this.loadInitialData(),promise.then(null,function(_this){return function(){return _this.confirm.notify("error")}}(this))}return extend(ContribController,superClass),ContribController.$inject=["$rootScope","$scope","$routeParams","$tgRepo","$tgResources","$tgConfirm"],ContribController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return _this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),_this.scope.$broadcast("project:loaded",project),project}}(this))},ContribController.prototype.loadInitialData=function(){return this.loadProject()},ContribController}(taiga.Controller),module.controller("ContribController",ContribController)}.call(this),function(){var FiltersStorageService,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,FiltersStorageService=function(superClass){function FiltersStorageService(storage,params){this.storage=storage,this.params=params}return extend(FiltersStorageService,superClass),FiltersStorageService.$inject=["$tgStorage","$routeParams"],FiltersStorageService.prototype.generateHash=function(components){return null==components&&(components=[]),components=_.map(components,function(x){return JSON.stringify(x)}),hex_sha1(components.join(":"))},FiltersStorageService}(taiga.Service)}.call(this),function(){var HttpService,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,HttpService=function(superClass){function HttpService(http,q,storage,rootScope,cacheFactory,translate){this.http=http,this.q=q,this.storage=storage,this.rootScope=rootScope,this.cacheFactory=cacheFactory,this.translate=translate,HttpService.__super__.constructor.call(this),this.cache=this.cacheFactory("httpget")}return extend(HttpService,superClass),HttpService.$inject=["$http","$q","$tgStorage","$rootScope","$cacheFactory","$translate"],HttpService.prototype.headers=function(){var headers,lang,token;return headers={},token=this.storage.get("token"),token&&(headers.Authorization="Bearer "+token),lang=this.translate.preferredLanguage(),lang&&(headers["Accept-Language"]=lang),headers},HttpService.prototype.request=function(options){return options.headers=_.merge({},options.headers||{},this.headers()),this.http(options)},HttpService.prototype.get=function(url,params,options){return options=_.merge({method:"GET",url:url},options),params&&(options.params=params),options.cache=this.cache,this.request(options)["finally"](function(_this){return function(data){return _this.cache.removeAll()}}(this))},HttpService.prototype.post=function(url,data,params,options){return options=_.merge({method:"POST",url:url},options),data&&(options.data=data),params&&(options.params=params),this.request(options)},HttpService.prototype.put=function(url,data,params,options){return options=_.merge({method:"PUT",url:url},options),data&&(options.data=data),params&&(options.params=params),this.request(options)},HttpService.prototype.patch=function(url,data,params,options){return options=_.merge({method:"PATCH",url:url},options),data&&(options.data=data),params&&(options.params=params),this.request(options)},HttpService.prototype["delete"]=function(url,data,params,options){return options=_.merge({method:"DELETE",url:url},options),data&&(options.data=data),params&&(options.params=params),this.request(options)},HttpService}(taiga.Service),module=angular.module("taigaBase"),module.service("$tgHttp",HttpService)}.call(this),function(){var locationFactory,module;locationFactory=function($location,$route,$rootscope){return $location.noreload=function(scope){var lastRoute,un;return lastRoute=$route.current,un=scope.$on("$locationChangeSuccess",function(){return $route.current=lastRoute,un()}),$location},$location.isInCurrentRouteParams=function(name,value){var params;return params=$location.search()||{},params[name]===value},$location},module=angular.module("taigaBase"),module.factory("$tgLocation",["$location","$route","$rootScope",locationFactory])}.call(this),function(){var Model,ModelService,module,provider,taiga,indexOf=[].indexOf||function(item){for(var i=0,l=this.length;l>i;i++)if(i in this&&this[i]===item)return i;return-1},extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;Model=function(){function Model(name,data,dataTypes){this._attrs=data,this._name=name,this._dataTypes=dataTypes,this.setAttrs(data),this.initialize()}return Model.prototype.clone=function(){var instance;return instance=new Model(this._name,this._attrs,this._dataTypes),instance._modifiedAttrs=this._modifiedAttrs,instance._isModified=this._isModified,instance},Model.prototype.applyCasts=function(){var attrName,castMethod,castName,ref,results;ref=this._dataTypes,results=[];for(attrName in ref)castName=ref[attrName],castMethod=service.casts[castName],castMethod&&results.push(this._attrs[attrName]=castMethod(this._attrs[attrName]));return results},Model.prototype.getIdAttrName=function(){return"id"},Model.prototype.getName=function(){return this._name},Model.prototype.getAttrs=function(patch){return null==patch&&(patch=!1),null!=this._attrs.version&&(this._modifiedAttrs.version=this._attrs.version),patch?_.extend({},this._modifiedAttrs):_.extend({},this._attrs,this._modifiedAttrs)},Model.prototype.setAttrs=function(attrs){return this._attrs=attrs,this._modifiedAttrs={},this.applyCasts(),this._isModified=!1},Model.prototype.setAttr=function(name,value){return this._modifiedAttrs[name]=value,this._isModified=!0},Model.prototype.initialize=function(){var getter,self,setter;return self=this,getter=function(name){return function(){return"string"==typeof name&&"__"===name.substr(0,2)?self[name]:indexOf.call(_.keys(self._modifiedAttrs),name)<0?self._attrs[name]:self._modifiedAttrs[name]}},setter=function(name){return function(value){return"string"==typeof name&&"__"===name.substr(0,2)?void(self[name]=value):void(self._attrs[name]!==value?(self._modifiedAttrs[name]=value,self._isModified=!0):delete self._modifiedAttrs[name])}},_.each(this._attrs,function(value,name){var options;return options={get:getter(name),set:setter(name),enumerable:!0,configurable:!0},Object.defineProperty(self,name,options)})},Model.prototype.serialize=function(){var data;return data={data:_.clone(this._attrs),name:this._name},JSON.stringify(data)},Model.prototype.isModified=function(){return this._isModified},Model.prototype.isAttributeModified=function(attribute){return null!=this._modifiedAttrs[attribute]},Model.prototype.markSaved=function(){return this._isModified=!1,this._attrs=this.getAttrs(),this._modifiedAttrs={}},Model.prototype.revert=function(){return this._modifiedAttrs={},this._isModified=!1},Model.desSerialize=function(sdata){var ddata,model;return ddata=JSON.parse(sdata),model=new Model(ddata.url,ddata.data)},Model}(),taiga=this.taiga,ModelService=function(superClass){function ModelService(q,urls,storage,http){this.q=q,this.urls=urls,this.storage=storage,this.http=http,ModelService.__super__.constructor.call(this)}return extend(ModelService,superClass),ModelService.$inject=["$q","$tgUrls","$tgStorage","$tgHttp"],ModelService}(taiga.Service),provider=function($q,$http,$gmUrls,$gmStorage){var service;return service={},service.make_model=function(name,data,cls,dataTypes){return null==cls&&(cls=Model),null==dataTypes&&(dataTypes={}),new cls(name,data,dataTypes)},service.cls=Model,service.casts={"int":function(value){return parseInt(value,10)},"float":function(value){return parseFloat(value,10)}},service},module=angular.module("taigaBase"),module.factory("$tgModel",["$q","$http","$tgUrls","$tgStorage",provider])}.call(this),function(){var NavigationUrlsDirective,NavigationUrlsService,bindOnce,module,taiga,trim,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,trim=this.taiga.trim,bindOnce=this.taiga.bindOnce,module=angular.module("taigaBase"),NavigationUrlsService=function(superClass){function NavigationUrlsService(){this.urls={}}return extend(NavigationUrlsService,superClass),NavigationUrlsService.prototype.update=function(urls){return this.urls=_.merge({},this.urls,urls||{})},NavigationUrlsService.prototype.formatUrl=function(url,ctx){var replacer;return null==ctx&&(ctx={}),replacer=function(match){return match=trim(match,":"),ctx[match]||"undefined"},url.replace(/(:\w+)/g,replacer)},NavigationUrlsService.prototype.resolve=function(name,ctx){var url;return url=this.urls[name],url?ctx?this.formatUrl(url,ctx):url:""},NavigationUrlsService}(taiga.Service),module.service("$tgNavUrls",NavigationUrlsService),NavigationUrlsDirective=function($navurls,$auth,$q,$location){var bindOnceP,link,parseNav;return bindOnceP=function($scope,attr){var defered;return defered=$q.defer(),bindOnce($scope,attr,function(v){return defered.resolve(v)}),defered.promise},parseNav=function(data,$scope){var index,name,obj,params,promises,ref,result,values;if(ref=_.map(data.split(":"),trim),name=ref[0],params=ref[1],params)for(result=params.split(/(\w+)=/),result=_.filter(result,function(str){return str.length}),result=_.map(result,function(str){return trim(str.replace(/,$/g,""))}),params=[],index=0;indexi;i++)param=params[i],key=Object.keys(param)[0],value=param[key],options[key]=$scope.$eval(value);return[name,options]})},link=function($scope,$el,$attrs){return $el.is("a")&&$el.attr("href","#"),$el.on("mouseenter",function(event){var target;return target=$(event.currentTarget),target.data("fullUrl")&&$attrs.tgNavGetParams===target.data("params")?void 0:parseNav($attrs.tgNav,$scope).then(function(result){var fullUrl,getURLParams,getURLParamsStr,name,options,url,user;return name=result[0],options=result[1],user=$auth.getUser(),user&&(options.user=user.username),url=$navurls.resolve(name),fullUrl=$navurls.formatUrl(url,options),$attrs.tgNavGetParams&&(getURLParams=JSON.parse($attrs.tgNavGetParams),getURLParamsStr=$.param(getURLParams),fullUrl=fullUrl+"?"+getURLParamsStr,target.data("params",$attrs.tgNavGetParams)),target.data("fullUrl",fullUrl),target.is("a")&&target.attr("href",fullUrl),$el.on("click",function(event){if(!event.metaKey&&!event.ctrlKey&&(event.preventDefault(),target=$(event.currentTarget),!target.hasClass("noclick")))switch(fullUrl=target.data("fullUrl"),event.which){case 1:return $location.url(fullUrl),$scope.$apply();case 2:return window.open(fullUrl)}})})}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgNav",["$tgNavUrls","$tgAuth","$q","$tgLocation",NavigationUrlsDirective])}.call(this),function(){var RepositoryService,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,RepositoryService=function(superClass){function RepositoryService(q,model1,storage,http,urls){this.q=q,this.model=model1,this.storage=storage,this.http=http,this.urls=urls,RepositoryService.__super__.constructor.call(this)}return extend(RepositoryService,superClass),RepositoryService.$inject=["$q","$tgModel","$tgStorage","$tgHttp","$tgUrls"],RepositoryService.prototype.resolveUrlForModel=function(model){var idAttrName;return idAttrName=model.getIdAttrName(),this.urls.resolve(model.getName())+"/"+model[idAttrName]},RepositoryService.prototype.resolveUrlForAttributeModel=function(model){return this.urls.resolve(model.getName(),model.parent)},RepositoryService.prototype.create=function(name,data,dataTypes,extraParams){var defered,promise,url;return null==dataTypes&&(dataTypes={}),null==extraParams&&(extraParams={}),defered=this.q.defer(),url=this.urls.resolve(name),promise=this.http.post(url,JSON.stringify(data)),promise.success(function(_this){return function(_data,_status){return defered.resolve(_this.model.make_model(name,_data,null,dataTypes))}}(this)),promise.error(function(_this){return function(data,status){return defered.reject(data)}}(this)),defered.promise},RepositoryService.prototype.remove=function(model,params){var defered,promise,url;return null==params&&(params={}),defered=this.q.defer(),url=this.resolveUrlForModel(model),promise=this.http["delete"](url,{},params),promise.success(function(data,status){return defered.resolve(model)}),promise.error(function(data,status){return defered.reject(model)}),defered.promise},RepositoryService.prototype.saveAll=function(models,patch){var promises;return null==patch&&(patch=!0),promises=_.map(models,function(_this){return function(x){return _this.save(x,!0)}}(this)),this.q.all(promises)},RepositoryService.prototype.save=function(model,patch){var data,defered,promise,url;return null==patch&&(patch=!0),defered=this.q.defer(),!model.isModified()&&patch?(defered.resolve(model),defered.promise):(url=this.resolveUrlForModel(model),data=JSON.stringify(model.getAttrs(patch)),promise=patch?this.http.patch(url,data):this.http.put(url,data),promise.success(function(_this){return function(data,status){return model._isModified=!1,model._attrs=_.extend(model.getAttrs(),data),model._modifiedAttrs={},model.applyCasts(),defered.resolve(model)}}(this)),promise.error(function(data,status){return defered.reject(data)}),defered.promise)},RepositoryService.prototype.saveAttribute=function(model,attribute,patch){var data,defered,promise,url;return null==patch&&(patch=!0),defered=this.q.defer(),!model.isModified()&&patch?(defered.resolve(model),defered.promise):(url=this.resolveUrlForAttributeModel(model),data={},data[attribute]=model.getAttrs(),promise=patch?this.http.patch(url,data):this.http.put(url,data),promise.success(function(_this){return function(data,status){return model._isModified=!1,model._attrs=_.extend(model.getAttrs(),data),model._modifiedAttrs={},model.applyCasts(),defered.resolve(model)}}(this)),promise.error(function(data,status){return defered.reject(data)}),defered.promise)},RepositoryService.prototype.refresh=function(model){var defered,promise,url;return defered=this.q.defer(),url=this.resolveUrlForModel(model),promise=this.http.get(url),promise.success(function(data,status){return model._modifiedAttrs={},model._attrs=data,model._isModified=!1,model.applyCasts(),defered.resolve(model)}),promise.error(function(data,status){return defered.reject(data)}),defered.promise},RepositoryService.prototype.queryMany=function(name,params,options,headers){var httpOptions,url;return null==options&&(options={}),null==headers&&(headers=!1),url=this.urls.resolve(name),httpOptions={headers:{}},options.enablePagination||(httpOptions.headers["x-disable-pagination"]="1"),this.http.get(url,params,httpOptions).then(function(_this){return function(data){var result;return result=_.map(data.data,function(x){return _this.model.make_model(name,x)}),headers?[result,data.headers]:result}}(this))},RepositoryService.prototype.queryOneAttribute=function(name,id,attribute,params,options){var httpOptions,url;return null==options&&(options={}),url=this.urls.resolve(name,id),httpOptions={headers:{}},options.enablePagination||(httpOptions.headers["x-disable-pagination"]="1"),this.http.get(url,params,httpOptions).then(function(_this){return function(data){var model;return model=_this.model.make_model(name,data.data[attribute]),model.parent=id,model}}(this))},RepositoryService.prototype.queryOne=function(name,id,params,options){var httpOptions,url;return null==options&&(options={}),url=this.urls.resolve(name),id&&(url=url+"/"+id),httpOptions={headers:{}},options.enablePagination||(httpOptions.headers["x-disable-pagination"]="1"),this.http.get(url,params,httpOptions).then(function(_this){return function(data){return _this.model.make_model(name,data.data)}}(this))},RepositoryService.prototype.queryOneRaw=function(name,id,params,options){var httpOptions,url;return null==options&&(options={}),url=this.urls.resolve(name),id&&(url=url+"/"+id),httpOptions=_.merge({headers:{}},options),options.enablePagination||(httpOptions.headers["x-disable-pagination"]="1"),this.http.get(url,params,httpOptions).then(function(_this){return function(data){return data.data}}(this))},RepositoryService.prototype.queryPaginated=function(name,params,options){var httpOptions,url;return null==options&&(options={}),url=this.urls.resolve(name),httpOptions=_.merge({headers:{}},options),this.http.get(url,params,httpOptions).then(function(_this){return function(data){var headers,result;return headers=data.headers(),result={},result.models=_.map(data.data,function(x){return _this.model.make_model(name,x)}),result.count=parseInt(headers["x-pagination-count"],10),result.current=parseInt(headers["x-pagination-current"]||1,10),result.paginatedBy=parseInt(headers["x-paginated-by"],10),result}}(this))},RepositoryService.prototype.queryOnePaginatedRaw=function(name,id,params,options){var httpOptions,url;return null==options&&(options={}),url=this.urls.resolve(name),id&&(url=url+"/"+id),httpOptions=_.merge({headers:{}},options),this.http.get(url,params,httpOptions).then(function(_this){return function(data){var headers,result;return headers=data.headers(),result={},result.data=data.data,result.count=parseInt(headers["x-pagination-count"],10),result.current=parseInt(headers["x-pagination-current"]||1,10),result.paginatedBy=parseInt(headers["x-paginated-by"],10),result}}(this))},RepositoryService.prototype.resolve=function(options){var cache,params;return params={},null!=options.pslug&&(params.project=options.pslug),null!=options.usref&&(params.us=options.usref),null!=options.taskref&&(params.task=options.taskref),null!=options.issueref&&(params.issue=options.issueref),null!=options.sslug&&(params.milestone=options.sslug),null!=options.wikipage&&(params.wikipage=options.wikipage),cache=!(options.wikipage||options.sslug),this.queryOneRaw("resolver",null,params,{cache:cache})},RepositoryService}(taiga.Service),module=angular.module("taigaBase"),module.service("$tgRepo",RepositoryService)}.call(this),function(){var StorageService,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,StorageService=function(superClass){function StorageService($rootScope){StorageService.__super__.constructor.call(this)}return extend(StorageService,superClass),StorageService.$inject=["$rootScope"],StorageService.prototype.get=function(key,_default){var serializedValue;return serializedValue=localStorage.getItem(key),null===serializedValue?_default||null:JSON.parse(serializedValue)},StorageService.prototype.set=function(key,val){return _.isObject(key)?_.each(key,function(_this){return function(val,key){return _this.set(key,val)}}(this)):localStorage.setItem(key,JSON.stringify(val))},StorageService.prototype.contains=function(key){var value;return value=this.get(key),null!==value},StorageService.prototype.remove=function(key){return localStorage.removeItem(key)},StorageService.prototype.clear=function(){return localStorage.clear()},StorageService}(taiga.Service),module=angular.module("taigaBase"),module.service("$tgStorage",StorageService)}.call(this),function(){var UrlsService,format,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;format=function(fmt,obj){return obj=_.clone(obj),fmt.replace(/%s/g,function(match){return String(obj.shift())})},taiga=this.taiga,UrlsService=function(superClass){function UrlsService(config){this.config=config,this.urls={},this.mainUrl=this.config.get("api")}return extend(UrlsService,superClass),UrlsService.$inject=["$tgConfig"],UrlsService.prototype.update=function(urls){return this.urls=_.merge(this.urls,urls)},UrlsService.prototype.resolve=function(){var args,name,url;if(args=_.toArray(arguments),0===args.length)throw Error("wrong arguments to setUrls");return name=args.slice(0,1)[0],url=format(this.urls[name],args.slice(1)),format("%s/%s",[_.str.rtrim(this.mainUrl,"/"),_.str.ltrim(url,"/")])},UrlsService.prototype.resolveAbsolute=function(){var url;return url=this.resolve.apply(this,arguments),/^https?:\/\//i.test(url)?url:/^\//.test(url)?window.location.protocol+"//"+window.location.host+url:window.location.protocol+"//"+window.location.host+"/"+url},UrlsService}(taiga.Service),module=angular.module("taigaBase"),module.service("$tgUrls",UrlsService)}.call(this),function(){var module,resourceProvider,taiga;taiga=this.taiga,resourceProvider=function($repo){var _get,service;return _get=function(objectId,resource){return $repo.queryOne(resource,objectId)},service={userstory:{get:function(objectId){return _get(objectId,"custom-attributes-values/userstory")}},task:{get:function(objectId){return _get(objectId,"custom-attributes-values/task")}},issue:{get:function(objectId){return _get(objectId,"custom-attributes-values/issue")}}},function(instance){return instance.customAttributesValues=service}},module=angular.module("taigaResources"),module.factory("$tgCustomAttributesValuesResourcesProvider",["$tgRepo",resourceProvider])}.call(this),function(){var module,resourceProvider,sizeFormat,taiga;taiga=this.taiga,sizeFormat=this.taiga.sizeFormat,resourceProvider=function($repo){var _list,service;return _list=function(projectId,resource){return $repo.queryMany(resource,{project:projectId})},service={userstory:{list:function(projectId){return _list(projectId,"custom-attributes/userstory")}},task:{list:function(projectId){return _list(projectId,"custom-attributes/task")}},issue:{list:function(projectId){return _list(projectId,"custom-attributes/issue")}}},function(instance){return instance.customAttributes=service}},module=angular.module("taigaResources"),module.factory("$tgCustomAttributesResourcesProvider",["$tgRepo",resourceProvider])}.call(this),function(){var module,resourceProvider,taiga;taiga=this.taiga,resourceProvider=function($repo,$http,$urls){var service;return service={},service.get=function(type,objectId){return $repo.queryOneRaw("history/"+type,objectId)},service.deleteComment=function(type,objectId,activityId){var params,url;return url=$urls.resolve("history/"+type),url=url+"/"+objectId+"/delete_comment",params={id:activityId},$http.post(url,null,params).then(function(_this){return function(data){return data.data}}(this))},service.undeleteComment=function(type,objectId,activityId){var params,url;return url=$urls.resolve("history/"+type),url=url+"/"+objectId+"/undelete_comment",params={id:activityId},$http.post(url,null,params).then(function(_this){return function(data){return data.data}}(this))},function(instance){return instance.history=service}},module=angular.module("taigaResources"),module.factory("$tgHistoryResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",resourceProvider])}.call(this),function(){var module,resourceProvider,taiga;taiga=this.taiga,resourceProvider=function($repo){var service;return service={},service.get=function(token){return $repo.queryOne("invitations",token)},function(instance){return instance.invitations=service}},module=angular.module("taigaResources"),module.factory("$tgInvitationsResourcesProvider",["$tgRepo",resourceProvider])}.call(this),function(){var generateHash,module,resourceProvider,taiga;taiga=this.taiga,generateHash=taiga.generateHash,resourceProvider=function($repo,$http,$urls,$storage,$q){var filtersHashSuffix,hashSuffix,myFiltersHashSuffix,service;return service={},hashSuffix="issues-queryparams",filtersHashSuffix="issues-filters",myFiltersHashSuffix="issues-my-filters",service.get=function(projectId,issueId){var params;return params=service.getQueryParams(projectId),params.project=projectId,$repo.queryOne("issues",issueId,params)},service.getByRef=function(projectId,ref){var params;return params=service.getQueryParams(projectId),params.project=projectId,params.ref=ref,$repo.queryOne("issues","by_ref",params)},service.listInAllProjects=function(filters){return $repo.queryMany("issues",filters)},service.list=function(projectId,filters,options){var params;return params={project:projectId},params=_.extend({},params,filters||{}),service.storeQueryParams(projectId,params),$repo.queryPaginated("issues",params,options)},service.bulkCreate=function(projectId,data){var params,url;return url=$urls.resolve("bulk-create-issues"),params={project_id:projectId,bulk_issues:data},$http.post(url,params)},service.upvote=function(issueId){var url;return url=$urls.resolve("issue-upvote",issueId),$http.post(url)},service.downvote=function(issueId){var url;return url=$urls.resolve("issue-downvote",issueId),$http.post(url)},service.watch=function(issueId){var url;return url=$urls.resolve("issue-watch",issueId),$http.post(url)},service.unwatch=function(issueId){var url;return url=$urls.resolve("issue-unwatch",issueId),$http.post(url)},service.stats=function(projectId){return $repo.queryOneRaw("projects",projectId+"/issues_stats")},service.filtersData=function(params){return $repo.queryOneRaw("issues-filters",null,params)},service.listValues=function(projectId,type){var params;return params={project:projectId},service.storeQueryParams(projectId,params),$repo.queryMany(type,params)},service.storeQueryParams=function(projectId,params){var hash,ns;return ns=projectId+":"+hashSuffix,hash=generateHash([projectId,ns]),$storage.set(hash,params)},service.getQueryParams=function(projectId){var hash,ns;return ns=projectId+":"+hashSuffix,hash=generateHash([projectId,ns]),$storage.get(hash)||{}},service.storeFilters=function(projectSlug,params){var hash,ns;return ns=projectSlug+":"+filtersHashSuffix,hash=generateHash([projectSlug,ns]),$storage.set(hash,params)},service.getFilters=function(projectSlug){var hash,ns;return ns=projectSlug+":"+filtersHashSuffix,hash=generateHash([projectSlug,ns]),$storage.get(hash)||{}},service.storeMyFilters=function(projectId,myFilters){var deferred,hash,ns,promise,url;return deferred=$q.defer(),url=$urls.resolve("user-storage"),ns=projectId+":"+myFiltersHashSuffix,hash=generateHash([projectId,ns]),_.isEmpty(myFilters)?(promise=$http["delete"](url+"/"+hash,{key:hash,value:myFilters}),promise.then(function(){return deferred.resolve()}),promise.then(null,function(){return deferred.reject()})):(promise=$http.put(url+"/"+hash,{key:hash,value:myFilters}),promise.then(function(data){return deferred.resolve()}),promise.then(null,function(data){var innerPromise;return innerPromise=$http.post(""+url,{key:hash,value:myFilters}),innerPromise.then(function(){return deferred.resolve()}),innerPromise.then(null,function(){return deferred.reject()})})),deferred.promise},service.getMyFilters=function(projectId){var deferred,hash,ns,promise,url;return deferred=$q.defer(),url=$urls.resolve("user-storage"),ns=projectId+":"+myFiltersHashSuffix,hash=generateHash([projectId,ns]),promise=$http.get(url+"/"+hash),promise.then(function(data){return deferred.resolve(data.data.value)}),promise.then(null,function(data){return deferred.resolve({})}),deferred.promise},function(instance){return instance.issues=service}},module=angular.module("taigaResources"),module.factory("$tgIssuesResourcesProvider",["$tgRepo","$tgHttp","$tgUrls","$tgStorage","$q",resourceProvider])}.call(this),function(){var generateHash,module,resourceProvider,taiga;taiga=this.taiga,generateHash=taiga.generateHash,resourceProvider=function($storage){var hashSuffixStatusColumnModes,hashSuffixStatusViewModes,service;return service={},hashSuffixStatusViewModes="kanban-statusviewmodels",hashSuffixStatusColumnModes="kanban-statuscolumnmodels",service.storeStatusViewModes=function(projectId,params){var hash,ns;return ns=projectId+":"+hashSuffixStatusViewModes,hash=generateHash([projectId,ns]),$storage.set(hash,params)},service.getStatusViewModes=function(projectId){var hash,ns;return ns=projectId+":"+hashSuffixStatusViewModes,hash=generateHash([projectId,ns]),$storage.get(hash)||{}; -},service.storeStatusColumnModes=function(projectId,params){var hash,ns;return ns=projectId+":"+hashSuffixStatusColumnModes,hash=generateHash([projectId,ns]),$storage.set(hash,params)},service.getStatusColumnModes=function(projectId){var hash,ns;return ns=projectId+":"+hashSuffixStatusColumnModes,hash=generateHash([projectId,ns]),$storage.get(hash)||{}},function(instance){return instance.kanban=service}},module=angular.module("taigaResources"),module.factory("$tgKanbanResourcesProvider",["$tgStorage",resourceProvider])}.call(this),function(){var module,resourceProvider,sizeFormat,taiga;taiga=this.taiga,sizeFormat=this.taiga.sizeFormat,resourceProvider=function($repo){var service;return service={list:function(){return $repo.queryMany("locales")}},function(instance){return instance.locales=service}},module=angular.module("taigaResources"),module.factory("$tgLocalesResourcesProvider",["$tgRepo",resourceProvider])}.call(this),function(){var module,resourceProvider,taiga;taiga=this.taiga,resourceProvider=function($repo,$urls,$http){var service;return service={},service.render=function(projectId,content){var params,url;return(null==content||""===content)&&(content=" "),params={project_id:projectId,content:content},url=$urls.resolve("wiki"),$http.post(url+"/render",params).then(function(_this){return function(data){return data.data}}(this))},function(instance){return instance.mdrender=service}},module=angular.module("taigaResources"),module.factory("$tgMdRenderResourcesProvider",["$tgRepo","$tgUrls","$tgHttp",resourceProvider])}.call(this),function(){var module,resourceProvider,taiga;taiga=this.taiga,resourceProvider=function($repo,$http,$urls){var service;return service={},service.get=function(id){return $repo.queryOne("memberships",id)},service.list=function(projectId,filters,enablePagination){var options,params;return null==enablePagination&&(enablePagination=!0),params={project:projectId},params=_.extend({},params,filters||{}),enablePagination?$repo.queryPaginated("memberships",params):$repo.queryMany("memberships",params,options={enablePagination:enablePagination})},service.listByUser=function(userId,filters){var params;return params={user:userId},params=_.extend({},params,filters||{}),$repo.queryPaginated("memberships",params)},service.resendInvitation=function(id){var url;return url=$urls.resolve("memberships"),$http.post(url+"/"+id+"/resend_invitation",{})},service.bulkCreateMemberships=function(projectId,data,invitation_extra_text){var params,url;return url=$urls.resolve("bulk-create-memberships"),params={project_id:projectId,bulk_memberships:data,invitation_extra_text:invitation_extra_text},$http.post(url,params)},function(instance){return instance.memberships=service}},module=angular.module("taigaResources"),module.factory("$tgMembershipsResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",resourceProvider])}.call(this),function(){var module,resourceProvider;resourceProvider=function($repo){var service;return service={},service.list=function(projectId,module){return $repo.queryOneAttribute("project-modules",projectId,module)},function(instance){return instance.modules=service}},module=angular.module("taigaResources"),module.factory("$tgModulesResourcesProvider",["$tgRepo",resourceProvider])}.call(this),function(){var module,resourceProvider,taiga;taiga=this.taiga,resourceProvider=function($repo,$http,$urls){var service;return service={},service.get=function(id){return $repo.queryOne("notify-policies",id)},service.list=function(filters){var params;return params=_.extend({},params,filters||{}),$repo.queryMany("notify-policies",params)},function(instance){return instance.notifyPolicies=service}},module=angular.module("taigaResources"),module.factory("$tgNotifyPoliciesResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",resourceProvider])}.call(this),function(){var module,resourceProvider,sizeFormat,taiga;taiga=this.taiga,sizeFormat=this.taiga.sizeFormat,resourceProvider=function($config,$repo,$http,$urls,$auth,$q,$translate){var service;return service={},service.get=function(projectId){return $repo.queryOne("projects",projectId)},service.getBySlug=function(projectSlug){return $repo.queryOne("projects","by_slug?slug="+projectSlug)},service.list=function(){return $repo.queryMany("projects")},service.listByMember=function(memberId){var params;return params={member:memberId,order_by:"memberships__user_order"},$repo.queryMany("projects",params)},service.templates=function(){return $repo.queryMany("project-templates")},service.usersList=function(projectId){var params;return params={project:projectId},$repo.queryMany("users",params)},service.rolesList=function(projectId){var params;return params={project:projectId},$repo.queryMany("roles",params)},service.stats=function(projectId){return $repo.queryOneRaw("projects",projectId+"/stats")},service.bulkUpdateOrder=function(bulkData){var url;return url=$urls.resolve("bulk-update-projects-order"),$http.post(url,bulkData)},service.regenerate_userstories_csv_uuid=function(projectId){var url;return url=$urls.resolve("projects")+"/"+projectId+"/regenerate_userstories_csv_uuid",$http.post(url)},service.regenerate_issues_csv_uuid=function(projectId){var url;return url=$urls.resolve("projects")+"/"+projectId+"/regenerate_issues_csv_uuid",$http.post(url)},service.regenerate_tasks_csv_uuid=function(projectId){var url;return url=$urls.resolve("projects")+"/"+projectId+"/regenerate_tasks_csv_uuid",$http.post(url)},service.leave=function(projectId){var url;return url=$urls.resolve("projects")+"/"+projectId+"/leave",$http.post(url)},service.memberStats=function(projectId){return $repo.queryOneRaw("projects",projectId+"/member_stats")},service.tagsColors=function(projectId){return $repo.queryOne("projects",projectId+"/tags_colors")},service["export"]=function(projectId){var url;return url=$urls.resolve("exporter")+"/"+projectId,$http.get(url)},service["import"]=function(file,statusUpdater){var complete,data,defered,errorMsg,failed,maxFileSize,response,uploadComplete,uploadFailed,uploadProgress,xhr;return defered=$q.defer(),maxFileSize=$config.get("maxUploadFileSize",null),maxFileSize&&file.size>maxFileSize?(errorMsg=$translate.instant("PROJECT.IMPORT.ERROR_MAX_SIZE_EXCEEDED",{fileName:file.name,fileSize:sizeFormat(file.size),maxFileSize:sizeFormat(maxFileSize)}),response={status:413,data:{_error_message:errorMsg}},defered.reject(response),defered.promise):(uploadProgress=function(_this){return function(evt){var message,percent;return percent=Math.round(evt.loaded/evt.total*100),message=$translate.instant("PROJECT.IMPORT.UPLOAD_IN_PROGRESS_MESSAGE",{uploadedSize:sizeFormat(evt.loaded),totalSize:sizeFormat(evt.total)}),statusUpdater("in-progress",null,message,percent)}}(this),uploadComplete=function(_this){return function(evt){return statusUpdater("done",$translate.instant("PROJECT.IMPORT.TITLE"),$translate.instant("PROJECT.IMPORT.DESCRIPTION"))}}(this),uploadFailed=function(_this){return function(evt){return statusUpdater("error")}}(this),complete=function(_this){return function(evt){var ref;response={};try{response.data=JSON.parse(evt.target.responseText)}catch(error){response.data={}}return response.status=evt.target.status,(201===(ref=response.status)||202===ref)&&defered.resolve(response),defered.reject(response)}}(this),failed=function(_this){return function(evt){return defered.reject("fail")}}(this),data=new FormData,data.append("dump",file),xhr=new XMLHttpRequest,xhr.upload.addEventListener("progress",uploadProgress,!1),xhr.upload.addEventListener("load",uploadComplete,!1),xhr.upload.addEventListener("error",uploadFailed,!1),xhr.upload.addEventListener("abort",uploadFailed,!1),xhr.addEventListener("load",complete,!1),xhr.addEventListener("error",failed,!1),xhr.open("POST",$urls.resolve("importer")),xhr.setRequestHeader("Authorization","Bearer "+$auth.getToken()),xhr.setRequestHeader("Accept","application/json"),xhr.send(data),defered.promise)},service.changeLogo=function(projectId,file){var data,defered,maxFileSize,options,response,url;return maxFileSize=$config.get("maxUploadFileSize",null),maxFileSize&&file.size>maxFileSize?(response={status:413,data:{_error_message:"'"+file.name+"' ("+sizeFormat(file.size)+") is too heavy for our oompa loompas, try it with a smaller than ("+sizeFormat(maxFileSize)+")"}},defered=$q.defer(),defered.reject(response),defered.promise):(data=new FormData,data.append("logo",file),options={transformRequest:angular.identity,headers:{"Content-Type":void 0}},url=$urls.resolve("projects")+"/"+projectId+"/change_logo",$http.post(url,data,{},options))},service.removeLogo=function(projectId){var url;return url=$urls.resolve("projects")+"/"+projectId+"/remove_logo",$http.post(url)},function(instance){return instance.projects=service}},module=angular.module("taigaResources"),module.factory("$tgProjectsResourcesProvider",["$tgConfig","$tgRepo","$tgHttp","$tgUrls","$tgAuth","$q","$translate",resourceProvider])}.call(this),function(){var module,resourceProvider,taiga;taiga=this.taiga,resourceProvider=function($repo,$http,$urls){var service;return service={},service.get=function(id){return $repo.queryOne("roles",id)},service.list=function(projectId){return $repo.queryMany("roles",{project:projectId})},function(instance){return instance.roles=service}},module=angular.module("taigaResources"),module.factory("$tgRolesResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",resourceProvider])}.call(this),function(){var module,resourceProvider,taiga;taiga=this.taiga,resourceProvider=function($repo,$urls,$http,$q){var service;return service={},service["do"]=function(projectId,term){var deferredAbort,params,request,url;return deferredAbort=$q.defer(),url=$urls.resolve("search"),params={url:url,method:"GET",timeout:deferredAbort.promise,cancelable:!0,params:{project:projectId,text:term,get_all:!1}},request=$http.request(params).then(function(data){return data.data}),request.abort=function(){return deferredAbort.resolve()},request["finally"]=function(){return request.abort=angular.noop,deferredAbort=request=null},request},function(instance){return instance.search=service}},module=angular.module("taigaResources"),module.factory("$tgSearchResourcesProvider",["$tgRepo","$tgUrls","$tgHttp","$q",resourceProvider])}.call(this),function(){var generateHash,module,resourceProvider,taiga;taiga=this.taiga,generateHash=taiga.generateHash,resourceProvider=function($repo,$model,$storage){var service;return service={},service.get=function(projectId,sprintId){return $repo.queryOne("milestones",sprintId).then(function(sprint){var uses;return uses=sprint.user_stories,uses=_.map(uses,function(u){return $model.make_model("userstories",u)}),sprint._attrs.user_stories=uses,sprint})},service.stats=function(projectId,sprintId){return $repo.queryOneRaw("milestones",sprintId+"/stats")},service.list=function(projectId,filters){var params;return params={project:projectId},params=_.extend({},params,filters||{}),$repo.queryMany("milestones",params,{},!0).then(function(_this){return function(result){var headers,i,len,m,milestones,uses;for(milestones=result[0],headers=result[1],i=0,len=milestones.length;len>i;i++)m=milestones[i],uses=m.user_stories,uses=_.map(uses,function(u){return $model.make_model("userstories",u)}),m._attrs.user_stories=uses;return{milestones:milestones,closed:parseInt(headers("Taiga-Info-Total-Closed-Milestones"),10),open:parseInt(headers("Taiga-Info-Total-Opened-Milestones"),10)}}}(this))},function(instance){return instance.sprints=service}},module=angular.module("taigaResources"),module.factory("$tgSprintsResourcesProvider",["$tgRepo","$tgModel","$tgStorage",resourceProvider])}.call(this),function(){var generateHash,module,resourceProvider,taiga;taiga=this.taiga,generateHash=taiga.generateHash,resourceProvider=function($repo,$http,$urls,$storage){var hashSuffix,hashSuffixStatusColumnModes,hashSuffixUsRowModes,service;return service={},hashSuffix="tasks-queryparams",hashSuffixStatusColumnModes="tasks-statuscolumnmodels",hashSuffixUsRowModes="tasks-usrowmodels",service.get=function(projectId,taskId){var params;return params=service.getQueryParams(projectId),params.project=projectId,$repo.queryOne("tasks",taskId,params)},service.getByRef=function(projectId,ref){var params;return params=service.getQueryParams(projectId),params.project=projectId,params.ref=ref,$repo.queryOne("tasks","by_ref",params)},service.listInAllProjects=function(filters){return $repo.queryMany("tasks",filters)},service.list=function(projectId,sprintId,userStoryId){var params;return null==sprintId&&(sprintId=null),null==userStoryId&&(userStoryId=null),params={project:projectId},sprintId&&(params.milestone=sprintId),userStoryId&&(params.user_story=userStoryId),service.storeQueryParams(projectId,params),$repo.queryMany("tasks",params)},service.bulkCreate=function(projectId,sprintId,usId,data){var params,url;return url=$urls.resolve("bulk-create-tasks"),params={project_id:projectId,sprint_id:sprintId,us_id:usId,bulk_tasks:data},$http.post(url,params).then(function(result){return result.data})},service.upvote=function(taskId){var url;return url=$urls.resolve("task-upvote",taskId),$http.post(url)},service.downvote=function(taskId){var url;return url=$urls.resolve("task-downvote",taskId),$http.post(url)},service.watch=function(taskId){var url;return url=$urls.resolve("task-watch",taskId),$http.post(url)},service.unwatch=function(taskId){var url;return url=$urls.resolve("task-unwatch",taskId),$http.post(url)},service.bulkUpdateTaskTaskboardOrder=function(projectId,data){var params,url;return url=$urls.resolve("bulk-update-task-taskboard-order"),params={project_id:projectId,bulk_tasks:data},$http.post(url,params)},service.listValues=function(projectId,type){var params;return params={project:projectId},$repo.queryMany(type,params)},service.storeQueryParams=function(projectId,params){var hash,ns;return ns=projectId+":"+hashSuffix,hash=generateHash([projectId,ns]),$storage.set(hash,params)},service.getQueryParams=function(projectId){var hash,ns;return ns=projectId+":"+hashSuffix,hash=generateHash([projectId,ns]),$storage.get(hash)||{}},service.storeStatusColumnModes=function(projectId,params){var hash,ns;return ns=projectId+":"+hashSuffixStatusColumnModes,hash=generateHash([projectId,ns]),$storage.set(hash,params)},service.getStatusColumnModes=function(projectId){var hash,ns;return ns=projectId+":"+hashSuffixStatusColumnModes,hash=generateHash([projectId,ns]),$storage.get(hash)||{}},service.storeUsRowModes=function(projectId,sprintId,params){var hash,ns;return ns=projectId+":"+hashSuffixUsRowModes,hash=generateHash([projectId,sprintId,ns]),$storage.set(hash,params)},service.getUsRowModes=function(projectId,sprintId){var hash,ns;return ns=projectId+":"+hashSuffixUsRowModes,hash=generateHash([projectId,sprintId,ns]),$storage.get(hash)||{}},function(instance){return instance.tasks=service}},module=angular.module("taigaResources"),module.factory("$tgTasksResourcesProvider",["$tgRepo","$tgHttp","$tgUrls","$tgStorage",resourceProvider])}.call(this),function(){var module,resourceProvider,sizeFormat,taiga;taiga=this.taiga,sizeFormat=this.taiga.sizeFormat,resourceProvider=function($config,$repo,$http,$urls,$q){var service;return service={},service.changeAvatar=function(file){var data,defered,maxFileSize,options,response,url;return maxFileSize=$config.get("maxUploadFileSize",null),maxFileSize&&file.size>maxFileSize?(response={status:413,data:{_error_message:"'"+file.name+"' ("+sizeFormat(file.size)+") is too heavy for our oompa loompas, try it with a smaller than ("+sizeFormat(maxFileSize)+")"}},defered=$q.defer(),defered.reject(response),defered.promise):(data=new FormData,data.append("avatar",file),options={transformRequest:angular.identity,headers:{"Content-Type":void 0}},url=$urls.resolve("users")+"/change_avatar",$http.post(url,data,{},options))},service.removeAvatar=function(){var url;return url=$urls.resolve("users")+"/remove_avatar",$http.post(url)},service.changePassword=function(currentPassword,newPassword){var data,url;return url=$urls.resolve("users")+"/change_password",data={current_password:currentPassword,password:newPassword},$http.post(url,data)},function(instance){return instance.userSettings=service}},module=angular.module("taigaResources"),module.factory("$tgUserSettingsResourcesProvider",["$tgConfig","$tgRepo","$tgHttp","$tgUrls","$q",resourceProvider])}.call(this),function(){var module,resourceProvider,sizeFormat,taiga;taiga=this.taiga,sizeFormat=this.taiga.sizeFormat,resourceProvider=function($http,$urls){var service;return service={},service.contacts=function(userId,options){var httpOptions,url;return null==options&&(options={}),url=$urls.resolve("user-contacts",userId),httpOptions={headers:{}},options.enablePagination||(httpOptions.headers["x-disable-pagination"]="1"),$http.get(url,{},httpOptions).then(function(result){return result.data})},function(instance){return instance.users=service}},module=angular.module("taigaResources"),module.factory("$tgUsersResourcesProvider",["$tgHttp","$tgUrls","$q",resourceProvider])}.call(this),function(){var generateHash,module,resourceProvider,taiga;taiga=this.taiga,generateHash=taiga.generateHash,resourceProvider=function($repo,$http,$urls,$storage){var hashSuffix,service;return service={},hashSuffix="userstories-queryparams",service.get=function(projectId,usId){var params;return params=service.getQueryParams(projectId),params.project=projectId,$repo.queryOne("userstories",usId,params)},service.getByRef=function(projectId,ref){var params;return params=service.getQueryParams(projectId),params.project=projectId,params.ref=ref,$repo.queryOne("userstories","by_ref",params)},service.listInAllProjects=function(filters){return $repo.queryMany("userstories",filters)},service.filtersData=function(params){return $repo.queryOneRaw("userstories-filters",null,params)},service.listUnassigned=function(projectId,filters){var params;return params={project:projectId,milestone:"null"},params=_.extend({},params,filters||{}),service.storeQueryParams(projectId,params),$repo.queryMany("userstories",params)},service.listAll=function(projectId,filters){var params;return params={project:projectId},params=_.extend({},params,filters||{}),service.storeQueryParams(projectId,params),$repo.queryMany("userstories",params)},service.bulkCreate=function(projectId,status,bulk){var data,url;return data={project_id:projectId,status_id:status,bulk_stories:bulk},url=$urls.resolve("bulk-create-us"),$http.post(url,data)},service.upvote=function(userStoryId){var url;return url=$urls.resolve("userstory-upvote",userStoryId),$http.post(url)},service.downvote=function(userStoryId){var url;return url=$urls.resolve("userstory-downvote",userStoryId),$http.post(url)},service.watch=function(userStoryId){var url;return url=$urls.resolve("userstory-watch",userStoryId),$http.post(url)},service.unwatch=function(userStoryId){var url;return url=$urls.resolve("userstory-unwatch",userStoryId),$http.post(url)},service.bulkUpdateBacklogOrder=function(projectId,data){var params,url;return url=$urls.resolve("bulk-update-us-backlog-order"),params={project_id:projectId,bulk_stories:data},$http.post(url,params)},service.bulkUpdateSprintOrder=function(projectId,data){var params,url;return url=$urls.resolve("bulk-update-us-sprint-order"),params={project_id:projectId,bulk_stories:data},$http.post(url,params)},service.bulkUpdateKanbanOrder=function(projectId,data){var params,url;return url=$urls.resolve("bulk-update-us-kanban-order"),params={project_id:projectId,bulk_stories:data},$http.post(url,params)},service.listValues=function(projectId,type){var params;return params={project:projectId},service.storeQueryParams(projectId,params),$repo.queryMany(type,params)},service.storeQueryParams=function(projectId,params){var hash,ns;return ns=projectId+":"+hashSuffix,hash=generateHash([projectId,ns]),$storage.set(hash,params)},service.getQueryParams=function(projectId){var hash,ns;return ns=projectId+":"+hashSuffix,hash=generateHash([projectId,ns]),$storage.get(hash)||{}},service.storeShowTags=function(projectId,showTags){var hash;return hash=generateHash([projectId,"showTags"]),$storage.set(hash,showTags)},service.getShowTags=function(projectId){var hash;return hash=generateHash([projectId,"showTags"]),$storage.get(hash)||null},function(instance){return instance.userstories=service}},module=angular.module("taigaResources"),module.factory("$tgUserstoriesResourcesProvider",["$tgRepo","$tgHttp","$tgUrls","$tgStorage",resourceProvider])}.call(this),function(){var module,resourceProvider;resourceProvider=function($repo,$urls,$http){var service;return service={},service.list=function(webhookId){var params;return params={webhook:webhookId},$repo.queryMany("webhooklogs",params)},service.resend=function(webhooklogId){var url;return url=$urls.resolve("webhooklogs-resend",webhooklogId),$http.post(url)},function(instance){return instance.webhooklogs=service}},module=angular.module("taigaResources"),module.factory("$tgWebhookLogsResourcesProvider",["$tgRepo","$tgUrls","$tgHttp",resourceProvider])}.call(this),function(){var module,resourceProvider;resourceProvider=function($repo,$urls,$http){var service;return service={},service.list=function(projectId){var params;return params={project:projectId},$repo.queryMany("webhooks",params)},service.test=function(webhookId){var url;return url=$urls.resolve("webhooks-test",webhookId),$http.post(url)},function(instance){return instance.webhooks=service}},module=angular.module("taigaResources"),module.factory("$tgWebhooksResourcesProvider",["$tgRepo","$tgUrls","$tgHttp",resourceProvider])}.call(this),function(){var module,resourceProvider,taiga;taiga=this.taiga,resourceProvider=function($repo,$http,$urls){var service;return service={},service.get=function(wikiId){return $repo.queryOne("wiki",wikiId)},service.getBySlug=function(projectId,slug){return $repo.queryOne("wiki","by_slug?project="+projectId+"&slug="+slug)},service.listLinks=function(projectId){return $repo.queryMany("wiki-links",{project:projectId})},function(instance){return instance.wiki=service}},module=angular.module("taigaResources"),module.factory("$tgWikiResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",resourceProvider])}.call(this),function(){var UserChangePasswordController,UserChangePasswordDirective,debounce,mixOf,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,debounce=this.taiga.debounce,module=angular.module("taigaUserSettings"),UserChangePasswordController=function(superClass){function UserChangePasswordController(scope,rootscope,repo,confirm,rs,params,q,location,navUrls,auth,translate){this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.navUrls=navUrls,this.auth=auth,this.translate=translate,this.scope.sectionName=this.translate.instant("CHANGE_PASSWORD.SECTION_NAME"),this.scope.user=this.auth.getUser()}return extend(UserChangePasswordController,superClass),UserChangePasswordController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth","$translate"],UserChangePasswordController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("UserChangePasswordController",UserChangePasswordController),UserChangePasswordDirective=function($rs,$confirm,$loading,$translate){var link;return link=function($scope,$el,$attrs,ctrl){var submit,submitButton;return submit=debounce(2e3,function(_this){return function(event){var currentLoading,promise;return event.preventDefault(),$scope.newPassword1!==$scope.newPassword2?void $confirm.notify("error",$translate.instant("CHANGE_PASSWORD.ERROR_PASSWORD_MATCH")):(currentLoading=$loading().target(submitButton).start(),promise=$rs.userSettings.changePassword($scope.currentPassword,$scope.newPassword1),promise.then(function(){return currentLoading.finish(),$confirm.notify("success")}),promise.then(null,function(response){return currentLoading.finish(),$confirm.notify("error",response.data._error_message)}))}}(this)),submitButton=$el.find(".submit-button"),$el.on("submit","form",submit),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgUserChangePassword",["$tgResources","$tgConfirm","$tgLoading","$translate",UserChangePasswordDirective])}.call(this),function(){var DeleteUserDirective,bindOnce,debounce,module,taiga;taiga=this.taiga,bindOnce=this.taiga.bindOnce,debounce=this.taiga.debounce,module=angular.module("taigaUserSettings"),DeleteUserDirective=function($repo,$rootscope,$auth,$location,$navUrls,lightboxService){var link;return link=function($scope,$el,$attrs){var submit;return $scope.$on("deletelightbox:new",function(ctx,user){return lightboxService.open($el)}),$scope.$on("$destroy",function(){return $el.off()}),submit=function(){var promise;return promise=$repo.remove($scope.user),promise.then(function(data){return lightboxService.close($el),$auth.logout(),$location.path($navUrls.resolve("login"))}),promise.then(null,function(){return console.log("FAIL")})},$el.on("click",".button-red",function(event){return event.preventDefault(),lightboxService.close($el)}),$el.on("click",".button-green",debounce(2e3,function(event){return event.preventDefault(),submit()}))},{link:link,templateUrl:"user/lightbox/lightbox-delete-account.html"}},module.directive("tgLbDeleteUser",["$tgRepo","$rootScope","$tgAuth","$tgLocation","$tgNavUrls","lightboxService",DeleteUserDirective])}.call(this),function(){var TaigaAvatarModelDirective,UserAvatarDirective,UserProfileDirective,UserSettingsController,debounce,mixOf,module,sizeFormat,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,sizeFormat=this.taiga.sizeFormat,module=angular.module("taigaUserSettings"),debounce=this.taiga.debounce,UserSettingsController=function(superClass){function UserSettingsController(scope,rootscope,config,repo,confirm,rs,params,q,location,navUrls,auth,translate){var maxFileSize,promise,text;this.scope=scope,this.rootscope=rootscope,this.config=config,this.repo=repo,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.navUrls=navUrls,this.auth=auth,this.translate=translate,this.scope.sectionName="USER_SETTINGS.MENU.SECTION_TITLE",this.scope.project={},this.scope.user=this.auth.getUser(),this.scope.user||(this.location.path(this.navUrls.resolve("permission-denied")),this.location.replace()),this.scope.lang=this.getLan(),this.scope.theme=this.getTheme(),maxFileSize=this.config.get("maxUploadFileSize",null),maxFileSize&&(text=this.translate.instant("USER_SETTINGS.AVATAR_MAX_SIZE",{maxFileSize:sizeFormat(maxFileSize)}),this.scope.maxFileSizeMsg=text),promise=this.loadInitialData(),promise.then(null,this.onInitialDataError.bind(this))}return extend(UserSettingsController,superClass),UserSettingsController.$inject=["$scope","$rootScope","$tgConfig","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth","$translate"],UserSettingsController.prototype.loadInitialData=function(){return this.scope.availableThemes=this.config.get("themes",[]),this.rs.locales.list().then(function(_this){return function(locales){return _this.scope.locales=locales,locales}}(this))},UserSettingsController.prototype.openDeleteLightbox=function(){return this.rootscope.$broadcast("deletelightbox:new",this.scope.user)},UserSettingsController.prototype.getLan=function(){return this.scope.user.lang||this.translate.preferredLanguage()},UserSettingsController.prototype.getTheme=function(){return this.scope.user.theme||this.config.get("defaultTheme")||"taiga"},UserSettingsController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("UserSettingsController",UserSettingsController),UserProfileDirective=function($confirm,$auth,$repo,$translate){var link;return link=function($scope,$el,$attrs){var submit;return submit=debounce(2e3,function(_this){return function(event){var changeEmail,form,onError,onSuccess;return event.preventDefault(),form=$el.find("form").checksley(),form.validate()?(changeEmail=$scope.user.isAttributeModified("email"),$scope.user.lang=$scope.lang,$scope.user.theme=$scope.theme,onSuccess=function(data){var text;return $auth.setUser(data),changeEmail?(text=$translate.instant("USER_PROFILE.CHANGE_EMAIL_SUCCESS"),$confirm.success(text)):$confirm.notify("success")},onError=function(data){return form.setErrors(data),$confirm.notify("error",data._error_message)},$repo.save($scope.user).then(onSuccess,onError)):void 0}}(this)),$el.on("submit","form",submit),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgUserProfile",["$tgConfirm","$tgAuth","$tgRepo","$translate",UserProfileDirective]),UserAvatarDirective=function($auth,$model,$rs,$confirm){var link;return link=function($scope,$el,$attrs){var onError,onSuccess,showSizeInfo;return showSizeInfo=function(){return $el.find(".size-info").removeClass("hidden")},onSuccess=function(response){var user;return user=$model.make_model("users",response.data),$auth.setUser(user),$scope.user=user,$el.find(".loading-overlay").removeClass("active"),$confirm.notify("success")},onError=function(response){return 413===response.status&&showSizeInfo(),$el.find(".loading-overlay").removeClass("active"),$confirm.notify("error",response.data._error_message)},$el.on("click",".js-change-avatar",function(){return $el.find("#avatar-field").click()}),$el.on("change","#avatar-field",function(event){return $scope.avatarAttachment?($el.find(".loading-overlay").addClass("active"),$rs.userSettings.changeAvatar($scope.avatarAttachment).then(onSuccess,onError)):void 0}),$el.on("click","a.js-use-gravatar",function(event){return $el.find(".loading-overlay").addClass("active"),$rs.userSettings.removeAvatar().then(onSuccess,onError)}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgUserAvatar",["$tgAuth","$tgModel","$tgResources","$tgConfirm",UserAvatarDirective]),TaigaAvatarModelDirective=function($parse){var link;return link=function($scope,$el,$attrs){var model,modelSetter;return model=$parse($attrs.tgAvatarModel),modelSetter=model.assign,$el.bind("change",function(){return $scope.$apply(function(){return modelSetter($scope,$el[0].files[0])})})},{link:link}},module.directive("tgAvatarModel",["$parse",TaigaAvatarModelDirective])}.call(this),function(){var UserSettingsNavigationDirective,module;UserSettingsNavigationDirective=function(){var link;return link=function($scope,$el,$attrs){var section;return section=$attrs.tgUserSettingsNavigation,$el.find(".active").removeClass("active"),$el.find("#usersettingsmenu-"+section+" a").addClass("active"),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module=angular.module("taigaUserSettings"),module.directive("tgUserSettingsNavigation",UserSettingsNavigationDirective)}.call(this),function(){var UserNotificationsController,UserNotificationsDirective,UserNotificationsListDirective,bindOnce,mixOf,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,bindOnce=this.taiga.bindOnce,module=angular.module("taigaUserSettings"),UserNotificationsController=function(superClass){function UserNotificationsController(scope,rootscope,repo,confirm,rs,params,q,location,navUrls,auth){ -var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.navUrls=navUrls,this.auth=auth,this.scope.sectionName="USER_SETTINGS.NOTIFICATIONS.SECTION_NAME",this.scope.user=this.auth.getUser(),promise=this.loadInitialData(),promise.then(null,this.onInitialDataError.bind(this))}return extend(UserNotificationsController,superClass),UserNotificationsController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth"],UserNotificationsController.prototype.loadInitialData=function(){return this.rs.notifyPolicies.list().then(function(_this){return function(notifyPolicies){return _this.scope.notifyPolicies=notifyPolicies,notifyPolicies}}(this))},UserNotificationsController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("UserNotificationsController",UserNotificationsController),UserNotificationsDirective=function(){var link;return link=function($scope,$el,$attrs){return $scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgUserNotifications",UserNotificationsDirective),UserNotificationsListDirective=function($repo,$confirm,$compile){var link,template;return template=_.template('<% _.each(notifyPolicies, function (notifyPolicy, index) { %>\n
\n
<%- notifyPolicy.project_name %>
\n
\n
\n checked="checked"<% } %>/>\n \n
\n
\n
\n
\n checked="checked"<% } %> />\n \n
\n
\n
\n
\n checked="checked"<% } %> />\n \n
\n
\n
\n<% }) %>'),link=function($scope,$el,$attrs){var render;return render=function(){var ctx,html;return $el.off(),ctx={notifyPolicies:$scope.notifyPolicies},html=template(ctx),$el.html($compile(html)($scope)),$el.on("change","input[type=radio]",function(event){var onError,onSuccess,policy,policyIndex,prev_level,target;return target=angular.element(event.currentTarget),policyIndex=target.parents(".policy-table-row").data("index"),policy=$scope.notifyPolicies[policyIndex],prev_level=policy.notify_level,policy.notify_level=parseInt(target.val(),10),onSuccess=function(){return $confirm.notify("success")},onError=function(){return $confirm.notify("error"),target.parents(".policy-table-row").find("input[value="+prev_level+"]").prop("checked",!0)},$repo.save(policy).then(onSuccess,onError)})},$scope.$on("$destroy",function(){return $el.off()}),bindOnce($scope,$attrs.ngModel,render)},{link:link}},module.directive("tgUserNotificationsList",["$tgRepo","$tgConfirm","$compile",UserNotificationsListDirective])}.call(this),function(){angular.module("taigaComponents",[])}.call(this),function(){var module;module=angular.module("taigaDiscover",[])}.call(this),function(){var module;module=angular.module("taigaExternalApps",[])}.call(this),function(){var module;module=angular.module("taigaHome",[])}.call(this),function(){angular.module("taigaNavigationBar",[])}.call(this),function(){var module;module=angular.module("taigaProfile",[])}.call(this),function(){angular.module("taigaProjects",[])}.call(this),function(){angular.module("taigaResources2",[])}.call(this),function(){angular.module("taigaUserTimeline",[])}.call(this),function(){var AttachmentLinkDirective;AttachmentLinkDirective=function($parse,lightboxFactory){var link;return link=function(scope,el,attrs){var attachment;return attachment=$parse(attrs.tgAttachmentLink)(scope),el.on("click",function(event){return taiga.isImage(attachment.getIn(["file","name"]))?(event.preventDefault(),scope.$apply(function(){return lightboxFactory.create("tg-lb-attachment-preview",{"class":"lightbox lightbox-block"},{file:attachment.get("file")})})):void 0}),scope.$on("$destroy",function(){return el.off()})},{link:link}},AttachmentLinkDirective.$inject=["$parse","tgLightboxFactory"],angular.module("taigaComponents").directive("tgAttachmentLink",AttachmentLinkDirective)}.call(this),function(){var AttachmentGalleryDirective;AttachmentGalleryDirective=function(){var link;return link=function(scope,el,attrs,ctrl){},{scope:{},bindToController:{attachment:"=",onDelete:"&",onUpdate:"&",type:"="},controller:"Attachment",controllerAs:"vm",templateUrl:"components/attachment/attachment-gallery.html",link:link}},AttachmentGalleryDirective.$inject=[],angular.module("taigaComponents").directive("tgAttachmentGallery",AttachmentGalleryDirective)}.call(this),function(){var AttachmentController;AttachmentController=function(){function AttachmentController(attachmentsService,translate){this.attachmentsService=attachmentsService,this.translate=translate,this.form={},this.form.description=this.attachment.getIn(["file","description"]),this.form.is_deprecated=this.attachment.get(["file","is_deprecated"]),this.title=this.translate.instant("ATTACHMENT.TITLE",{fileName:this.attachment.get("name"),date:moment(this.attachment.get("created_date")).format(this.translate.instant("ATTACHMENT.DATE"))})}return AttachmentController.$inject=["tgAttachmentsService","$translate"],AttachmentController.prototype.editMode=function(mode){var attachment;return attachment=this.attachment.set("editable",mode),this.onUpdate({attachment:attachment})},AttachmentController.prototype["delete"]=function(){return this.onDelete({attachment:this.attachment})},AttachmentController.prototype.save=function(){var attachment;return attachment=this.attachment.set("loading",!0),this.onUpdate({attachment:attachment}),attachment=this.attachment.merge({editable:!1,loading:!1}),attachment=attachment.mergeIn(["file"],{description:this.form.description,is_deprecated:!!this.form.is_deprecated}),this.onUpdate({attachment:attachment})},AttachmentController}(),angular.module("taigaComponents").controller("Attachment",AttachmentController)}.call(this),function(){var AttachmentDirective;AttachmentDirective=function(){var link;return link=function(scope,el,attrs,ctrl){},{scope:{},bindToController:{attachment:"=",onDelete:"&",onUpdate:"&",type:"="},controller:"Attachment",controllerAs:"vm",templateUrl:"components/attachment/attachment.html",link:link}},AttachmentDirective.$inject=[],angular.module("taigaComponents").directive("tgAttachment",AttachmentDirective)}.call(this),function(){var AttachmentsDropDirective;AttachmentsDropDirective=function($parse){var link;return link=function(scope,el,attrs){var eventAttr;return eventAttr=$parse(attrs.tgAttachmentsDrop),el.on("dragover",function(e){return e.preventDefault(),!1}),el.on("drop",function(e){var dataTransfer;return e.stopPropagation(),e.preventDefault(),dataTransfer=e.dataTransfer||e.originalEvent&&e.originalEvent.dataTransfer,scope.$apply(function(){return eventAttr(scope,{files:dataTransfer.files})})}),scope.$on("$destroy",function(){return el.off()})},{link:link}},AttachmentsDropDirective.$inject=["$parse"],angular.module("taigaComponents").directive("tgAttachmentsDrop",AttachmentsDropDirective)}.call(this),function(){var AttachmentsFullController,sizeFormat;sizeFormat=this.taiga.sizeFormat,AttachmentsFullController=function(){function AttachmentsFullController(translate,confirm,config,storage,attachmentsFullService){this.translate=translate,this.confirm=confirm,this.config=config,this.storage=storage,this.attachmentsFullService=attachmentsFullService,this.mode=this.storage.get("attachment-mode","list"),this.maxFileSize=this.config.get("maxUploadFileSize",null),this.maxFileSize&&(this.maxFileSize=sizeFormat(this.maxFileSize)),this.maxFileSizeMsg=this.maxFileSize?this.translate.instant("ATTACHMENT.MAX_UPLOAD_SIZE",{maxFileSize:this.maxFileSize}):"",taiga.defineImmutableProperty(this,"attachments",function(_this){return function(){return _this.attachmentsFullService.attachments}}(this)),taiga.defineImmutableProperty(this,"deprecatedsCount",function(_this){return function(){return _this.attachmentsFullService.deprecatedsCount}}(this)),taiga.defineImmutableProperty(this,"attachmentsVisible",function(_this){return function(){return _this.attachmentsFullService.attachmentsVisible}}(this)),taiga.defineImmutableProperty(this,"deprecatedsVisible",function(_this){return function(){return _this.attachmentsFullService.deprecatedsVisible}}(this))}return AttachmentsFullController.$inject=["$translate","$tgConfirm","$tgConfig","$tgStorage","tgAttachmentsFullService"],AttachmentsFullController.prototype.uploadingAttachments=function(){return this.attachmentsFullService.uploadingAttachments},AttachmentsFullController.prototype.addAttachment=function(file){var editable;return editable="list"===this.mode,this.attachmentsFullService.addAttachment(this.projectId,this.objId,this.type,file,editable)},AttachmentsFullController.prototype.setMode=function(mode){return this.mode=mode,this.storage.set("attachment-mode",mode)},AttachmentsFullController.prototype.toggleDeprecatedsVisible=function(){return this.attachmentsFullService.toggleDeprecatedsVisible()},AttachmentsFullController.prototype.addAttachments=function(files){return _.forEach(files,function(_this){return function(file){return _this.addAttachment(file)}}(this))},AttachmentsFullController.prototype.loadAttachments=function(){return this.attachmentsFullService.loadAttachments(this.type,this.objId,this.projectId)},AttachmentsFullController.prototype.deleteAttachment=function(toDeleteAttachment){var message,title;return title=this.translate.instant("ATTACHMENT.TITLE_LIGHTBOX_DELETE_ATTACHMENT"),message=this.translate.instant("ATTACHMENT.MSG_LIGHTBOX_DELETE_ATTACHMENT",{fileName:toDeleteAttachment.getIn(["file","name"])}),this.confirm.askOnDelete(title,message).then(function(_this){return function(askResponse){var onError,onSuccess;return onError=function(){return message=_this.translate.instant("ATTACHMENT.ERROR_DELETE_ATTACHMENT",{errorMessage:message}),_this.confirm.notify("error",null,message),askResponse.finish(!1)},onSuccess=function(){return askResponse.finish()},_this.attachmentsFullService.deleteAttachment(toDeleteAttachment,_this.type).then(onSuccess,onError)}}(this))},AttachmentsFullController.prototype.reorderAttachment=function(attachment,newIndex){return this.attachmentsFullService.reorderAttachment(this.type,attachment,newIndex)},AttachmentsFullController.prototype.updateAttachment=function(toUpdateAttachment){return this.attachmentsFullService.updateAttachment(toUpdateAttachment,this.type)},AttachmentsFullController}(),angular.module("taigaComponents").controller("AttachmentsFull",AttachmentsFullController)}.call(this),function(){var AttachmentsFullDirective,bindOnce;bindOnce=this.taiga.bindOnce,AttachmentsFullDirective=function(){var link;return link=function(scope,el,attrs,ctrl){return bindOnce(scope,"vm.objId",function(value){return ctrl.loadAttachments()})},{scope:{},bindToController:{type:"@",objId:"=",projectId:"="},controller:"AttachmentsFull",controllerAs:"vm",templateUrl:"components/attachments-full/attachments-full.html",link:link}},AttachmentsFullDirective.$inject=[],angular.module("taigaComponents").directive("tgAttachmentsFull",AttachmentsFullDirective)}.call(this),function(){var AttachmentsFullService,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;AttachmentsFullService=function(superClass){function AttachmentsFullService(attachmentsService,rootScope){this.attachmentsService=attachmentsService,this.rootScope=rootScope,this._attachments=Immutable.List(),this._deprecatedsCount=0,this._attachmentsVisible=Immutable.List(),this._deprecatedsVisible=!1,this.uploadingAttachments=[],taiga.defineImmutableProperty(this,"attachments",function(_this){return function(){return _this._attachments}}(this)),taiga.defineImmutableProperty(this,"deprecatedsCount",function(_this){return function(){return _this._deprecatedsCount}}(this)),taiga.defineImmutableProperty(this,"attachmentsVisible",function(_this){return function(){return _this._attachmentsVisible}}(this)),taiga.defineImmutableProperty(this,"deprecatedsVisible",function(_this){return function(){return _this._deprecatedsVisible}}(this))}return extend(AttachmentsFullService,superClass),AttachmentsFullService.$inject=["tgAttachmentsService","$rootScope"],AttachmentsFullService.prototype.toggleDeprecatedsVisible=function(){return this._deprecatedsVisible=!this._deprecatedsVisible,this.regenerate()},AttachmentsFullService.prototype.regenerate=function(){return this._deprecatedsCount=this._attachments.count(function(it){return it.getIn(["file","is_deprecated"])}),this._deprecatedsVisible?this._attachmentsVisible=this._attachments:this._attachmentsVisible=this._attachments.filter(function(it){return!it.getIn(["file","is_deprecated"])})},AttachmentsFullService.prototype.addAttachment=function(projectId,objId,type,file,editable){return null==editable&&(editable=!0),new Promise(function(_this){return function(resolve,reject){var promise;return _this.attachmentsService.validate(file)?(_this.uploadingAttachments.push(file),promise=_this.attachmentsService.upload(file,objId,projectId,type),promise.then(function(file){var attachment;return _this.uploadingAttachments=_this.uploadingAttachments.filter(function(uploading){return uploading.name!==file.get("name")}),attachment=Immutable.Map(),attachment=attachment.merge({file:file,editable:editable,loading:!1}),_this._attachments=_this._attachments.push(attachment),_this.regenerate(),_this.rootScope.$broadcast("attachment:create"),resolve(attachment)})):reject(file)}}(this))},AttachmentsFullService.prototype.loadAttachments=function(type,objId,projectId){return this.attachmentsService.list(type,objId,projectId).then(function(_this){return function(files){return _this._attachments=files.map(function(file){var attachment;return attachment=Immutable.Map(),attachment.merge({loading:!1,editable:!1,file:file})}),_this.regenerate()}}(this))},AttachmentsFullService.prototype.deleteAttachment=function(toDeleteAttachment,type){var onSuccess;return onSuccess=function(_this){return function(){return _this._attachments=_this._attachments.filter(function(attachment){return attachment!==toDeleteAttachment}),_this.regenerate()}}(this),this.attachmentsService["delete"](type,toDeleteAttachment.getIn(["file","id"])).then(onSuccess)},AttachmentsFullService.prototype.reorderAttachment=function(type,attachment,newIndex){var attachments,oldIndex,promises;return oldIndex=this.attachments.findIndex(function(it){return it===attachment}),oldIndex!==newIndex?(attachments=this.attachments.remove(oldIndex),attachments=attachments.splice(newIndex,0,attachment),attachments=attachments.map(function(x,i){return x.setIn(["file","order"],i+1)}),promises=[],attachments.forEach(function(_this){return function(attachment){var patch;return patch={order:attachment.getIn(["file","order"])},promises.push(_this.attachmentsService.patch(attachment.getIn(["file","id"]),type,patch))}}(this)),Promise.all(promises).then(function(_this){return function(){return _this._attachments=attachments,_this.regenerate()}}(this))):void 0},AttachmentsFullService.prototype.updateAttachment=function(toUpdateAttachment,type){var index,oldAttachment,patch;return index=this._attachments.findIndex(function(attachment){return attachment.getIn(["file","id"])===toUpdateAttachment.getIn(["file","id"])}),oldAttachment=this._attachments.get(index),patch=taiga.patch(oldAttachment.get("file"),toUpdateAttachment.get("file")),toUpdateAttachment.get("loading")?(this._attachments=this._attachments.set(index,toUpdateAttachment),this.regenerate()):this.attachmentsService.patch(toUpdateAttachment.getIn(["file","id"]),type,patch).then(function(_this){return function(){return _this._attachments=_this._attachments.set(index,toUpdateAttachment),_this.regenerate()}}(this))},AttachmentsFullService}(taiga.Service),angular.module("taigaComponents").service("tgAttachmentsFullService",AttachmentsFullService)}.call(this),function(){var AttachmentsSimpleController;AttachmentsSimpleController=function(){function AttachmentsSimpleController(attachmentsService){this.attachmentsService=attachmentsService}return AttachmentsSimpleController.$inject=["tgAttachmentsService"],AttachmentsSimpleController.prototype.addAttachment=function(file){var attachment;return attachment=Immutable.fromJS({file:file,name:file.name,size:file.size}),this.attachmentsService.validate(file)&&(this.attachments=this.attachments.push(attachment),this.onAdd)?this.onAdd({attachment:attachment}):void 0},AttachmentsSimpleController.prototype.addAttachments=function(files){return _.forEach(files,this.addAttachment.bind(this))},AttachmentsSimpleController.prototype.deleteAttachment=function(toDeleteAttachment){return this.attachments=this.attachments.filter(function(attachment){return attachment!==toDeleteAttachment}),this.onDelete?this.onDelete({attachment:toDeleteAttachment}):void 0},AttachmentsSimpleController}(),angular.module("taigaComponents").controller("AttachmentsSimple",AttachmentsSimpleController)}.call(this),function(){var AttachmentsSimpleDirective;AttachmentsSimpleDirective=function(){var link;return link=function(scope,el,attrs,ctrl){},{scope:{},bindToController:{attachments:"=",onAdd:"&",onDelete:"&"},controller:"AttachmentsSimple",controllerAs:"vm",templateUrl:"components/attachments-simple/attachments-simple.html",link:link}},AttachmentsSimpleDirective.$inject=[],angular.module("taigaComponents").directive("tgAttachmentsSimple",AttachmentsSimpleDirective)}.call(this),function(){var AttachmentSortableDirective;AttachmentSortableDirective=function($parse){var link;return link=function(scope,el,attrs){var callback;return callback=$parse(attrs.tgAttachmentsSortable),el.sortable({items:"div[tg-bind-scope]",handle:"a.settings.icon.icon-drag-v",containment:".attachments",dropOnEmpty:!0,helper:"clone",scroll:!1,tolerance:"pointer",placeholder:"sortable-placeholder single-attachment"}),el.on("sortstop",function(event,ui){var attachment,newIndex;return attachment=ui.item.scope().attachment,newIndex=ui.item.index(),scope.$apply(function(){return callback(scope,{attachment:attachment,index:newIndex})})}),scope.$on("$destroy",function(){return el.off()})},{link:link}},AttachmentSortableDirective.$inject=["$parse"],angular.module("taigaComponents").directive("tgAttachmentsSortable",AttachmentSortableDirective)}.call(this),function(){var AutoSelectDirective;AutoSelectDirective=function($timeout){return{link:function(scope,elm){return $timeout(function(){return elm[0].select()})}}},AutoSelectDirective.$inject=["$timeout"],angular.module("taigaComponents").directive("tgAutoSelect",AutoSelectDirective)}.call(this),function(){var FileChangeDirective;FileChangeDirective=function($parse){var link;return link=function(scope,el,attrs,ctrl){var eventAttr;return eventAttr=$parse(attrs.tgFileChange),el.on("change",function(event){return scope.$apply(function(){return eventAttr(scope,{files:event.currentTarget.files})})}),scope.$on("$destroy",function(){return el.off()})},{require:"ngModel",restrict:"A",link:link}},FileChangeDirective.$inject=["$parse"],angular.module("taigaComponents").directive("tgFileChange",FileChangeDirective)}.call(this),function(){var JoyRideDirective,taiga;taiga=this.taiga,JoyRideDirective=function($rootScope,currentUserService,joyRideService,$location,$translate){var link;return link=function(scope,el,attrs,ctrl){var initJoyrRide,intro,unsuscribe;return unsuscribe=null,intro=introJs(),intro.oncomplete(function(){return $("html,body").scrollTop(0)}),intro.onexit(function(){return currentUserService.disableJoyRide()}),initJoyrRide=function(next,config){return config[next.joyride]?(intro.setOptions({exitOnEsc:!1,exitOnOverlayClick:!1,showStepNumbers:!1,nextLabel:$translate.instant("JOYRIDE.NAV.NEXT")+" →",prevLabel:"← "+$translate.instant("JOYRIDE.NAV.BACK"),skipLabel:$translate.instant("JOYRIDE.NAV.SKIP"),doneLabel:$translate.instant("JOYRIDE.NAV.DONE"),disableInteraction:!0}),intro.setOption("steps",joyRideService.get(next.joyride)),intro.start()):void 0},$rootScope.$on("$routeChangeSuccess",function(event,next){return next.joyride&¤tUserService.isAuthenticated()?(intro.oncomplete(function(){return currentUserService.disableJoyRide(next.joyride)}),next.loader?unsuscribe=$rootScope.$on("loader:end",function(){return currentUserService.loadJoyRideConfig().then(function(config){return initJoyrRide(next,config)}),unsuscribe()}):currentUserService.loadJoyRideConfig().then(function(config){return initJoyrRide(next,config)})):(intro.exit(),void(unsuscribe&&unsuscribe()))})},{scope:{},link:link}},JoyRideDirective.$inject=["$rootScope","tgCurrentUserService","tgJoyRideService","$location","$translate"],angular.module("taigaComponents").directive("tgJoyRide",JoyRideDirective)}.call(this),function(){var JoyRideService,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;JoyRideService=function(superClass){function JoyRideService(translate,checkPermissionsService){this.translate=translate,this.checkPermissionsService=checkPermissionsService}return extend(JoyRideService,superClass),JoyRideService.$inject=["$translate","tgCheckPermissionsService"],JoyRideService.prototype.getConfig=function(){return{dashboard:function(_this){return function(){var steps;return steps=[{element:".project-list > section:not(.ng-hide)",position:"left",joyride:{title:_this.translate.instant("JOYRIDE.DASHBOARD.STEP1.TITLE"),text:_this.translate.instant("JOYRIDE.DASHBOARD.STEP1.TEXT")}},{element:".working-on-container",position:"right",joyride:{title:_this.translate.instant("JOYRIDE.DASHBOARD.STEP2.TITLE"),text:_this.translate.instant("JOYRIDE.DASHBOARD.STEP2.TEXT")}},{element:".watching-container",position:"right",joyride:{title:_this.translate.instant("JOYRIDE.DASHBOARD.STEP3.TITLE"),text:[_this.translate.instant("JOYRIDE.DASHBOARD.STEP3.TEXT1"),_this.translate.instant("JOYRIDE.DASHBOARD.STEP3.TEXT2")]}}],$(".project-list .create-project-button").is(":hidden")||steps.push({element:".project-list .create-project-button",position:"bottom",joyride:{title:_this.translate.instant("JOYRIDE.DASHBOARD.STEP4.TITLE"),text:[_this.translate.instant("JOYRIDE.DASHBOARD.STEP4.TEXT1"),_this.translate.instant("JOYRIDE.DASHBOARD.STEP4.TEXT2")]}}),steps}}(this),backlog:function(_this){return function(){var steps;return steps=[{element:".summary",position:"bottom",joyride:{title:_this.translate.instant("JOYRIDE.BACKLOG.STEP1.TITLE"),text:[_this.translate.instant("JOYRIDE.BACKLOG.STEP1.TEXT1"),_this.translate.instant("JOYRIDE.BACKLOG.STEP1.TEXT2")]}},{element:".backlog-table-empty",position:"bottom",joyride:{title:_this.translate.instant("JOYRIDE.BACKLOG.STEP2.TITLE"),text:_this.translate.instant("JOYRIDE.BACKLOG.STEP2.TEXT")}},{element:".sprints",position:"left",joyride:{title:_this.translate.instant("JOYRIDE.BACKLOG.STEP3.TITLE"),text:_this.translate.instant("JOYRIDE.BACKLOG.STEP3.TEXT")}}],_this.checkPermissionsService.check("add_us")&&steps.push({element:".new-us",position:"rigth",joyride:{title:_this.translate.instant("JOYRIDE.BACKLOG.STEP4.TITLE"),text:_this.translate.instant("JOYRIDE.BACKLOG.STEP4.TEXT")}}),steps}}(this),kanban:function(_this){return function(){var steps;return steps=[{element:".kanban-table-inner",position:"bottom",joyride:{title:_this.translate.instant("JOYRIDE.KANBAN.STEP1.TITLE"),text:_this.translate.instant("JOYRIDE.KANBAN.STEP1.TEXT")}},{element:".card-placeholder",position:"right",joyride:{title:_this.translate.instant("JOYRIDE.KANBAN.STEP2.TITLE"),text:_this.translate.instant("JOYRIDE.KANBAN.STEP2.TEXT")}}],_this.checkPermissionsService.check("add_us")&&steps.push({element:".icon-plus",position:"bottom",joyride:{title:_this.translate.instant("JOYRIDE.KANBAN.STEP3.TITLE"),text:[_this.translate.instant("JOYRIDE.KANBAN.STEP3.TEXT1"),_this.translate.instant("JOYRIDE.KANBAN.STEP3.TEXT2")]}}),steps}}(this)}},JoyRideService.prototype.get=function(name){var joyRide,joyRides;return joyRides=this.getConfig(),joyRide=joyRides[name].call(this),_.map(joyRide,function(item){var html;return html="",item.joyride.title&&(html+="

"+item.joyride.title+"

"),_.isArray(item.joyride.text)?_.forEach(item.joyride.text,function(text){return html+="

"+text+"

"}):html+="

"+item.joyride.text+"

",item.intro=html,item})},JoyRideService}(taiga.Service),angular.module("taigaComponents").service("tgJoyRideService",JoyRideService)}.call(this),function(){var LiveAnnouncementDirective;LiveAnnouncementDirective=function(liveAnnouncementService){var link;return link=function(scope,el,attrs){},{restrict:"AE",scope:{},controllerAs:"vm",controller:function(){return this.close=function(){return liveAnnouncementService.open=!1},Object.defineProperties(this,{open:{get:function(){return liveAnnouncementService.open}},title:{get:function(){return liveAnnouncementService.title}},desc:{get:function(){return liveAnnouncementService.desc}}})},link:link,templateUrl:"components/live-announcement/live-announcement.html"}},LiveAnnouncementDirective.$inject=["tgLiveAnnouncementService"],angular.module("taigaComponents").directive("tgLiveAnnouncement",LiveAnnouncementDirective)}.call(this),function(){var LiveAnnouncementService,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;LiveAnnouncementService=function(superClass){function LiveAnnouncementService(){this.open=!1,this.title="",this.desc=""}return extend(LiveAnnouncementService,superClass),LiveAnnouncementService.prototype.show=function(title,desc){return this.open=!0,this.title=title,this.desc=desc},LiveAnnouncementService}(taiga.Service),angular.module("taigaComponents").service("tgLiveAnnouncementService",LiveAnnouncementService)}.call(this),function(){var COLORS,IMAGES,LOGOS,ProjectLogoSrcDirective,modulo=function(a,b){return(+a%(b=+b)+b)%b};IMAGES=["/"+window._version+"/images/project-logos/project-logo-01.png","/"+window._version+"/images/project-logos/project-logo-02.png","/"+window._version+"/images/project-logos/project-logo-03.png","/"+window._version+"/images/project-logos/project-logo-04.png","/"+window._version+"/images/project-logos/project-logo-05.png"],COLORS=["rgba( 153, 214, 220, 1 )","rgba( 213, 156, 156, 1 )","rgba( 214, 161, 212, 1 )","rgba( 164, 162, 219, 1 )","rgba( 152, 224, 168, 1 )"],LOGOS=_.cartesianProduct(IMAGES,COLORS),ProjectLogoSrcDirective=function($parse){var _getDefaultProjectLogo,link;return _getDefaultProjectLogo=function(project){var idx,key,logo;return key=project.get("slug")+"-"+project.get("id"),idx=modulo(murmurhash3_32_gc(key,42),LOGOS.length),logo=LOGOS[idx],{src:logo[0],color:logo[1]}},link=function(scope,el,attrs){return scope.$watch("project",function(project){var logo,projectLogo;return(project=Immutable.fromJS(project))?(projectLogo=project.get("logo_small_url"),projectLogo?(el.attr("src",projectLogo),el.css("background","")):(logo=_getDefaultProjectLogo(project),el.attr("src",logo.src),el.css("background",logo.color))):void 0}),scope.$on("$destroy",function(){return el.off()})},{link:link,scope:{project:"=tgProjectLogoSrc"}}},ProjectLogoSrcDirective.$inject=["$parse"],angular.module("taigaComponents").directive("tgProjectLogoSrc",ProjectLogoSrcDirective)}.call(this),function(){var ProjectMenuController;ProjectMenuController=function(){function ProjectMenuController(projectService,lightboxFactory){this.projectService=projectService,this.lightboxFactory=lightboxFactory,this.project=null,this.menu=Immutable.Map()}return ProjectMenuController.$inject=["tgProjectService","tgLightboxFactory"],ProjectMenuController.prototype.show=function(){return this.project=this.projectService.project,this.active=this._getActiveSection(),this._setVideoConference(),this._setMenuPermissions()},ProjectMenuController.prototype.hide=function(){return this.project=null,this.menu={}},ProjectMenuController.prototype.search=function(){return this.lightboxFactory.create("tg-search-box",{"class":"lightbox lightbox-search"})},ProjectMenuController.prototype._setVideoConference=function(){var videoconferenceUrl;return videoconferenceUrl=this._videoConferenceUrl(),videoconferenceUrl?this.project=this.project.set("videoconferenceUrl",videoconferenceUrl):void 0},ProjectMenuController.prototype._setMenuPermissions=function(){return this.menu=Immutable.Map({backlog:!1,kanban:!1,issues:!1,wiki:!1}),this.project.get("is_backlog_activated")&&-1!==this.project.get("my_permissions").indexOf("view_us")&&(this.menu=this.menu.set("backlog",!0)),this.project.get("is_kanban_activated")&&-1!==this.project.get("my_permissions").indexOf("view_us")&&(this.menu=this.menu.set("kanban",!0)),this.project.get("is_issues_activated")&&-1!==this.project.get("my_permissions").indexOf("view_issues")&&(this.menu=this.menu.set("issues",!0)),this.project.get("is_wiki_activated")&&-1!==this.project.get("my_permissions").indexOf("view_wiki_pages")?this.menu=this.menu.set("wiki",!0):void 0},ProjectMenuController.prototype._getActiveSection=function(){var indexBacklog,indexKanban,oldSectionName,sectionName,sectionsBreadcrumb;return sectionName=this.projectService.section,sectionsBreadcrumb=this.projectService.sectionsBreadcrumb,indexBacklog=sectionsBreadcrumb.lastIndexOf("backlog"),indexKanban=sectionsBreadcrumb.lastIndexOf("kanban"),(-1!==indexBacklog||-1!==indexKanban)&&(oldSectionName=-1===indexKanban||indexBacklog>indexKanban?"backlog":"kanban"),"backlog-kanban"===sectionName&&("backlog"===oldSectionName||"kanban"===oldSectionName?sectionName=oldSectionName:this.project.get("is_backlog_activated")&&!this.project.get("is_kanban_activated")?sectionName="backlog":!this.project.get("is_backlog_activated")&&this.project.get("is_kanban_activated")&&(sectionName="kanban")),sectionName},ProjectMenuController.prototype._videoConferenceUrl=function(){var baseUrl,url;if("appear-in"===this.project.get("videoconferences"))baseUrl="https://appear.in/";else{if("talky"!==this.project.get("videoconferences"))return"jitsi"===this.project.get("videoconferences")?(baseUrl="https://meet.jit.si/",url=this.project.get("slug")+"-"+taiga.slugify(this.project.get("videoconferences_extra_data")),url=url.replace(/-/g,""),baseUrl+url):"custom"===this.project.get("videoconferences")?this.project.get("videoconferences_extra_data"):"";baseUrl="https://talky.io/"}return url=this.project.get("videoconferences_extra_data")?this.project.get("slug")+"-"+this.project.get("videoconferences_extra_data"):this.project.get("slug"), -baseUrl+url},ProjectMenuController}(),angular.module("taigaComponents").controller("ProjectMenu",ProjectMenuController)}.call(this),function(){var ProjectMenuDirective,taiga;taiga=this.taiga,ProjectMenuDirective=function(projectService,lightboxFactory){var link;return link=function(scope,el,attrs,ctrl){var projectChange;return projectChange=function(){return projectService.project?ctrl.show():ctrl.hide()},scope.$watch(function(){return projectService.project},projectChange),scope.vm.fixed=!1,$(window).on("scroll",function(){var position;return position=$(window).scrollTop(),position>100&&scope.vm.fixed===!1?(scope.vm.fixed=!0,scope.$digest()):100>position&&scope.vm.fixed===!0?(scope.vm.fixed=!1,scope.$digest()):void 0})},{scope:{},controller:"ProjectMenu",controllerAs:"vm",templateUrl:"components/project-menu/project-menu.html",link:link}},ProjectMenuDirective.$inject=["tgProjectService","tgLightboxFactory"],angular.module("taigaComponents").directive("tgProjectMenu",ProjectMenuDirective)}.call(this),function(){var TermsOfServiceAndPrivacyPolicyNoticeDirective;TermsOfServiceAndPrivacyPolicyNoticeDirective=function($config){var link;return link=function(scope,el,attrs){return scope.privacyPolicyUrl=$config.get("privacyPolicyUrl"),scope.termsOfServiceUrl=$config.get("termsOfServiceUrl")},{restrict:"AE",scope:{},link:link,templateUrl:"components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.html"}},angular.module("taigaComponents").directive("tgTermsOfServiceAndPrivacyPolicyNotice",["$tgConfig",TermsOfServiceAndPrivacyPolicyNoticeDirective])}.call(this),function(){var VoteButtonController;VoteButtonController=function(){function VoteButtonController(currentUserService){this.currentUserService=currentUserService,this.user=this.currentUserService.getUser(),this.isMouseOver=!1,this.loading=!1}return VoteButtonController.$inject=["tgCurrentUserService"],VoteButtonController.prototype.showTextWhenMouseIsOver=function(){return this.isMouseOver=!0},VoteButtonController.prototype.showTextWhenMouseIsLeave=function(){return this.isMouseOver=!1},VoteButtonController.prototype.toggleVote=function(){var promise;return this.loading=!0,promise=this.item.is_voter?this._downvote():this._upvote(),promise["finally"](function(_this){return function(){return _this.loading=!1}}(this)),promise},VoteButtonController.prototype._upvote=function(){return this.onUpvote().then(function(_this){return function(){return _this.showTextWhenMouseIsLeave()}}(this))},VoteButtonController.prototype._downvote=function(){return this.onDownvote()},VoteButtonController}(),angular.module("taigaComponents").controller("VoteButton",VoteButtonController)}.call(this),function(){var VoteButtonDirective;VoteButtonDirective=function(){return{scope:{},controller:"VoteButton",bindToController:{item:"=",onUpvote:"=",onDownvote:"="},controllerAs:"vm",templateUrl:"components/vote-button/vote-button.html"}},angular.module("taigaComponents").directive("tgVoteButton",VoteButtonDirective)}.call(this),function(){var WatchButtonController;WatchButtonController=function(){function WatchButtonController(currentUserService,rootScope){this.currentUserService=currentUserService,this.rootScope=rootScope,this.user=this.currentUserService.getUser(),this.isMouseOver=!1,this.loading=!1}return WatchButtonController.$inject=["tgCurrentUserService","$rootScope"],WatchButtonController.prototype.showTextWhenMouseIsOver=function(){return this.isMouseOver=!0},WatchButtonController.prototype.showTextWhenMouseIsLeave=function(){return this.isMouseOver=!1},WatchButtonController.prototype.openWatchers=function(){return this.rootScope.$broadcast("watcher:add",this.item)},WatchButtonController.prototype.getPerms=function(){var name,perms;return this.item?(name=this.item._name,perms={userstories:"modify_us",issues:"modify_issue",tasks:"modify_task"},perms[name]):""},WatchButtonController.prototype.toggleWatch=function(){var promise;return this.loading=!0,promise=this.item.is_watcher?this._unwatch():this._watch(),promise["finally"](function(_this){return function(){return _this.loading=!1}}(this)),promise},WatchButtonController.prototype._watch=function(){return this.onWatch().then(function(_this){return function(){return _this.showTextWhenMouseIsLeave()}}(this))},WatchButtonController.prototype._unwatch=function(){return this.onUnwatch()},WatchButtonController}(),angular.module("taigaComponents").controller("WatchButton",WatchButtonController)}.call(this),function(){var WatchButtonDirective;WatchButtonDirective=function(){return{scope:{},controller:"WatchButton",bindToController:{item:"=",onWatch:"=",onUnwatch:"="},controllerAs:"vm",templateUrl:function(item,attributes){return"components/watch-button/watch-button-"+attributes.environment+".html"}}},angular.module("taigaComponents").directive("tgWatchButton",WatchButtonDirective)}.call(this),function(){var DiscoverHomeOrderByController;DiscoverHomeOrderByController=function(){function DiscoverHomeOrderByController(translate){this.translate=translate,this.is_open=!1,this.texts={week:this.translate.instant("DISCOVER.FILTERS.WEEK"),month:this.translate.instant("DISCOVER.FILTERS.MONTH"),year:this.translate.instant("DISCOVER.FILTERS.YEAR"),all:this.translate.instant("DISCOVER.FILTERS.ALL_TIME")}}return DiscoverHomeOrderByController.$inject=["$translate"],DiscoverHomeOrderByController.prototype.currentText=function(){return this.texts[this.currentOrderBy]},DiscoverHomeOrderByController.prototype.open=function(){return this.is_open=!0},DiscoverHomeOrderByController.prototype.close=function(){return this.is_open=!1},DiscoverHomeOrderByController.prototype.orderBy=function(type){return this.currentOrderBy=type,this.is_open=!1,this.onChange({orderBy:this.currentOrderBy})},DiscoverHomeOrderByController}(),angular.module("taigaDiscover").controller("DiscoverHomeOrderBy",DiscoverHomeOrderByController)}.call(this),function(){var DiscoverHomeOrderByDirective;DiscoverHomeOrderByDirective=function(){var link;return link=function(scope,el,attrs){},{controller:"DiscoverHomeOrderBy",controllerAs:"vm",bindToController:!0,templateUrl:"discover/components/discover-home-order-by/discover-home-order-by.html",scope:{currentOrderBy:"=orderBy",onChange:"&"},link:link}},DiscoverHomeOrderByDirective.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverHomeOrderBy",DiscoverHomeOrderByDirective)}.call(this),function(){var DiscoverSearchBarController;DiscoverSearchBarController=function(){function DiscoverSearchBarController(discoverProjectsService){this.discoverProjectsService=discoverProjectsService,taiga.defineImmutableProperty(this,"projects",function(_this){return function(){return _this.discoverProjectsService.projectsCount}}(this)),this.discoverProjectsService.fetchStats()}return DiscoverSearchBarController.$inject=["tgDiscoverProjectsService"],DiscoverSearchBarController.prototype.selectFilter=function(filter){return this.onChange({filter:filter,q:this.q})},DiscoverSearchBarController.prototype.submitFilter=function(){return this.onChange({filter:this.filter,q:this.q})},DiscoverSearchBarController}(),angular.module("taigaDiscover").controller("DiscoverSearchBar",DiscoverSearchBarController)}.call(this),function(){var DiscoverSearchBarDirective;DiscoverSearchBarDirective=function(){var link;return link=function(scope,el,attrs,ctrl){},{controller:"DiscoverSearchBar",controllerAs:"vm",templateUrl:"discover/components/discover-search-bar/discover-search-bar.html",bindToController:!0,scope:{q:"=",filter:"=",onChange:"&"},link:link}},DiscoverSearchBarDirective.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverSearchBar",DiscoverSearchBarDirective)}.call(this),function(){var DiscoverSearchListHeaderController;DiscoverSearchListHeaderController=function(){function DiscoverSearchListHeaderController(){this.like_is_open=0===this.orderBy.indexOf("-total_fans"),this.activity_is_open=0===this.orderBy.indexOf("-total_activity")}return DiscoverSearchListHeaderController.$inject=[],DiscoverSearchListHeaderController.prototype.openLike=function(){return this.like_is_open=!0,this.activity_is_open=!1,this.setOrderBy("-total_fans_last_week")},DiscoverSearchListHeaderController.prototype.openActivity=function(){return this.activity_is_open=!0,this.like_is_open=!1,this.setOrderBy("-total_activity_last_week")},DiscoverSearchListHeaderController.prototype.setOrderBy=function(type){return null==type&&(type=""),type||(this.like_is_open=!1,this.activity_is_open=!1),this.onChange({orderBy:type})},DiscoverSearchListHeaderController}(),angular.module("taigaDiscover").controller("DiscoverSearchListHeader",DiscoverSearchListHeaderController)}.call(this),function(){var DiscoverSearchListHeaderDirective;DiscoverSearchListHeaderDirective=function(){var link;return link=function(scope,el,attrs){},{controller:"DiscoverSearchListHeader",controllerAs:"vm",bindToController:!0,templateUrl:"discover/components/discover-search-list-header/discover-search-list-header.html",scope:{onChange:"&",orderBy:"="},link:link}},DiscoverSearchListHeaderDirective.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverSearchListHeader",DiscoverSearchListHeaderDirective)}.call(this),function(){var FeaturedProjectsController;FeaturedProjectsController=function(){function FeaturedProjectsController(discoverProjectsService){this.discoverProjectsService=discoverProjectsService,taiga.defineImmutableProperty(this,"featured",function(_this){return function(){return _this.discoverProjectsService.featured}}(this)),this.discoverProjectsService.fetchFeatured()}return FeaturedProjectsController.$inject=["tgDiscoverProjectsService"],FeaturedProjectsController}(),angular.module("taigaDiscover").controller("FeaturedProjects",FeaturedProjectsController)}.call(this),function(){var FeaturedProjectsDirective;FeaturedProjectsDirective=function(){var link;return link=function(scope,el,attrs){},{controller:"FeaturedProjects",controllerAs:"vm",templateUrl:"discover/components/featured-projects/featured-projects.html",scope:{},link:link}},FeaturedProjectsDirective.$inject=[],angular.module("taigaDiscover").directive("tgFeaturedProjects",FeaturedProjectsDirective)}.call(this),function(){var HighlightedDirective;HighlightedDirective=function(){return{templateUrl:"discover/components/highlighted/highlighted.html",scope:{loading:"=",highlighted:"=",orderBy:"="}}},HighlightedDirective.$inject=[],angular.module("taigaDiscover").directive("tgHighlighted",HighlightedDirective)}.call(this),function(){var MostActiveController;MostActiveController=function(){function MostActiveController(discoverProjectsService){this.discoverProjectsService=discoverProjectsService,taiga.defineImmutableProperty(this,"highlighted",function(_this){return function(){return _this.discoverProjectsService.mostActive}}(this)),this.currentOrderBy="week",this.order_by=this.getOrderBy()}return MostActiveController.$inject=["tgDiscoverProjectsService"],MostActiveController.prototype.fetch=function(){return this.loading=!0,this.order_by=this.getOrderBy(),this.discoverProjectsService.fetchMostActive({order_by:this.order_by}).then(function(_this){return function(){return _this.loading=!1}}(this))},MostActiveController.prototype.orderBy=function(type){return this.currentOrderBy=type,this.fetch()},MostActiveController.prototype.getOrderBy=function(type){return"all"===this.currentOrderBy?"-total_activity":"-total_activity_last_"+this.currentOrderBy},MostActiveController}(),angular.module("taigaDiscover").controller("MostActive",MostActiveController)}.call(this),function(){var MostActiveDirective;MostActiveDirective=function(){var link;return link=function(scope,el,attrs,ctrl){return ctrl.fetch()},{controller:"MostActive",controllerAs:"vm",templateUrl:"discover/components/most-active/most-active.html",scope:{},link:link}},MostActiveDirective.$inject=[],angular.module("taigaDiscover").directive("tgMostActive",MostActiveDirective)}.call(this),function(){var MostLikedController;MostLikedController=function(){function MostLikedController(discoverProjectsService){this.discoverProjectsService=discoverProjectsService,taiga.defineImmutableProperty(this,"highlighted",function(_this){return function(){return _this.discoverProjectsService.mostLiked}}(this)),this.currentOrderBy="week",this.order_by=this.getOrderBy()}return MostLikedController.$inject=["tgDiscoverProjectsService"],MostLikedController.prototype.fetch=function(){return this.loading=!0,this.order_by=this.getOrderBy(),this.discoverProjectsService.fetchMostLiked({order_by:this.order_by}).then(function(_this){return function(){return _this.loading=!1}}(this))},MostLikedController.prototype.orderBy=function(type){return this.currentOrderBy=type,this.fetch()},MostLikedController.prototype.getOrderBy=function(){return"all"===this.currentOrderBy?"-total_fans":"-total_fans_last_"+this.currentOrderBy},MostLikedController}(),angular.module("taigaDiscover").controller("MostLiked",MostLikedController)}.call(this),function(){var MostLikedDirective;MostLikedDirective=function(){var link;return link=function(scope,el,attrs,ctrl){return ctrl.fetch()},{controller:"MostLiked",controllerAs:"vm",templateUrl:"discover/components/most-liked/most-liked.html",scope:{},link:link}},MostLikedDirective.$inject=[],angular.module("taigaDiscover").directive("tgMostLiked",MostLikedDirective)}.call(this),function(){var DiscoverHomeController;DiscoverHomeController=function(){function DiscoverHomeController(location,navUrls){this.location=location,this.navUrls=navUrls}return DiscoverHomeController.$inject=["$tgLocation","$tgNavUrls"],DiscoverHomeController.prototype.onSubmit=function(q){var url;return url=this.navUrls.resolve("discover-search"),this.location.search("text",q).path(url)},DiscoverHomeController}(),angular.module("taigaDiscover").controller("DiscoverHome",DiscoverHomeController)}.call(this),function(){var DiscoverSearchController;DiscoverSearchController=function(){function DiscoverSearchController(routeParams,discoverProjectsService,route){this.routeParams=routeParams,this.discoverProjectsService=discoverProjectsService,this.route=route,this.page=1,taiga.defineImmutableProperty(this,"searchResult",function(_this){return function(){return _this.discoverProjectsService.searchResult}}(this)),taiga.defineImmutableProperty(this,"nextSearchPage",function(_this){return function(){return _this.discoverProjectsService.nextSearchPage}}(this)),this.q=this.routeParams.text,this.filter=this.routeParams.filter||"all",this.orderBy=this.routeParams.order_by||"",this.loadingGlobal=!1,this.loadingList=!1,this.loadingPagination=!1}return DiscoverSearchController.$inject=["$routeParams","tgDiscoverProjectsService","$route"],DiscoverSearchController.prototype.fetch=function(){return this.page=1,this.discoverProjectsService.resetSearchList(),this.search()},DiscoverSearchController.prototype.fetchByGlobalSearch=function(){return this.loadingGlobal?void 0:(this.loadingGlobal=!0,this.fetch().then(function(_this){return function(){return _this.loadingGlobal=!1}}(this)))},DiscoverSearchController.prototype.fetchByOrderBy=function(){return this.loadingList?void 0:(this.loadingList=!0,this.fetch().then(function(_this){return function(){return _this.loadingList=!1}}(this)))},DiscoverSearchController.prototype.showMore=function(){return this.loadingPagination?void 0:(this.loadingPagination=!0,this.page++,this.search().then(function(_this){return function(){return _this.loadingPagination=!1}}(this)))},DiscoverSearchController.prototype.search=function(){var filter,params;return filter=this.getFilter(),params={page:this.page,q:this.q,order_by:this.orderBy},_.assign(params,filter),this.discoverProjectsService.fetchSearch(params)},DiscoverSearchController.prototype.getFilter=function(){return"people"===this.filter?{is_looking_for_people:!0}:"scrum"===this.filter?{is_backlog_activated:!0}:"kanban"===this.filter?{is_kanban_activated:!0}:{}},DiscoverSearchController.prototype.onChangeFilter=function(filter,q){return this.filter=filter,this.q=q,this.route.updateParams({filter:this.filter,text:this.q}),this.fetchByGlobalSearch()},DiscoverSearchController.prototype.onChangeOrder=function(orderBy){return this.orderBy=orderBy,this.route.updateParams({order_by:orderBy}),this.fetchByOrderBy()},DiscoverSearchController}(),angular.module("taigaDiscover").controller("DiscoverSearch",DiscoverSearchController)}.call(this),function(){var DiscoverSearchDirective;DiscoverSearchDirective=function(){var link;return link=function(scope,element,attrs,ctrl){return ctrl.fetch()},{controller:"DiscoverSearch",controllerAs:"vm",link:link}},DiscoverSearchDirective.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverSearch",DiscoverSearchDirective)}.call(this),function(){var DiscoverProjectsService,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,DiscoverProjectsService=function(superClass){function DiscoverProjectsService(rs,projectsService){this.rs=rs,this.projectsService=projectsService,this._mostLiked=Immutable.List(),this._mostActive=Immutable.List(),this._featured=Immutable.List(),this._searchResult=Immutable.List(),this._projectsCount=0,this.decorate=this.projectsService._decorate.bind(this.projectsService),taiga.defineImmutableProperty(this,"mostLiked",function(_this){return function(){return _this._mostLiked}}(this)),taiga.defineImmutableProperty(this,"mostActive",function(_this){return function(){return _this._mostActive}}(this)),taiga.defineImmutableProperty(this,"featured",function(_this){return function(){return _this._featured}}(this)),taiga.defineImmutableProperty(this,"searchResult",function(_this){return function(){return _this._searchResult}}(this)),taiga.defineImmutableProperty(this,"nextSearchPage",function(_this){return function(){return _this._nextSearchPage}}(this)),taiga.defineImmutableProperty(this,"projectsCount",function(_this){return function(){return _this._projectsCount}}(this))}return extend(DiscoverProjectsService,superClass),DiscoverProjectsService.$inject=["tgResources","tgProjectsService"],DiscoverProjectsService.prototype.fetchMostLiked=function(params){return this.rs.projects.getProjects(params,!1).then(function(_this){return function(result){var data,projects;return data=result.data.slice(0,5),projects=Immutable.fromJS(data),projects=projects.map(_this.decorate),_this._mostLiked=projects}}(this))},DiscoverProjectsService.prototype.fetchMostActive=function(params){return this.rs.projects.getProjects(params,!1).then(function(_this){return function(result){var data,projects;return data=result.data.slice(0,5),projects=Immutable.fromJS(data),projects=projects.map(_this.decorate),_this._mostActive=projects}}(this))},DiscoverProjectsService.prototype.fetchFeatured=function(){var params;return params={is_featured:!0},this.rs.projects.getProjects(params,!1).then(function(_this){return function(result){var data,projects;return data=result.data.slice(0,4),projects=Immutable.fromJS(data),projects=projects.map(_this.decorate),_this._featured=projects}}(this))},DiscoverProjectsService.prototype.resetSearchList=function(){return this._searchResult=Immutable.List()},DiscoverProjectsService.prototype.fetchStats=function(){return this.rs.stats.discover().then(function(_this){return function(discover){return _this._projectsCount=discover.getIn(["projects","total"])}}(this))},DiscoverProjectsService.prototype.fetchSearch=function(params){return this.rs.projects.getProjects(params).then(function(_this){return function(result){var projects;return _this._nextSearchPage=!!result.headers("X-Pagination-Next"),projects=Immutable.fromJS(result.data),projects=projects.map(_this.decorate),_this._searchResult=_this._searchResult.concat(projects)}}(this))},DiscoverProjectsService}(taiga.Service),angular.module("taigaDiscover").service("tgDiscoverProjectsService",DiscoverProjectsService)}.call(this),function(){var ExternalAppController,taiga,bind=function(fn,me){return function(){return fn.apply(me,arguments)}},extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,ExternalAppController=function(superClass){function ExternalAppController(routeParams,externalAppsService,window,currentUserService,location,navUrls,xhrError,loader){var loginUrl,nextUrl;this.routeParams=routeParams,this.externalAppsService=externalAppsService,this.window=window,this.currentUserService=currentUserService,this.location=location,this.navUrls=navUrls,this.xhrError=xhrError,this.loader=loader,this.createApplicationToken=bind(this.createApplicationToken,this),this._getApplicationToken=bind(this._getApplicationToken,this),this._redirect=bind(this._redirect,this),this.loader.start(!1),this._applicationId=this.routeParams.application,this._state=this.routeParams.state,this._getApplicationToken(),this._user=this.currentUserService.getUser(),this._application=null,nextUrl=encodeURIComponent(this.location.url()),loginUrl=this.navUrls.resolve("login"),this.loginWithAnotherUserUrl=loginUrl+"?next="+nextUrl,taiga.defineImmutableProperty(this,"user",function(_this){return function(){return _this._user}}(this)),taiga.defineImmutableProperty(this,"application",function(_this){return function(){return _this._application}}(this))}return extend(ExternalAppController,superClass),ExternalAppController.$inject=["$routeParams","tgExternalAppsService","$window","tgCurrentUserService","$location","$tgNavUrls","tgXhrErrorService","tgLoader"],ExternalAppController.prototype._redirect=function(applicationToken){var nextUrl;return nextUrl=applicationToken.get("next_url"),this.window.open(nextUrl,"_self")},ExternalAppController.prototype._getApplicationToken=function(){return this.externalAppsService.getApplicationToken(this._applicationId,this._state).then(function(_this){return function(data){return _this._application=data.get("application"),data.get("auth_code")?_this._redirect(data):_this.loader.pageLoaded()}}(this))["catch"](function(_this){return function(xhr){return _this.loader.pageLoaded(),_this.xhrError.response(xhr)}}(this))},ExternalAppController.prototype.cancel=function(){return this.window.history.back()},ExternalAppController.prototype.createApplicationToken=function(){return this.externalAppsService.authorizeApplicationToken(this._applicationId,this._state).then(function(_this){return function(data){return _this._redirect(data)}}(this))["catch"](function(_this){return function(xhr){return _this.xhrError.response(xhr)}}(this))},ExternalAppController}(taiga.Controller),angular.module("taigaExternalApps").controller("ExternalApp",ExternalAppController)}.call(this),function(){var ExternalAppsService,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;ExternalAppsService=function(superClass){function ExternalAppsService(rs){this.rs=rs}return extend(ExternalAppsService,superClass),ExternalAppsService.$inject=["tgResources"],ExternalAppsService.prototype.getApplicationToken=function(applicationId,state){return this.rs.externalapps.getApplicationToken(applicationId,state)},ExternalAppsService.prototype.authorizeApplicationToken=function(applicationId,state){return this.rs.externalapps.authorizeApplicationToken(applicationId,state)},ExternalAppsService}(taiga.Service),angular.module("taigaExternalApps").service("tgExternalAppsService",ExternalAppsService)}.call(this),function(){var FeedbackService,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;FeedbackService=function(superClass){function FeedbackService(lightboxFactory){this.lightboxFactory=lightboxFactory}return extend(FeedbackService,superClass),FeedbackService.$inject=["tgLightboxFactory"],FeedbackService.prototype.sendFeedback=function(){return this.lightboxFactory.create("tg-lb-feedback",{"class":"lightbox lightbox-feedback lightbox-generic-form"})},FeedbackService}(taiga.Service),angular.module("taigaFeedback").service("tgFeedbackService",FeedbackService)}.call(this),function(){var DutyDirective;DutyDirective=function(navurls,$translate){var link;return link=function(scope,el,attrs,ctrl){return scope.vm={},scope.vm.duty=scope.duty,scope.vm.getDutyType=function(){if(scope.vm.duty){if("userstories"===scope.vm.duty.get("_name"))return $translate.instant("COMMON.USER_STORY");if("tasks"===scope.vm.duty.get("_name"))return $translate.instant("COMMON.TASK");if("issues"===scope.vm.duty.get("_name"))return $translate.instant("COMMON.ISSUE")}}},{templateUrl:"home/duties/duty.html",scope:{duty:"=tgDuty"},link:link}},DutyDirective.$inject=["$tgNavUrls","$translate"],angular.module("taigaHome").directive("tgDuty",DutyDirective)}.call(this),function(){var HomeController;HomeController=function(){function HomeController(currentUserService,location,navUrls){this.currentUserService=currentUserService,this.location=location,this.navUrls=navUrls,this.currentUserService.getUser()||this.location.path(this.navUrls.resolve("discover"))}return HomeController.$inject=["tgCurrentUserService","$location","$tgNavUrls"],HomeController}(),angular.module("taigaHome").controller("Home",HomeController)}.call(this),function(){var HomeService,groupBy,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;groupBy=this.taiga.groupBy,HomeService=function(superClass){function HomeService(navurls,rs,projectsService){this.navurls=navurls,this.rs=rs,this.projectsService=projectsService}return extend(HomeService,superClass),HomeService.$inject=["$tgNavUrls","tgResources","tgProjectsService"],HomeService.prototype._attachProjectInfoToWorkInProgress=function(workInProgress,projectsById){var _attachProjectInfoToDuty,_duties,assignedTo,watching;return _attachProjectInfoToDuty=function(_this){return function(duty,objType){var ctx,project,url;return project=projectsById.get(String(duty.get("project"))),ctx={project:project.get("slug"),ref:duty.get("ref")},url=_this.navurls.resolve("project-"+objType+"-detail",ctx),duty=duty.set("url",url),duty=duty.set("projectName",project.get("name")),duty=duty.set("_name",objType)}}(this),assignedTo=workInProgress.get("assignedTo"),assignedTo.get("userStories")&&(_duties=assignedTo.get("userStories").map(function(duty){return _attachProjectInfoToDuty(duty,"userstories")}),assignedTo=assignedTo.set("userStories",_duties)),assignedTo.get("tasks")&&(_duties=assignedTo.get("tasks").map(function(duty){return _attachProjectInfoToDuty(duty,"tasks")}),assignedTo=assignedTo.set("tasks",_duties)),assignedTo.get("issues")&&(_duties=assignedTo.get("issues").map(function(duty){return _attachProjectInfoToDuty(duty,"issues")}),assignedTo=assignedTo.set("issues",_duties)),watching=workInProgress.get("watching"),watching.get("userStories")&&(_duties=watching.get("userStories").filter(function(duty){return!!projectsById.get(String(duty.get("project")))}),_duties=_duties.map(function(duty){return _attachProjectInfoToDuty(duty,"userstories")}),watching=watching.set("userStories",_duties)),watching.get("tasks")&&(_duties=watching.get("tasks").filter(function(duty){return!!projectsById.get(String(duty.get("project")))}),_duties=_duties.map(function(duty){return _attachProjectInfoToDuty(duty,"tasks")}),watching=watching.set("tasks",_duties)),watching.get("issues")&&(_duties=watching.get("issues").filter(function(duty){return!!projectsById.get(String(duty.get("project")))}),_duties=_duties.map(function(duty){return _attachProjectInfoToDuty(duty,"issues")}),watching=watching.set("issues",_duties)),workInProgress=workInProgress.set("assignedTo",assignedTo),workInProgress=workInProgress.set("watching",watching)},HomeService.prototype.getWorkInProgress=function(userId){var assignedIssuesPromise,assignedTasksPromise,assignedTo,assignedUserStoriesPromise,params,params_us,projectsById,projectsPromise,watching,watchingIssuesPromise,watchingTasksPromise,watchingUserStoriesPromise,workInProgress;return projectsById=Immutable.Map(),projectsPromise=this.projectsService.getProjectsByUserId(userId).then(function(projects){return projectsById=Immutable.fromJS(groupBy(projects.toJS(),function(p){return p.id}))}),assignedTo=Immutable.Map(),params={status__is_closed:!1,assigned_to:userId},params_us={is_closed:!1,assigned_to:userId},assignedUserStoriesPromise=this.rs.userstories.listInAllProjects(params_us).then(function(userstories){return assignedTo=assignedTo.set("userStories",userstories)}),assignedTasksPromise=this.rs.tasks.listInAllProjects(params).then(function(tasks){return assignedTo=assignedTo.set("tasks",tasks)}),assignedIssuesPromise=this.rs.issues.listInAllProjects(params).then(function(issues){return assignedTo=assignedTo.set("issues",issues)}),params={status__is_closed:!1,watchers:userId},params_us={is_closed:!1,watchers:userId},watching=Immutable.Map(),watchingUserStoriesPromise=this.rs.userstories.listInAllProjects(params_us).then(function(userstories){return watching=watching.set("userStories",userstories)}),watchingTasksPromise=this.rs.tasks.listInAllProjects(params).then(function(tasks){return watching=watching.set("tasks",tasks)}),watchingIssuesPromise=this.rs.issues.listInAllProjects(params).then(function(issues){return watching=watching.set("issues",issues)}),workInProgress=Immutable.Map(),Promise.all([projectsPromise,assignedUserStoriesPromise,assignedTasksPromise,assignedIssuesPromise,watchingUserStoriesPromise,watchingTasksPromise,watchingIssuesPromise]).then(function(_this){return function(){return workInProgress=workInProgress.set("assignedTo",assignedTo),workInProgress=workInProgress.set("watching",watching),workInProgress=_this._attachProjectInfoToWorkInProgress(workInProgress,projectsById)}}(this))},HomeService}(taiga.Service),angular.module("taigaHome").service("tgHomeService",HomeService)}.call(this),function(){var HomeProjectListDirective;HomeProjectListDirective=function(currentUserService,projectsService){var directive,link;return link=function(scope,el,attrs,ctrl){return scope.vm={},taiga.defineImmutableProperty(scope.vm,"projects",function(){return currentUserService.projects.get("recents")}),scope.vm.newProject=function(){return projectsService.newProject()}},directive={templateUrl:"home/projects/home-project-list.html",scope:{},link:link}},HomeProjectListDirective.$inject=["tgCurrentUserService","tgProjectsService"],angular.module("taigaHome").directive("tgHomeProjectList",HomeProjectListDirective)}.call(this),function(){var WorkingOnController;WorkingOnController=function(){function WorkingOnController(homeService){this.homeService=homeService,this.assignedTo=Immutable.Map(),this.watching=Immutable.Map()}return WorkingOnController.$inject=["tgHomeService"],WorkingOnController.prototype._setAssignedTo=function(workInProgress){var issues,tasks,userStories;return userStories=workInProgress.get("assignedTo").get("userStories"),tasks=workInProgress.get("assignedTo").get("tasks"),issues=workInProgress.get("assignedTo").get("issues"),this.assignedTo=userStories.concat(tasks).concat(issues),this.assignedTo.size>0?this.assignedTo=this.assignedTo.sortBy(function(elem){return elem.get("modified_date")}).reverse():void 0; -},WorkingOnController.prototype._setWatching=function(workInProgress){var issues,tasks,userStories;return userStories=workInProgress.get("watching").get("userStories"),tasks=workInProgress.get("watching").get("tasks"),issues=workInProgress.get("watching").get("issues"),this.watching=userStories.concat(tasks).concat(issues),this.watching.size>0?this.watching=this.watching.sortBy(function(elem){return elem.get("modified_date")}).reverse():void 0},WorkingOnController.prototype.getWorkInProgress=function(userId){return this.homeService.getWorkInProgress(userId).then(function(_this){return function(workInProgress){return _this._setAssignedTo(workInProgress),_this._setWatching(workInProgress)}}(this))},WorkingOnController}(),angular.module("taigaHome").controller("WorkingOn",WorkingOnController)}.call(this),function(){var WorkingOnDirective;WorkingOnDirective=function(homeService,currentUserService){var link;return link=function(scope,el,attrs,ctrl){var user,userId;return user=currentUserService.getUser(),user?(userId=user.get("id"),ctrl.getWorkInProgress(userId)):void 0},{controller:"WorkingOn",controllerAs:"vm",templateUrl:"home/working-on/working-on.html",scope:{},link:link}},WorkingOnDirective.$inject=["tgHomeService","tgCurrentUserService"],angular.module("taigaHome").directive("tgWorkingOn",WorkingOnDirective)}.call(this),function(){var DropdownProjectListDirective;DropdownProjectListDirective=function(currentUserService,projectsService){var directive,link;return link=function(scope,el,attrs,ctrl){return scope.vm={},taiga.defineImmutableProperty(scope.vm,"projects",function(){return currentUserService.projects.get("recents")}),scope.vm.newProject=function(){return projectsService.newProject()}},directive={templateUrl:"navigation-bar/dropdown-project-list/dropdown-project-list.html",scope:{},link:link}},DropdownProjectListDirective.$inject=["tgCurrentUserService","tgProjectsService"],angular.module("taigaNavigationBar").directive("tgDropdownProjectList",DropdownProjectListDirective)}.call(this),function(){var DropdownUserDirective;DropdownUserDirective=function(authService,configService,locationService,navUrlsService,feedbackService){var directive,link;return link=function(scope,el,attrs,ctrl){return scope.vm={},scope.vm.isFeedbackEnabled=configService.get("feedbackEnabled"),taiga.defineImmutableProperty(scope.vm,"user",function(){return authService.userData}),scope.vm.logout=function(){return authService.logout(),locationService.url(navUrlsService.resolve("discover")),locationService.search({})},scope.vm.sendFeedback=function(){return feedbackService.sendFeedback()}},directive={templateUrl:"navigation-bar/dropdown-user/dropdown-user.html",scope:{},link:link}},DropdownUserDirective.$inject=["$tgAuth","$tgConfig","$tgLocation","$tgNavUrls","tgFeedbackService"],angular.module("taigaNavigationBar").directive("tgDropdownUser",DropdownUserDirective)}.call(this),function(){var NavigationBarDirective;NavigationBarDirective=function(currentUserService,navigationBarService,locationService,navUrlsService){var directive,link;return link=function(scope,el,attrs,ctrl){return scope.vm={},scope.$on("$routeChangeSuccess",function(){return"/"===locationService.path()?scope.vm.active=!0:scope.vm.active=!1}),taiga.defineImmutableProperty(scope.vm,"projects",function(){return currentUserService.projects.get("recents")}),taiga.defineImmutableProperty(scope.vm,"isAuthenticated",function(){return currentUserService.isAuthenticated()}),taiga.defineImmutableProperty(scope.vm,"isEnabledHeader",function(){return navigationBarService.isEnabledHeader()}),scope.vm.login=function(){var nextUrl;return nextUrl=encodeURIComponent(locationService.url()),locationService.url(navUrlsService.resolve("login")),locationService.search({next:nextUrl})},scope.vm.register=function(){var nextUrl;return nextUrl=encodeURIComponent(locationService.url()),locationService.url(navUrlsService.resolve("register")),locationService.search({next:nextUrl})}},directive={templateUrl:"navigation-bar/navigation-bar.html",scope:{},link:link}},NavigationBarDirective.$inject=["tgCurrentUserService","tgNavigationBarService","$tgLocation","$tgNavUrls"],angular.module("taigaNavigationBar").directive("tgNavigationBar",NavigationBarDirective)}.call(this),function(){var NavigationBarService,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;NavigationBarService=function(superClass){function NavigationBarService(){this.disableHeader()}return extend(NavigationBarService,superClass),NavigationBarService.prototype.enableHeader=function(){return this.enabledHeader=!0},NavigationBarService.prototype.disableHeader=function(){return this.enabledHeader=!1},NavigationBarService.prototype.isEnabledHeader=function(){return this.enabledHeader},NavigationBarService}(taiga.Service),angular.module("taigaNavigationBar").service("tgNavigationBarService",NavigationBarService)}.call(this),function(){var ProfileBarController;ProfileBarController=function(){function ProfileBarController(userService){this.userService=userService,this.loadStats()}return ProfileBarController.$inject=["tgUserService"],ProfileBarController.prototype.loadStats=function(){return this.userService.getStats(this.user.get("id")).then(function(_this){return function(stats){return _this.stats=stats}}(this))},ProfileBarController}(),angular.module("taigaProfile").controller("ProfileBar",ProfileBarController)}.call(this),function(){var ProfileBarDirective;ProfileBarDirective=function(){return{templateUrl:"profile/profile-bar/profile-bar.html",controller:"ProfileBar",controllerAs:"vm",scope:{user:"=user",isCurrentUser:"=iscurrentuser"},bindToController:!0}},angular.module("taigaProfile").directive("tgProfileBar",ProfileBarDirective)}.call(this),function(){var ProfileContactsController;ProfileContactsController=function(){function ProfileContactsController(userService,currentUserService){this.userService=userService,this.currentUserService=currentUserService,this.currentUser=this.currentUserService.getUser(),this.isCurrentUser=!1,this.currentUser&&this.currentUser.get("id")===this.user.get("id")&&(this.isCurrentUser=!0)}return ProfileContactsController.$inject=["tgUserService","tgCurrentUserService"],ProfileContactsController.prototype.loadContacts=function(){return this.userService.getContacts(this.user.get("id")).then(function(_this){return function(contacts){return _this.contacts=contacts}}(this))},ProfileContactsController}(),angular.module("taigaProfile").controller("ProfileContacts",ProfileContactsController)}.call(this),function(){var ProfileContactsDirective;ProfileContactsDirective=function(){var link;return link=function(scope,elm,attrs,ctrl){return ctrl.loadContacts()},{templateUrl:"profile/profile-contacts/profile-contacts.html",scope:{user:"="},controllerAs:"vm",controller:"ProfileContacts",link:link,bindToController:!0}},angular.module("taigaProfile").directive("tgProfileContacts",ProfileContactsDirective)}.call(this),function(){var FavItemDirective;FavItemDirective=function(){var link,templateUrl;return link=function(scope,el,attrs,ctrl){return scope.vm={item:scope.item}},templateUrl=function(el,attrs){return"project"===attrs.itemType?"profile/profile-favs/items/project.html":"profile/profile-favs/items/ticket.html"},{scope:{item:"=tgFavItem"},link:link,templateUrl:templateUrl}},angular.module("taigaProfile").directive("tgFavItem",FavItemDirective)}.call(this),function(){var FavsBaseController,ProfileLikedController,ProfileVotedController,ProfileWatchedController,debounceLeading,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;debounceLeading=this.taiga.debounceLeading,FavsBaseController=function(){function FavsBaseController(){this._init()}return FavsBaseController.prototype._init=function(){return this.enableFilterByAll=!0,this.enableFilterByProjects=!0,this.enableFilterByUserStories=!0,this.enableFilterByTasks=!0,this.enableFilterByIssues=!0,this.enableFilterByTextQuery=!0,this._resetList(),this.q=null,this.type=null},FavsBaseController.prototype._resetList=function(){return this.items=Immutable.List(),this.scrollDisabled=!1,this._page=1},FavsBaseController.prototype._enableLoadingSpinner=function(){return this.isLoading=!0},FavsBaseController.prototype._disableLoadingSpinner=function(){return this.isLoading=!1},FavsBaseController.prototype._enableScroll=function(){return this.scrollDisabled=!1},FavsBaseController.prototype._disableScroll=function(){return this.scrollDisabled=!0},FavsBaseController.prototype._checkIfHasMorePages=function(hasNext){return hasNext?(this._page+=1,this._enableScroll()):this._disableScroll()},FavsBaseController.prototype._checkIfHasNoResults=function(){return this.hasNoResults=0===this.items.size},FavsBaseController.prototype.loadItems=function(){return this._enableLoadingSpinner(),this._disableScroll(),this._getItems(this.user.get("id"),this._page,this.type,this.q).then(function(_this){return function(response){return _this.items=_this.items.concat(response.get("data")),_this._checkIfHasMorePages(response.get("next")),_this._checkIfHasNoResults(),_this._disableLoadingSpinner(),_this.items}}(this))["catch"](function(_this){return function(){return _this._disableLoadingSpinner(),_this.items}}(this))},FavsBaseController.prototype.filterByTextQuery=debounceLeading(500,function(){return this._resetList(),this.loadItems()}),FavsBaseController.prototype.showAll=function(){return null!==this.type?(this.type=null,this._resetList(),this.loadItems()):void 0},FavsBaseController.prototype.showProjectsOnly=function(){return"project"!==this.type?(this.type="project",this._resetList(),this.loadItems()):void 0},FavsBaseController.prototype.showUserStoriesOnly=function(){return"userstory"!==this.type?(this.type="userstory",this._resetList(),this.loadItems()):void 0},FavsBaseController.prototype.showTasksOnly=function(){return"task"!==this.type?(this.type="task",this._resetList(),this.loadItems()):void 0},FavsBaseController.prototype.showIssuesOnly=function(){return"issue"!==this.type?(this.type="issue",this._resetList(),this.loadItems()):void 0},FavsBaseController}(),ProfileLikedController=function(superClass){function ProfileLikedController(userService){this.userService=userService,ProfileLikedController.__super__.constructor.call(this),this.enableFilterByAll=!1,this.enableFilterByProjects=!1,this.enableFilterByUserStories=!1,this.enableFilterByTasks=!1,this.enableFilterByIssues=!1,this.enableFilterByTextQuery=!0,this._getItems=this.userService.getLiked}return extend(ProfileLikedController,superClass),ProfileLikedController.$inject=["tgUserService"],ProfileLikedController}(FavsBaseController),angular.module("taigaProfile").controller("ProfileLiked",ProfileLikedController),ProfileVotedController=function(superClass){function ProfileVotedController(userService){this.userService=userService,ProfileVotedController.__super__.constructor.call(this),this.enableFilterByAll=!0,this.enableFilterByProjects=!1,this.enableFilterByUserStories=!0,this.enableFilterByTasks=!0,this.enableFilterByIssues=!0,this.enableFilterByTextQuery=!0,this._getItems=this.userService.getVoted}return extend(ProfileVotedController,superClass),ProfileVotedController.$inject=["tgUserService"],ProfileVotedController}(FavsBaseController),angular.module("taigaProfile").controller("ProfileVoted",ProfileVotedController),ProfileWatchedController=function(superClass){function ProfileWatchedController(userService){this.userService=userService,ProfileWatchedController.__super__.constructor.call(this),this._getItems=this.userService.getWatched}return extend(ProfileWatchedController,superClass),ProfileWatchedController.$inject=["tgUserService"],ProfileWatchedController}(FavsBaseController),angular.module("taigaProfile").controller("ProfileWatched",ProfileWatchedController)}.call(this),function(){var ProfileLikedDirective,ProfileVotedDirective,ProfileWatchedDirective,base;base={scope:{},bindToController:{user:"=",type:"@",q:"@",scrollDisabled:"@",isLoading:"@",hasNoResults:"@"},controller:null,controllerAs:"vm",templateUrl:"profile/profile-favs/profile-favs.html"},ProfileLikedDirective=function(){return _.extend({},base,{controller:"ProfileLiked"})},angular.module("taigaProfile").directive("tgProfileLiked",ProfileLikedDirective),ProfileVotedDirective=function(){return _.extend({},base,{controller:"ProfileVoted"})},angular.module("taigaProfile").directive("tgProfileVoted",ProfileVotedDirective),ProfileWatchedDirective=function(){return _.extend({},base,{controller:"ProfileWatched"})},angular.module("taigaProfile").directive("tgProfileWatched",ProfileWatchedDirective)}.call(this),function(){var ProfileHints;ProfileHints=function(){function ProfileHints(translate){var hintKey;this.translate=translate,hintKey=Math.floor(Math.random()*this.HINTS.length)+1,this.hint=this.HINTS[hintKey-1],this.hint.linkText=this.hint.linkText||"HINTS.LINK",this.hint.title=this.translate.instant("HINTS.HINT"+hintKey+"_TITLE"),this.hint.text=this.translate.instant("HINTS.HINT"+hintKey+"_TEXT")}return ProfileHints.prototype.HINTS=[{url:"https://taiga.io/support/import-export-projects/"},{url:"https://taiga.io/support/custom-fields/"},{},{}],ProfileHints}(),ProfileHints.$inject=["$translate"],angular.module("taigaProfile").controller("ProfileHints",ProfileHints)}.call(this),function(){var ProfileHints;ProfileHints=function($translate){return{scope:{},controller:"ProfileHints",controllerAs:"vm",templateUrl:"profile/profile-hints/profile-hints.html"}},ProfileHints.$inject=["$translate"],angular.module("taigaProfile").directive("tgProfileHints",ProfileHints)}.call(this),function(){var ProfileProjectsController;ProfileProjectsController=function(){function ProfileProjectsController(projectsService,userService){this.projectsService=projectsService,this.userService=userService}return ProfileProjectsController.$inject=["tgProjectsService","tgUserService"],ProfileProjectsController.prototype.loadProjects=function(){return this.projectsService.getProjectsByUserId(this.user.get("id")).then(function(_this){return function(projects){return _this.userService.attachUserContactsToProjects(_this.user.get("id"),projects)}}(this)).then(function(_this){return function(projects){return _this.projects=projects}}(this))},ProfileProjectsController}(),angular.module("taigaProfile").controller("ProfileProjects",ProfileProjectsController)}.call(this),function(){var ProfileProjectsDirective;ProfileProjectsDirective=function(){var link;return link=function(scope,elm,attr,ctrl){return ctrl.loadProjects()},{templateUrl:"profile/profile-projects/profile-projects.html",scope:{user:"="},link:link,bindToController:!0,controllerAs:"vm",controller:"ProfileProjects"}},angular.module("taigaProfile").directive("tgProfileProjects",ProfileProjectsDirective)}.call(this),function(){var ProfileTabDirective;ProfileTabDirective=function(){var link;return link=function(scope,element,attrs,ctrl,transclude){return scope.tab={},attrs.$observe("tgProfileTab",function(name){return scope.tab.name=name}),attrs.$observe("tabTitle",function(title){return scope.tab.title=title}),scope.tab.icon=attrs.tabIcon,scope.tab.active=!!attrs.tabActive,scope.$eval(attrs.tabDisabled)!==!0?ctrl.addTab(scope.tab):void 0},{templateUrl:"profile/profile-tab/profile-tab.html",scope:{},require:"^tgProfileTabs",link:link,transclude:!0}},angular.module("taigaProfile").directive("tgProfileTab",ProfileTabDirective)}.call(this),function(){var ProfileTabsController;ProfileTabsController=function(){function ProfileTabsController(){this.tabs=[]}return ProfileTabsController.prototype.addTab=function(tab){return this.tabs.push(tab)},ProfileTabsController.prototype.toggleTab=function(tab){return _.map(this.tabs,function(tab){return tab.active=!1}),tab.active=!0},ProfileTabsController}(),angular.module("taigaProfile").controller("ProfileTabs",ProfileTabsController)}.call(this),function(){var ProfileTabsDirective;ProfileTabsDirective=function(){return{scope:{},controller:"ProfileTabs",controllerAs:"vm",templateUrl:"profile/profile-tabs/profile-tabs.html",transclude:!0}},angular.module("taigaProfile").directive("tgProfileTabs",ProfileTabsDirective)}.call(this),function(){var ProfileController;ProfileController=function(){function ProfileController(appMetaService,currentUserService,routeParams,userService,xhrError,translate){this.appMetaService=appMetaService,this.currentUserService=currentUserService,this.routeParams=routeParams,this.userService=userService,this.xhrError=xhrError,this.translate=translate,this.isCurrentUser=!1,this.routeParams.slug?this.userService.getUserByUserName(this.routeParams.slug).then(function(_this){return function(user){return user.get("is_active")?(_this.user=user,_this.isCurrentUser=!1,_this._setMeta(_this.user),user):_this.xhrError.notFound()}}(this))["catch"](function(_this){return function(xhr){return _this.xhrError.response(xhr)}}(this)):(this.user=this.currentUserService.getUser(),this.isCurrentUser=!0,this._setMeta(this.user))}return ProfileController.$inject=["tgAppMetaService","tgCurrentUserService","$routeParams","tgUserService","tgXhrErrorService","$translate"],ProfileController.prototype._setMeta=function(user){var ctx,description,title;return ctx={userFullName:user.get("full_name_display"),userUsername:user.get("username")},title=this.translate.instant("USER.PROFILE.PAGE_TITLE",ctx),description=user.get("bio"),this.appMetaService.setAll(title,description)},ProfileController}(),angular.module("taigaProfile").controller("Profile",ProfileController)}.call(this),function(){var LikeProjectButtonController;LikeProjectButtonController=function(){function LikeProjectButtonController(confirm,likeButtonService){this.confirm=confirm,this.likeButtonService=likeButtonService,this.isMouseOver=!1,this.loading=!1}return LikeProjectButtonController.$inject=["$tgConfirm","tgLikeProjectButtonService"],LikeProjectButtonController.prototype.showTextWhenMouseIsOver=function(){return this.isMouseOver=!0},LikeProjectButtonController.prototype.showTextWhenMouseIsLeave=function(){return this.isMouseOver=!1},LikeProjectButtonController.prototype.toggleLike=function(){var promise;return this.loading=!0,promise=this.project.get("is_fan")?this._unlike():this._like(),promise["finally"](function(_this){return function(){return _this.loading=!1}}(this)),promise},LikeProjectButtonController.prototype._like=function(){return this.likeButtonService.like(this.project.get("id")).then(function(_this){return function(){return _this.showTextWhenMouseIsLeave()}}(this))["catch"](function(_this){return function(){return _this.confirm.notify("error")}}(this))},LikeProjectButtonController.prototype._unlike=function(){return this.likeButtonService.unlike(this.project.get("id"))["catch"](function(_this){return function(){return _this.confirm.notify("error")}}(this))},LikeProjectButtonController}(),angular.module("taigaProjects").controller("LikeProjectButton",LikeProjectButtonController)}.call(this),function(){var LikeProjectButtonDirective;LikeProjectButtonDirective=function(){return{scope:{},controller:"LikeProjectButton",bindToController:{project:"="},controllerAs:"vm",templateUrl:"projects/components/like-project-button/like-project-button.html"}},angular.module("taigaProjects").directive("tgLikeProjectButton",LikeProjectButtonDirective)}.call(this),function(){var LikeProjectButtonService,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,LikeProjectButtonService=function(superClass){function LikeProjectButtonService(rs,currentUserService,projectService){this.rs=rs,this.currentUserService=currentUserService,this.projectService=projectService}return extend(LikeProjectButtonService,superClass),LikeProjectButtonService.$inject=["tgResources","tgCurrentUserService","tgProjectService"],LikeProjectButtonService.prototype._getProjectIndex=function(projectId){return this.currentUserService.projects.get("all").findIndex(function(project){return project.get("id")===projectId})},LikeProjectButtonService.prototype._updateProjects=function(projectId,isFan){var projectIndex,projects;return projectIndex=this._getProjectIndex(projectId),-1!==projectIndex?(projects=this.currentUserService.projects.get("all").update(projectIndex,function(project){var totalFans;return totalFans=project.get("total_fans"),isFan?totalFans++:totalFans--,project.merge({is_fan:isFan,total_fans:totalFans})}),this.currentUserService.setProjects(projects)):void 0},LikeProjectButtonService.prototype._updateCurrentProject=function(isFan){var project,totalFans;return totalFans=this.projectService.project.get("total_fans"),isFan?totalFans++:totalFans--,project=this.projectService.project.merge({is_fan:isFan,total_fans:totalFans}),this.projectService.setProject(project)},LikeProjectButtonService.prototype.like=function(projectId){return this.rs.projects.likeProject(projectId).then(function(_this){return function(){return _this._updateProjects(projectId,!0),_this._updateCurrentProject(!0)}}(this))},LikeProjectButtonService.prototype.unlike=function(projectId){return this.rs.projects.unlikeProject(projectId).then(function(_this){return function(){return _this._updateProjects(projectId,!1),_this._updateCurrentProject(!1)}}(this))},LikeProjectButtonService}(taiga.Service),angular.module("taigaProjects").service("tgLikeProjectButtonService",LikeProjectButtonService)}.call(this),function(){var SortProjectsDirective;SortProjectsDirective=function(currentUserService){var directive,link;return link=function(scope,el,attrs,ctrl){var itemEl;return itemEl=null,el.sortable({dropOnEmpty:!0,revert:200,axis:"y",opacity:.95,placeholder:"placeholder",cancel:".project-name"}),el.on("sortstop",function(event,ui){var i,index,len,project,sortData,sorted_project_ids,value;for(itemEl=ui.item,project=itemEl.scope().project,index=itemEl.index(),sorted_project_ids=_.map(scope.projects.toJS(),function(p){return p.id}),sorted_project_ids=_.without(sorted_project_ids,project.get("id")),sorted_project_ids.splice(index,0,project.get("id")),sortData=[],index=i=0,len=sorted_project_ids.length;len>i;index=++i)value=sorted_project_ids[index],sortData.push({project_id:value,order:index});return currentUserService.bulkUpdateProjectsOrder(sortData)})},directive={scope:{projects:"=tgSortProjects"},link:link}},angular.module("taigaProjects").directive("tgSortProjects",["tgCurrentUserService",SortProjectsDirective])}.call(this),function(){var WatchProjectButtonController;WatchProjectButtonController=function(){function WatchProjectButtonController(confirm,watchButtonService){this.confirm=confirm,this.watchButtonService=watchButtonService,this.showWatchOptions=!1,this.loading=!1}return WatchProjectButtonController.$inject=["$tgConfirm","tgWatchProjectButtonService"],WatchProjectButtonController.prototype.toggleWatcherOptions=function(){return this.showWatchOptions=!this.showWatchOptions},WatchProjectButtonController.prototype.closeWatcherOptions=function(){return this.showWatchOptions=!1},WatchProjectButtonController.prototype.watch=function(notifyLevel){return notifyLevel!==this.project.get("notify_level")?(this.loading=!0,this.closeWatcherOptions(),this.watchButtonService.watch(this.project.get("id"),notifyLevel)["catch"](function(_this){return function(){return _this.confirm.notify("error")}}(this))["finally"](function(_this){return function(){return _this.loading=!1}}(this))):void 0},WatchProjectButtonController.prototype.unwatch=function(){return this.loading=!0,this.closeWatcherOptions(),this.watchButtonService.unwatch(this.project.get("id"))["catch"](function(_this){return function(){return _this.confirm.notify("error")}}(this))["finally"](function(_this){return function(){return _this.loading=!1}}(this))},WatchProjectButtonController}(),angular.module("taigaProjects").controller("WatchProjectButton",WatchProjectButtonController)}.call(this),function(){var WatchProjectButtonDirective;WatchProjectButtonDirective=function(){return{scope:{},controller:"WatchProjectButton",bindToController:{project:"="},controllerAs:"vm",templateUrl:"projects/components/watch-project-button/watch-project-button.html"}},angular.module("taigaProjects").directive("tgWatchProjectButton",WatchProjectButtonDirective)}.call(this),function(){var WatchProjectButtonService,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,WatchProjectButtonService=function(superClass){function WatchProjectButtonService(rs,currentUserService,projectService){this.rs=rs,this.currentUserService=currentUserService,this.projectService=projectService}return extend(WatchProjectButtonService,superClass),WatchProjectButtonService.$inject=["tgResources","tgCurrentUserService","tgProjectService"],WatchProjectButtonService.prototype._getProjectIndex=function(projectId){return this.currentUserService.projects.get("all").findIndex(function(project){return project.get("id")===projectId})},WatchProjectButtonService.prototype._updateProjects=function(projectId,notifyLevel,isWatcher){var projectIndex,projects;return projectIndex=this._getProjectIndex(projectId),-1!==projectIndex?(projects=this.currentUserService.projects.get("all").update(projectIndex,function(_this){return function(project){var totalWatchers;return totalWatchers=project.get("total_watchers"),!_this.projectService.project.get("is_watcher")&&isWatcher?totalWatchers++:_this.projectService.project.get("is_watcher")&&!isWatcher&&totalWatchers--,project.merge({is_watcher:isWatcher,total_watchers:totalWatchers,notify_level:notifyLevel})}}(this)),this.currentUserService.setProjects(projects)):void 0},WatchProjectButtonService.prototype._updateCurrentProject=function(notifyLevel,isWatcher){var project,totalWatchers;return totalWatchers=this.projectService.project.get("total_watchers"),!this.projectService.project.get("is_watcher")&&isWatcher?totalWatchers++:this.projectService.project.get("is_watcher")&&!isWatcher&&totalWatchers--,project=this.projectService.project.merge({is_watcher:isWatcher,notify_level:notifyLevel,total_watchers:totalWatchers}),this.projectService.setProject(project)},WatchProjectButtonService.prototype.watch=function(projectId,notifyLevel){return this.rs.projects.watchProject(projectId,notifyLevel).then(function(_this){return function(){return _this._updateProjects(projectId,notifyLevel,!0),_this._updateCurrentProject(notifyLevel,!0)}}(this))},WatchProjectButtonService.prototype.unwatch=function(projectId){return this.rs.projects.unwatchProject(projectId).then(function(_this){return function(){return _this._updateProjects(projectId,null,!1),_this._updateCurrentProject(null,!1)}}(this))},WatchProjectButtonService}(taiga.Service),angular.module("taigaProjects").service("tgWatchProjectButtonService",WatchProjectButtonService)}.call(this),function(){var ProjectsListingController;ProjectsListingController=function(){function ProjectsListingController(currentUserService,projectsService){this.currentUserService=currentUserService,this.projectsService=projectsService,taiga.defineImmutableProperty(this,"projects",function(_this){return function(){return _this.currentUserService.projects.get("all")}}(this))}return ProjectsListingController.$inject=["tgCurrentUserService","tgProjectsService"],ProjectsListingController.prototype.newProject=function(){return this.projectsService.newProject()},ProjectsListingController}(),angular.module("taigaProjects").controller("ProjectsListing",ProjectsListingController)}.call(this),function(){var ProjectController;ProjectController=function(){function ProjectController(routeParams,appMetaService,auth,translate,projectService){var projectSlug;this.routeParams=routeParams,this.appMetaService=appMetaService,this.auth=auth,this.translate=translate,this.projectService=projectService,projectSlug=this.routeParams.pslug,this.user=this.auth.userData,taiga.defineImmutableProperty(this,"project",function(_this){return function(){return _this.projectService.project}}(this)),taiga.defineImmutableProperty(this,"members",function(_this){return function(){return _this.projectService.activeMembers}}(this)),this.appMetaService.setfn(this._setMeta.bind(this))}return ProjectController.$inject=["$routeParams","tgAppMetaService","$tgAuth","$translate","tgProjectService"],ProjectController.prototype._setMeta=function(project){var ctx,metas;return this.project?(metas={},ctx={projectName:this.project.get("name")},metas.title=this.translate.instant("PROJECT.PAGE_TITLE",ctx),metas.description=this.project.get("description"),metas):null},ProjectController}(),angular.module("taigaProjects").controller("Project",ProjectController)}.call(this),function(){var ProjectsService,groupBy,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,groupBy=this.taiga.groupBy,ProjectsService=function(superClass){function ProjectsService(rs,projectUrl,lightboxFactory){this.rs=rs,this.projectUrl=projectUrl,this.lightboxFactory=lightboxFactory}return extend(ProjectsService,superClass),ProjectsService.$inject=["tgResources","$projectUrl","tgLightboxFactory"],ProjectsService.prototype.getProjectBySlug=function(projectSlug){return this.rs.projects.getProjectBySlug(projectSlug).then(function(_this){return function(project){return _this._decorate(project)}}(this))},ProjectsService.prototype.getProjectStats=function(projectId){return this.rs.projects.getProjectStats(projectId)},ProjectsService.prototype.getProjectsByUserId=function(userId,paginate){return this.rs.projects.getProjectsByUserId(userId,paginate).then(function(_this){return function(projects){return projects.map(_this._decorate.bind(_this))}}(this))},ProjectsService.prototype._decorate=function(project){var colorized_tags,tags,url;return url=this.projectUrl.get(project.toJS()),project=project.set("url",url),colorized_tags=[],project.get("tags")&&(tags=project.get("tags").sort(),colorized_tags=tags.map(function(tag){var color;return color=project.get("tags_colors").get(tag),Immutable.fromJS({name:tag,color:color})}),project=project.set("colorized_tags",colorized_tags)),project},ProjectsService.prototype.newProject=function(){return this.lightboxFactory.create("tg-lb-create-project",{"class":"wizard-create-project"})},ProjectsService.prototype.bulkUpdateProjectsOrder=function(sortData){return this.rs.projects.bulkUpdateOrder(sortData)},ProjectsService}(taiga.Service),angular.module("taigaProjects").service("tgProjectsService",ProjectsService)}.call(this),function(){var Resource,module,sizeFormat,taiga;taiga=this.taiga,sizeFormat=this.taiga.sizeFormat,Resource=function(urlsService,http,config,$rootScope,$q,storage){var service;return service={},service.list=function(type,objectId,projectId){var httpOptions,params,url,urlname;return urlname="attachments/"+type,params={object_id:objectId,project:projectId},httpOptions={headers:{"x-disable-pagination":"1"}},url=urlsService.resolve(urlname),http.get(url,params,httpOptions).then(function(result){return Immutable.fromJS(result.data)})},service["delete"]=function(type,id){var url,urlname;return urlname="attachments/"+type, -url=urlsService.resolve(urlname)+("/"+id),http["delete"](url)},service.patch=function(type,id,patch){var url,urlname;return urlname="attachments/"+type,url=urlsService.resolve(urlname)+("/"+id),http.patch(url,patch)},service.create=function(type,projectId,objectId,file){var data,defered,maxFileSize,response,token,uploadComplete,uploadFailed,uploadProgress,url,urlname,xhr;return urlname="attachments/"+type,url=urlsService.resolve(urlname),defered=$q.defer(),void 0===file?(defered.reject(null),defered.promise):(maxFileSize=config.get("maxUploadFileSize",null),maxFileSize&&file.size>maxFileSize?(response={status:413,data:{_error_message:"'"+file.name+"' ("+sizeFormat(file.size)+") is too heavy for our oompa loompas, try it with a smaller than ("+sizeFormat(maxFileSize)+")"}},defered.reject(response),defered.promise):(uploadProgress=function(_this){return function(evt){return $rootScope.$apply(function(){return file.status="in-progress",file.size=sizeFormat(evt.total),file.progressMessage="upload "+sizeFormat(evt.loaded)+" of "+sizeFormat(evt.total),file.progressPercent=Math.round(evt.loaded/evt.total*100)+"%"})}}(this),uploadComplete=function(_this){return function(evt){return $rootScope.$apply(function(){var attachment,ref,status;file.status="done",status=evt.target.status;try{attachment=JSON.parse(evt.target.responseText)}catch(error){attachment={}}return status>=200&&400>status?(attachment=Immutable.fromJS(attachment),defered.resolve(attachment)):(response={status:status,data:{_error_message:null!=(ref=data.attached_file)?ref[0]:void 0}},defered.reject(response))})}}(this),uploadFailed=function(_this){return function(evt){return $rootScope.$apply(function(){return file.status="error",defered.reject("fail")})}}(this),data=new FormData,data.append("project",projectId),data.append("object_id",objectId),data.append("attached_file",file),xhr=new XMLHttpRequest,xhr.upload.addEventListener("progress",uploadProgress,!1),xhr.addEventListener("load",uploadComplete,!1),xhr.addEventListener("error",uploadFailed,!1),token=storage.get("token"),xhr.open("POST",url),xhr.setRequestHeader("Authorization","Bearer "+token),xhr.setRequestHeader("Accept","application/json"),xhr.send(data),defered.promise))},function(){return{attachments:service}}},Resource.$inject=["$tgUrls","$tgHttp","$tgConfig","$rootScope","$q","$tgStorage"],module=angular.module("taigaResources2"),module.factory("tgAttachmentsResource",Resource)}.call(this),function(){var Resource,module;Resource=function(urlsService,http){var service;return service={},service.getApplicationToken=function(applicationId,state){var url;return url=urlsService.resolve("applications"),url=url+"/"+applicationId+"/token?state="+state,http.get(url).then(function(result){return Immutable.fromJS(result.data)})},service.authorizeApplicationToken=function(applicationId,state){var data,url;return url=urlsService.resolve("application-tokens"),url+="/authorize",data={state:state,application:applicationId},http.post(url,data).then(function(result){return Immutable.fromJS(result.data)})},function(){return{externalapps:service}}},Resource.$inject=["$tgUrls","$tgHttp"],module=angular.module("taigaResources2"),module.factory("tgExternalAppsResource",Resource)}.call(this),function(){var Resource,module;Resource=function(urlsService,http){var service;return service={},service.listInAllProjects=function(params){var httpOptions,url;return url=urlsService.resolve("issues"),httpOptions={headers:{"x-disable-pagination":"1"}},http.get(url,params,httpOptions).then(function(result){return Immutable.fromJS(result.data)})},function(){return{issues:service}}},Resource.$inject=["$tgUrls","$tgHttp"],module=angular.module("taigaResources2"),module.factory("tgIssuesResource",Resource)}.call(this),function(){var Resource,module,pagination;pagination=function(){},Resource=function(urlsService,http,paginateResponseService){var service;return service={},service.getProjects=function(params,pagination){var httpOptions,url;return null==params&&(params={}),null==pagination&&(pagination=!0),url=urlsService.resolve("projects"),httpOptions={},pagination||(httpOptions={headers:{"x-lazy-pagination":!0}}),http.get(url,params,httpOptions)},service.getProjectBySlug=function(projectSlug){var url;return url=urlsService.resolve("projects"),url=url+"/by_slug?slug="+projectSlug,http.get(url).then(function(result){return Immutable.fromJS(result.data)})},service.getProjectsByUserId=function(userId,paginate){var httpOptions,params,url;return null==paginate&&(paginate=!1),url=urlsService.resolve("projects"),httpOptions={},paginate||(httpOptions.headers={"x-disable-pagination":"1"}),params={member:userId,order_by:"memberships__user_order"},http.get(url,params,httpOptions).then(function(result){return Immutable.fromJS(result.data)})},service.getProjectStats=function(projectId){var url;return url=urlsService.resolve("projects"),url=url+"/"+projectId,http.get(url).then(function(result){return Immutable.fromJS(result.data)})},service.bulkUpdateOrder=function(bulkData){var url;return url=urlsService.resolve("bulk-update-projects-order"),http.post(url,bulkData)},service.getTimeline=function(projectId,page){var params,url;return params={page:page,only_relevant:!0},url=urlsService.resolve("timeline-project"),url=url+"/"+projectId,http.get(url,params,{headers:{"x-lazy-pagination":!0}}).then(function(result){return result=Immutable.fromJS(result),paginateResponseService(result)})},service.likeProject=function(projectId){var url;return url=urlsService.resolve("project-like",projectId),http.post(url)},service.unlikeProject=function(projectId){var url;return url=urlsService.resolve("project-unlike",projectId),http.post(url)},service.watchProject=function(projectId,notifyLevel){var data,url;return data={notify_level:notifyLevel},url=urlsService.resolve("project-watch",projectId),http.post(url,data)},service.unwatchProject=function(projectId){var url;return url=urlsService.resolve("project-unwatch",projectId),http.post(url)},function(){return{projects:service}}},Resource.$inject=["$tgUrls","$tgHttp","tgPaginateResponseService"],module=angular.module("taigaResources2"),module.factory("tgProjectsResources",Resource)}.call(this),function(){var Resources,services;services=["tgProjectsResources","tgUserResources","tgUsersResources","tgUserstoriesResource","tgTasksResource","tgIssuesResource","tgExternalAppsResource","tgAttachmentsResource","tgStatsResource"],Resources=function($injector){var i,j,len,len1,ref,service,serviceFn,serviceName,serviceProperty;for(i=0,len=services.length;len>i;i++)for(serviceName=services[i],serviceFn=$injector.get(serviceName),service=$injector.invoke(serviceFn),ref=Object.keys(service),j=0,len1=ref.length;len1>j;j++)serviceProperty=ref[j],this[serviceProperty]&&console.warm("repeated resource "+serviceProperty),this[serviceProperty]=service[serviceProperty];return this},Resources.$inject=["$injector"],angular.module("taigaResources2").service("tgResources",Resources)}.call(this),function(){var Resource,module;Resource=function(urlsService,http){var service;return service={},service.discover=function(applicationId,state){var url;return url=urlsService.resolve("stats-discover"),http.get(url).then(function(result){return Immutable.fromJS(result.data)})},function(){return{stats:service}}},Resource.$inject=["$tgUrls","$tgHttp"],module=angular.module("taigaResources2"),module.factory("tgStatsResource",Resource)}.call(this),function(){var Resource,module;Resource=function(urlsService,http){var service;return service={},service.listInAllProjects=function(params){var httpOptions,url;return url=urlsService.resolve("tasks"),httpOptions={headers:{"x-disable-pagination":"1"}},http.get(url,params,httpOptions).then(function(result){return Immutable.fromJS(result.data)})},function(){return{tasks:service}}},Resource.$inject=["$tgUrls","$tgHttp"],module=angular.module("taigaResources2"),module.factory("tgTasksResource",Resource)}.call(this),function(){var Resource,module;Resource=function(urlsService,http,paginateResponseService){var service;return service={},service.getUserStorage=function(key){var httpOptions,url;return url=urlsService.resolve("user-storage"),key&&(url+="/"+key),httpOptions={},http.get(url,{}).then(function(response){return response.data.value})},service.setUserStorage=function(key,value){var params,url;return url=urlsService.resolve("user-storage")+"/"+key,params={key:key,value:value},http.put(url,params)},service.createUserStorage=function(key,value){var params,url;return url=urlsService.resolve("user-storage"),params={key:key,value:value},http.post(url,params)},function(){return{user:service}}},Resource.$inject=["$tgUrls","$tgHttp"],module=angular.module("taigaResources2"),module.factory("tgUserResources",Resource)}.call(this),function(){var Resource,module;Resource=function(urlsService,http,paginateResponseService){var service;return service={},service.getUserByUsername=function(username){var httpOptions,params,url;return url=urlsService.resolve("by_username"),httpOptions={headers:{"x-disable-pagination":"1"}},params={username:username},http.get(url,params,httpOptions).then(function(result){return Immutable.fromJS(result.data)})},service.getStats=function(userId){var httpOptions,url;return url=urlsService.resolve("user-stats",userId),httpOptions={headers:{"x-disable-pagination":"1"}},http.get(url,{},httpOptions).then(function(result){return Immutable.fromJS(result.data)})},service.getContacts=function(userId){var httpOptions,url;return url=urlsService.resolve("user-contacts",userId),httpOptions={headers:{"x-disable-pagination":"1"}},http.get(url,{},httpOptions).then(function(result){return Immutable.fromJS(result.data)})},service.getLiked=function(userId,page,type,q){var params,url;return url=urlsService.resolve("user-liked",userId),params={},null!=page&&(params.page=page),null!=type&&(params.type=type),null!=q&&(params.q=q),params.only_relevant=!0,http.get(url,params,{headers:{"x-lazy-pagination":!0}}).then(function(result){return result=Immutable.fromJS(result),paginateResponseService(result)})},service.getVoted=function(userId,page,type,q){var params,url;return url=urlsService.resolve("user-voted",userId),params={},null!=page&&(params.page=page),null!=type&&(params.type=type),null!=q&&(params.q=q),http.get(url,params,{headers:{"x-lazy-pagination":!0}}).then(function(result){return result=Immutable.fromJS(result),paginateResponseService(result)})},service.getWatched=function(userId,page,type,q){var params,url;return url=urlsService.resolve("user-watched",userId),params={},null!=page&&(params.page=page),null!=type&&(params.type=type),null!=q&&(params.q=q),http.get(url,params,{headers:{"x-lazy-pagination":!0}}).then(function(result){return result=Immutable.fromJS(result),paginateResponseService(result)})},service.getProfileTimeline=function(userId,page){var params,url;return params={page:page},url=urlsService.resolve("timeline-profile"),url=url+"/"+userId,http.get(url,params,{headers:{"x-lazy-pagination":!0}}).then(function(result){return result=Immutable.fromJS(result),paginateResponseService(result)})},service.getUserTimeline=function(userId,page){var params,url;return params={page:page,only_relevant:!0},url=urlsService.resolve("timeline-user"),url=url+"/"+userId,http.get(url,params,{headers:{"x-lazy-pagination":!0}}).then(function(result){return result=Immutable.fromJS(result),paginateResponseService(result)})},function(){return{users:service}}},Resource.$inject=["$tgUrls","$tgHttp","tgPaginateResponseService"],module=angular.module("taigaResources2"),module.factory("tgUsersResources",Resource)}.call(this),function(){var Resource,module;Resource=function(urlsService,http){var service;return service={},service.listInAllProjects=function(params){var httpOptions,url;return url=urlsService.resolve("userstories"),httpOptions={headers:{"x-disable-pagination":"1"}},http.get(url,params,httpOptions).then(function(result){return Immutable.fromJS(result.data)})},function(){return{userstories:service}}},Resource.$inject=["$tgUrls","$tgHttp"],module=angular.module("taigaResources2"),module.factory("tgUserstoriesResource",Resource)}.call(this),function(){var AppMetaService,taiga,truncate;taiga=this.taiga,truncate=taiga.truncate,AppMetaService=function(){function AppMetaService(rootScope){this.rootScope=rootScope}return AppMetaService.$inject=["$rootScope"],AppMetaService.prototype._set=function(key,value){var meta;if(key)return"title"===key?(meta=$("title"),0===meta.length&&(meta=$(""),$("head").append(meta)),meta.text(value||"")):0===key.indexOf("og:")?(meta=$("meta[property='"+key+"']"),0===meta.length&&(meta=$(""),$("head").append(meta)),meta.attr("content",value||"")):(meta=$("meta[name='"+key+"']"),0===meta.length&&(meta=$(""),$("head").append(meta)),meta.attr("content",value||""))},AppMetaService.prototype.setTitle=function(title){return this._set("title",title)},AppMetaService.prototype.setDescription=function(description){return this._set("description",truncate(description,250))},AppMetaService.prototype.setTwitterMetas=function(title,description){return this._set("twitter:card","summary"),this._set("twitter:site","@taigaio"),this._set("twitter:title",title),this._set("twitter:description",truncate(description,300)),this._set("twitter:image",window.location.origin+"/"+window._version+"/images/logo-color.png")},AppMetaService.prototype.setOpenGraphMetas=function(title,description){return this._set("og:type","object"),this._set("og:site_name","Taiga - Love your projects"),this._set("og:title",title),this._set("og:description",truncate(description,300)),this._set("og:image",window.location.origin+"/"+window._version+"/images/logo-color.png"),this._set("og:url",window.location.href)},AppMetaService.prototype.setAll=function(title,description){return this.setTitle(title),this.setDescription(description),this.setTwitterMetas(title,description),this.setOpenGraphMetas(title,description)},AppMetaService.prototype.addMobileViewport=function(){return $("head").append('')},AppMetaService.prototype.removeMobileViewport=function(){return $('meta[name="viewport"]').remove()},AppMetaService.prototype.setfn=function(fn){return this.listener&&this._listener(),this._listener=this.rootScope.$watchCollection(fn,function(_this){return function(metas){return metas?(_this.setAll(metas.title,metas.description),_this._listener()):void 0}}(this))},AppMetaService}(),angular.module("taigaCommon").service("tgAppMetaService",AppMetaService)}.call(this),function(){var AttachmentsService,sizeFormat;sizeFormat=this.taiga.sizeFormat,AttachmentsService=function(){function AttachmentsService(confirm,config,translate,rs){this.confirm=confirm,this.config=config,this.translate=translate,this.rs=rs,this.maxFileSize=this.getMaxFileSize(),this.maxFileSize&&(this.maxFileSizeFormated=sizeFormat(this.maxFileSize))}return AttachmentsService.$inject=["$tgConfirm","$tgConfig","$translate","tgResources"],AttachmentsService.prototype.sizeError=function(file){var message;return message=this.translate.instant("ATTACHMENT.ERROR_MAX_SIZE_EXCEEDED",{fileName:file.name,fileSize:sizeFormat(file.size),maxFileSize:this.maxFileSizeFormated}),this.confirm.notify("error",message)},AttachmentsService.prototype.validate=function(file){return this.maxFileSize&&file.size>this.maxFileSize?(this.sizeError(file),!1):!0},AttachmentsService.prototype.getMaxFileSize=function(){return this.config.get("maxUploadFileSize",null)},AttachmentsService.prototype.list=function(type,objId,projectId){return this.rs.attachments.list(type,objId,projectId).then(function(_this){return function(attachments){return attachments.sortBy(function(attachment){return attachment.get("order")})}}(this))},AttachmentsService.prototype["delete"]=function(type,id){return this.rs.attachments["delete"](type,id)},AttachmentsService.prototype.saveError=function(file,data){var message;return message="",file&&(message=this.translate.instant("ATTACHMENT.ERROR_UPLOAD_ATTACHMENT",{fileName:file.name,errorMessage:data.data._error_message})),this.confirm.notify("error",message)},AttachmentsService.prototype.upload=function(file,objId,projectId,type){var promise;return promise=this.rs.attachments.create(type,projectId,objId,file),promise.then(null,this.saveError.bind(this,file)),promise},AttachmentsService.prototype.patch=function(id,type,patch){var promise;return promise=this.rs.attachments.patch(type,id,patch),promise.then(null,this.saveError.bind(this,null)),promise},AttachmentsService}(),angular.module("taigaCommon").service("tgAttachmentsService",AttachmentsService)}.call(this),function(){var ChekcPermissionsService,taiga;taiga=this.taiga,ChekcPermissionsService=function(){function ChekcPermissionsService(projectService){this.projectService=projectService}return ChekcPermissionsService.$inject=["tgProjectService"],ChekcPermissionsService.prototype.check=function(permission){return-1!==this.projectService.project.get("my_permissions").indexOf(permission)},ChekcPermissionsService}(),angular.module("taigaCommon").service("tgCheckPermissionsService",ChekcPermissionsService)}.call(this),function(){var CurrentUserService,groupBy,taiga;taiga=this.taiga,groupBy=this.taiga.groupBy,CurrentUserService=function(){function CurrentUserService(projectsService,storageService,rs){this.projectsService=projectsService,this.storageService=storageService,this.rs=rs,this._user=null,this._projects=Immutable.Map(),this._projectsById=Immutable.Map(),this._joyride=null,taiga.defineImmutableProperty(this,"projects",function(_this){return function(){return _this._projects}}(this)),taiga.defineImmutableProperty(this,"projectsById",function(_this){return function(){return _this._projectsById}}(this))}return CurrentUserService.$inject=["tgProjectsService","$tgStorage","tgResources"],CurrentUserService.prototype.isAuthenticated=function(){return null!==this.getUser()?!0:!1},CurrentUserService.prototype.getUser=function(){var userData;return this._user||(userData=this.storageService.get("userInfo"),userData&&(userData=Immutable.fromJS(userData),this.setUser(userData))),this._user},CurrentUserService.prototype.removeUser=function(){return this._user=null,this._projects=Immutable.Map(),this._projectsById=Immutable.Map(),this._joyride=null},CurrentUserService.prototype.setUser=function(user){return this._user=user,this._loadUserInfo()},CurrentUserService.prototype.bulkUpdateProjectsOrder=function(sortData){return this.projectsService.bulkUpdateProjectsOrder(sortData).then(function(_this){return function(){return _this.loadProjects()}}(this))},CurrentUserService.prototype.loadProjects=function(){return this.projectsService.getProjectsByUserId(this._user.get("id")).then(function(_this){return function(projects){return _this.setProjects(projects)}}(this))},CurrentUserService.prototype.disableJoyRide=function(section){return section?this._joyride[section]=!1:this._joyride={backlog:!1,kanban:!1,dashboard:!1},this.rs.user.setUserStorage("joyride",this._joyride)},CurrentUserService.prototype.loadJoyRideConfig=function(){return new Promise(function(_this){return function(resolve){return null!==_this._joyride?void resolve(_this._joyride):_this.rs.user.getUserStorage("joyride").then(function(config){return _this._joyride=config,resolve(_this._joyride)})["catch"](function(){return _this._joyride={backlog:!0,kanban:!0,dashboard:!0},_this.rs.user.createUserStorage("joyride",_this._joyride),resolve(_this._joyride)})}}(this))},CurrentUserService.prototype._loadUserInfo=function(){return Promise.all([this.loadProjects()])},CurrentUserService.prototype.setProjects=function(projects){return this._projects=this._projects.set("all",projects),this._projects=this._projects.set("recents",projects.slice(0,10)),this._projectsById=Immutable.fromJS(groupBy(projects.toJS(),function(p){return p.id})),this.projects},CurrentUserService}(),angular.module("taigaCommon").service("tgCurrentUserService",CurrentUserService)}.call(this),function(){var LightboxFactory;LightboxFactory=function(){function LightboxFactory(rootScope,compile){this.rootScope=rootScope,this.compile=compile}return LightboxFactory.$inject=["$rootScope","$compile"],LightboxFactory.prototype.create=function(name,attrs,scopeAttrs){var elm,html,scope;scope=this.rootScope.$new(),scope=_.merge(scope,scopeAttrs),elm=$("
").attr(name,!0).attr("tg-bind-scope",!0),attrs&&elm.attr(attrs),elm.addClass("remove-on-close"),html=this.compile(elm)(scope),$(document.body).append(html)},LightboxFactory}(),angular.module("taigaCommon").service("tgLightboxFactory",LightboxFactory)}.call(this),function(){var PaginateResponse;PaginateResponse=function(){return function(result){var paginateResponse;return paginateResponse=Immutable.Map({data:result.get("data"),next:!!result.get("headers")("x-pagination-next"),prev:!!result.get("headers")("x-pagination-prev"),current:result.get("headers")("x-pagination-current"),count:result.get("headers")("x-pagination-count")})}},angular.module("taigaCommon").factory("tgPaginateResponseService",PaginateResponse)}.call(this),function(){var ProjectService,taiga;taiga=this.taiga,ProjectService=function(){function ProjectService(projectsService,xhrError){this.projectsService=projectsService,this.xhrError=xhrError,this._project=null,this._section=null,this._sectionsBreadcrumb=Immutable.List(),this._activeMembers=Immutable.List(),taiga.defineImmutableProperty(this,"project",function(_this){return function(){return _this._project}}(this)),taiga.defineImmutableProperty(this,"section",function(_this){return function(){return _this._section}}(this)),taiga.defineImmutableProperty(this,"sectionsBreadcrumb",function(_this){return function(){return _this._sectionsBreadcrumb}}(this)),taiga.defineImmutableProperty(this,"activeMembers",function(_this){return function(){return _this._activeMembers}}(this))}return ProjectService.$inject=["tgProjectsService","tgXhrErrorService"],ProjectService.prototype.setSection=function(section){return this._section=section,section?this._sectionsBreadcrumb=this._sectionsBreadcrumb.push(this._section):this._sectionsBreadcrumb=Immutable.List()},ProjectService.prototype.setProjectBySlug=function(pslug){return new Promise(function(_this){return function(resolve,reject){return _this.project&&_this.project.get("slug")===pslug?resolve():_this.projectsService.getProjectBySlug(pslug).then(function(project){return _this.setProject(project),resolve()})["catch"](function(xhr){return _this.xhrError.response(xhr)})}}(this))},ProjectService.prototype.setProject=function(project){return this._project=project,this._activeMembers=this._project.get("members").filter(function(member){return member.get("is_active")})},ProjectService.prototype.cleanProject=function(){return this._project=null,this._activeMembers=Immutable.List(),this._section=null,this._sectionsBreadcrumb=Immutable.List()},ProjectService.prototype.hasPermission=function(permission){return-1!==this._project.get("my_permissions").indexOf(permission)},ProjectService.prototype.fetchProject=function(){var pslug;return pslug=this.project.get("slug"),this.projectsService.getProjectBySlug(pslug).then(function(_this){return function(project){return _this.setProject(project)}}(this))},ProjectService}(),angular.module("taigaCommon").service("tgProjectService",ProjectService)}.call(this),function(){var ScopeEvent;ScopeEvent=function(){function ScopeEvent(){}return ScopeEvent.prototype.scopes={},ScopeEvent.prototype._searchDuplicatedScopes=function(id){return _.find(Object.keys(this.scopes),function(_this){return function(key){return _this.scopes[key].$id===id}}(this))},ScopeEvent.prototype._create=function(name,scope){var duplicatedScopeName;if(duplicatedScopeName=this._searchDuplicatedScopes(scope.$id))throw new Error('scopeEvent: this scope is already register with the name "'+duplicatedScopeName+'"');if(this.scopes[name])throw new Error('scopeEvent: "'+name+'" already in use');return scope._tgEmitter=new EventEmitter2,scope.$on("$destroy",function(_this){return function(){return scope._tgEmitter.removeAllListeners(),delete _this.scopes[name]}}(this)),this.scopes[name]=scope},ScopeEvent.prototype.emitter=function(name,scope){if(scope)scope=this._create(name,scope);else{if(!this.scopes[name])throw new Error('scopeEvent: "'+name+"\" scope doesn't exist'");scope=this.scopes[name]}return scope._tgEmitter},ScopeEvent}(),angular.module("taigaCommon").service("tgScopeEvent",ScopeEvent)}.call(this),function(){var ThemeService,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,ThemeService=function(superClass){function ThemeService(){return ThemeService.__super__.constructor.apply(this,arguments)}return extend(ThemeService,superClass),ThemeService}(taiga.Service=function(){return{use:function(themeName){var stylesheetEl;return stylesheetEl=$("link[rel='stylesheet']:first"),0===stylesheetEl.length&&(stylesheetEl=$(""),$("head").append(stylesheetEl)),stylesheetEl.attr("href","/"+window._version+"/styles/theme-"+themeName+".css")}}}),angular.module("taigaCommon").service("tgThemeService",ThemeService)}.call(this),function(){var UserService,bindMethods,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,bindMethods=taiga.bindMethods,UserService=function(superClass){function UserService(rs){this.rs=rs,bindMethods(this)}return extend(UserService,superClass),UserService.$inject=["tgResources"],UserService.prototype.getUserByUserName=function(username){return this.rs.users.getUserByUsername(username)},UserService.prototype.getContacts=function(userId){return this.rs.users.getContacts(userId)},UserService.prototype.getLiked=function(userId,pageNumber,objectType,textQuery){return this.rs.users.getLiked(userId,pageNumber,objectType,textQuery)},UserService.prototype.getVoted=function(userId,pageNumber,objectType,textQuery){return this.rs.users.getVoted(userId,pageNumber,objectType,textQuery)},UserService.prototype.getWatched=function(userId,pageNumber,objectType,textQuery){return this.rs.users.getWatched(userId,pageNumber,objectType,textQuery)},UserService.prototype.getStats=function(userId){return this.rs.users.getStats(userId)},UserService.prototype.attachUserContactsToProjects=function(userId,projects){return this.getContacts(userId).then(function(contacts){return projects=projects.map(function(project){var contactsFiltered;return contactsFiltered=contacts.filter(function(contact){var contactId;return contactId=contact.get("id"),-1!==project.get("members").indexOf(contactId)}),project=project.set("contacts",contactsFiltered)})})},UserService}(taiga.Service),angular.module("taigaCommon").service("tgUserService",UserService)}.call(this),function(){var xhrError,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;xhrError=function(superClass){function xhrError(q,location,navUrls){this.q=q,this.location=location,this.navUrls=navUrls}return extend(xhrError,superClass),xhrError.$inject=["$q","$location","$tgNavUrls"],xhrError.prototype.notFound=function(){return this.location.path(this.navUrls.resolve("not-found")),this.location.replace()},xhrError.prototype.permissionDenied=function(){return this.location.path(this.navUrls.resolve("permission-denied")),this.location.replace()},xhrError.prototype.response=function(xhr){return xhr&&(404===xhr.status?this.notFound():403===xhr.status&&this.permissionDenied()),this.q.reject(xhr)},xhrError}(taiga.Service),angular.module("taigaCommon").service("tgXhrErrorService",xhrError)}.call(this),function(){var UserTimelineAttachmentDirective;UserTimelineAttachmentDirective=function(template,$compile){var isImage,link,validFileExtensions;return validFileExtensions=[".jpg",".jpeg",".bmp",".gif",".png"],isImage=function(url){return url=url.toLowerCase(),_.some(validFileExtensions,function(extension){return-1!==url.indexOf(extension,url-extension.length)})},link=function(scope,el){var is_image,templateHtml;return is_image=isImage(scope.attachment.get("url")),templateHtml=is_image?template.get("user-timeline/user-timeline-attachment/user-timeline-attachment-image.html"):template.get("user-timeline/user-timeline-attachment/user-timeline-attachment.html"),el.html(templateHtml),$compile(el.contents())(scope),el.find("img").error(function(){return this.remove()})},{link:link,scope:{attachment:"=tgUserTimelineAttachment"}}},UserTimelineAttachmentDirective.$inject=["$tgTemplate","$compile"],angular.module("taigaUserTimeline").directive("tgUserTimelineAttachment",UserTimelineAttachmentDirective)}.call(this),function(){var UserTimelineItemTitle,unslugify;unslugify=this.taiga.unslugify,UserTimelineItemTitle=function(){function UserTimelineItemTitle(translate,sce){this.translate=translate,this.sce=sce}return UserTimelineItemTitle.$inject=["$translate","$sce"],UserTimelineItemTitle.prototype._fieldTranslationKey={status:"COMMON.FIELDS.STATUS",subject:"COMMON.FIELDS.SUBJECT",description_diff:"COMMON.FIELDS.DESCRIPTION",points:"COMMON.FIELDS.POINTS",assigned_to:"COMMON.FIELDS.ASSIGNED_TO",severity:"ISSUES.FIELDS.SEVERITY",priority:"ISSUES.FIELDS.PRIORITY",type:"ISSUES.FIELDS.TYPE",is_iocaine:"TASK.FIELDS.IS_IOCAINE",is_blocked:"COMMON.FIELDS.IS_BLOCKED"},UserTimelineItemTitle.prototype._params={username:function(timeline,event){var title_attr,url,user;return user=timeline.getIn(["data","user"]),user.get("is_profile_visible")?(title_attr=this.translate.instant("COMMON.SEE_USER_PROFILE",{username:user.get("username")}),url="user-profile:username=timeline.getIn(['data', 'user', 'username'])",this._getLink(url,user.get("name"),title_attr)):this._getUsernameSpan(user.get("name"))},field_name:function(timeline,event){var field_name;return field_name=timeline.getIn(["data","value_diff","key"]),this.translate.instant(this._fieldTranslationKey[field_name])},project_name:function(timeline,event){var url;return url="project:project=timeline.getIn(['data', 'project', 'slug'])",this._getLink(url,timeline.getIn(["data","project","name"]))},new_value:function(timeline,event){var new_value,value;return _.isArray(timeline.getIn(["data","value_diff","value"]).toJS())?(value=timeline.getIn(["data","value_diff","value"]).get(1),null===value&&"assigned_to"===timeline.getIn(["data","value_diff","key"])&&(value=this.translate.instant("ACTIVITY.VALUES.UNASSIGNED")),new_value=value):new_value=timeline.getIn(["data","value_diff","value"]).first().get(1),_.escape(new_value)},sprint_name:function(timeline,event){var url;return url="project-taskboard:project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['data', 'milestone', 'slug'])",this._getLink(url,timeline.getIn(["data","milestone","name"]))},us_name:function(timeline,event){var event_us,obj,text,url;return obj=this._getTimelineObj(timeline,event).get("userstory"),event_us={obj:"parent_userstory"},url=this._getDetailObjUrl(event_us),text="#"+obj.get("ref")+" "+obj.get("subject"),this._getLink(url,text)},obj_name:function(timeline,event){var obj,text,url;return obj=this._getTimelineObj(timeline,event),url=this._getDetailObjUrl(event),text="wikipage"===event.obj?unslugify(obj.get("slug")):"milestone"===event.obj?obj.get("name"):"#"+obj.get("ref")+" "+obj.get("subject"),this._getLink(url,text)},role_name:function(timeline,event){ -return _.escape(timeline.getIn(["data","value_diff","value"]).keySeq().first())}},UserTimelineItemTitle.prototype._translateTitleParams=function(param,timeline,event){return this._params[param].call(this,timeline,event)},UserTimelineItemTitle.prototype._getTimelineObj=function(timeline,event){return timeline.getIn(["data",event.obj])},UserTimelineItemTitle.prototype._getDetailObjUrl=function(event){var url;return url={issue:["project-issues-detail",":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])"],wikipage:["project-wiki-page",":project=timeline.getIn(['data', 'project', 'slug']),slug=timeline.getIn(['obj', 'slug'])"],task:["project-tasks-detail",":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])"],userstory:["project-userstories-detail",":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])"],parent_userstory:["project-userstories-detail",":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'userstory', 'ref'])"],milestone:["project-taskboard",":project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['obj', 'slug'])"]},url[event.obj][0]+url[event.obj][1]},UserTimelineItemTitle.prototype._getLink=function(url,text,title){return title=title||text,$("").attr("tg-nav",url).text(text).attr("title",title).prop("outerHTML")},UserTimelineItemTitle.prototype._getUsernameSpan=function(text){var title;return title=title||text,$("").addClass("username").text(text).prop("outerHTML")},UserTimelineItemTitle.prototype._getParams=function(timeline,event,timeline_type){var params;return params={},timeline_type.translate_params.forEach(function(_this){return function(param){return params[param]=_this._translateTitleParams(param,timeline,event)}}(this)),params},UserTimelineItemTitle.prototype.getTitle=function(timeline,event,type){var params,paramsKeys,translation;return params=this._getParams(timeline,event,type),paramsKeys={},Object.keys(params).forEach(function(key){return paramsKeys[key]="{{"+key+"}}"}),translation=this.translate.instant(type.key,paramsKeys),Object.keys(params).forEach(function(key){var find;return find="{{"+key+"}}",translation=translation.replace(new RegExp(find,"g"),params[key])}),translation},UserTimelineItemTitle}(),angular.module("taigaUserTimeline").service("tgUserTimelineItemTitle",UserTimelineItemTitle)}.call(this),function(){var UserTimelineType,timelineType;timelineType=function(timeline,event){var types;return types=[{check:function(timeline,event){return"membership"===event.obj},key:"TIMELINE.NEW_MEMBER",translate_params:["project_name"],member:function(timeline){return Immutable.Map({user:timeline.getIn(["data","user"]),role:timeline.getIn(["data","role"])})}},{check:function(timeline,event){return"project"===event.obj&&"create"===event.type},key:"TIMELINE.NEW_PROJECT",translate_params:["username","project_name"],description:function(timeline){return timeline.getIn(["data","project","description"])}},{check:function(timeline,event){return"change"===event.type&&timeline.hasIn(["data","value_diff"])&&"attachments"===timeline.getIn(["data","value_diff","key"])},key:"TIMELINE.UPLOAD_ATTACHMENT",translate_params:["username","obj_name"]},{check:function(timeline,event){return"userstory"===event.obj&&"create"===event.type},key:"TIMELINE.US_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(timeline,event){return"issue"===event.obj&&"create"===event.type},key:"TIMELINE.ISSUE_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(timeline,event){return"wikipage"===event.obj&&"create"===event.type},key:"TIMELINE.WIKI_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(timeline,event){return"task"===event.obj&&"create"===event.type&&!timeline.getIn(["data","task","userstory"])},key:"TIMELINE.TASK_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(timeline,event){return"task"===event.obj&&"create"===event.type&&timeline.getIn(["data","task","userstory"])},key:"TIMELINE.TASK_CREATED_WITH_US",translate_params:["username","project_name","obj_name","us_name"]},{check:function(timeline,event){return"milestone"===event.obj&&"create"===event.type},key:"TIMELINE.MILESTONE_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(timeline,event){return timeline.getIn(["data","comment"])&&"userstory"===event.obj},key:"TIMELINE.NEW_COMMENT_US",translate_params:["username","obj_name"],description:function(timeline){var text;return text=timeline.getIn(["data","comment_html"]),$($.parseHTML(text)).text()}},{check:function(timeline,event){return timeline.getIn(["data","comment"])&&"issue"===event.obj},key:"TIMELINE.NEW_COMMENT_ISSUE",translate_params:["username","obj_name"],description:function(timeline){var text;return text=timeline.getIn(["data","comment_html"]),$($.parseHTML(text)).text()}},{check:function(timeline,event){return timeline.getIn(["data","comment"])&&"task"===event.obj},key:"TIMELINE.NEW_COMMENT_TASK",translate_params:["username","obj_name"],description:function(timeline){var text;return text=timeline.getIn(["data","comment_html"]),$($.parseHTML(text)).text()}},{check:function(timeline,event){return timeline.hasIn(["data","value_diff"])&&"moveInBacklog"===timeline.getIn(["data","value_diff","key"])&&timeline.hasIn(["data","value_diff","value","backlog_order"])&&"change"===event.type},key:"TIMELINE.US_MOVED",translate_params:["username","obj_name"]},{check:function(timeline,event){return timeline.hasIn(["data","value_diff"])&&"moveInBacklog"===timeline.getIn(["data","value_diff","key"])&&"change"===event.type&&"userstory"===event.obj?null===timeline.getIn(["data","value_diff","value","milestone"]).get(1):!1},key:"TIMELINE.US_REMOVED_FROM_MILESTONE",translate_params:["username","obj_name"]},{check:function(timeline,event){return timeline.hasIn(["data","value_diff"])&&"moveInBacklog"===timeline.getIn(["data","value_diff","key"])&&"change"===event.type&&"userstory"===event.obj},key:"TIMELINE.US_ADDED_MILESTONE",translate_params:["username","obj_name","sprint_name"]},{check:function(timeline,event){return timeline.hasIn(["data","value_diff"])&&"blocked"===timeline.getIn(["data","value_diff","key"])&&"change"===event.type?timeline.getIn(["data","value_diff","value","is_blocked"]).get(1)===!0:!1},key:"TIMELINE.BLOCKED",translate_params:["username","obj_name"],description:function(timeline){var text;return timeline.hasIn(["data","value_diff","value","blocked_note_html"])?(text=timeline.getIn(["data","value_diff","value","blocked_note_html"]).get(1),$($.parseHTML(text)).text()):!1}},{check:function(timeline,event){return timeline.hasIn(["data","value_diff"])&&"blocked"===timeline.getIn(["data","value_diff","key"])&&"change"===event.type?timeline.getIn(["data","value_diff","value","is_blocked"]).get(1)===!1:!1},key:"TIMELINE.UNBLOCKED",translate_params:["username","obj_name"]},{check:function(timeline,event){return"milestone"===event.obj&&"change"===event.type},key:"TIMELINE.MILESTONE_UPDATED",translate_params:["username","obj_name"]},{check:function(timeline,event){return"wikipage"===event.obj&&"change"===event.type},key:"TIMELINE.WIKI_UPDATED",translate_params:["username","obj_name"]},{check:function(timeline,event){return"userstory"===event.obj&&"change"===event.type&&timeline.hasIn(["data","value_diff"])&&"points"===timeline.getIn(["data","value_diff","key"])},key:"TIMELINE.US_UPDATED_POINTS",translate_params:["username","field_name","obj_name","new_value","role_name"]},{check:function(timeline,event){return"userstory"===event.obj&&"change"===event.type&&timeline.hasIn(["data","value_diff"])&&"description_diff"===timeline.getIn(["data","value_diff","key"])},key:"TIMELINE.US_UPDATED",translate_params:["username","field_name","obj_name"]},{check:function(timeline,event){return"userstory"===event.obj&&"change"===event.type},key:"TIMELINE.US_UPDATED_WITH_NEW_VALUE",translate_params:["username","field_name","obj_name","new_value"]},{check:function(timeline,event){return"issue"===event.obj&&"change"===event.type&&timeline.hasIn(["data","value_diff"])&&"description_diff"===timeline.getIn(["data","value_diff","key"])},key:"TIMELINE.ISSUE_UPDATED",translate_params:["username","field_name","obj_name"]},{check:function(timeline,event){return"issue"===event.obj&&"change"===event.type},key:"TIMELINE.ISSUE_UPDATED_WITH_NEW_VALUE",translate_params:["username","field_name","obj_name","new_value"]},{check:function(timeline,event){return"task"===event.obj&&"change"===event.type&&!timeline.getIn(["data","task","userstory"])&&timeline.hasIn(["data","value_diff"])&&"description_diff"===timeline.getIn(["data","value_diff","key"])},key:"TIMELINE.TASK_UPDATED",translate_params:["username","field_name","obj_name"]},{check:function(timeline,event){return"task"===event.obj&&"change"===event.type&&timeline.getIn(["data","task","userstory"])&&timeline.hasIn(["data","value_diff"])&&"description_diff"===timeline.getIn(["data","value_diff","key"])},key:"TIMELINE.TASK_UPDATED_WITH_US",translate_params:["username","field_name","obj_name","us_name"]},{check:function(timeline,event){return"task"===event.obj&&"change"===event.type&&!timeline.getIn(["data","task","userstory"])},key:"TIMELINE.TASK_UPDATED_WITH_NEW_VALUE",translate_params:["username","field_name","obj_name","new_value"]},{check:function(timeline,event){return"task"===event.obj&&"change"===event.type&&timeline.getIn(["data","task","userstory"])},key:"TIMELINE.TASK_UPDATED_WITH_US_NEW_VALUE",translate_params:["username","field_name","obj_name","us_name","new_value"]},{check:function(timeline,event){return"user"===event.obj&&"create"===event.type},key:"TIMELINE.NEW_USER",translate_params:["username"]}],_.find(types,function(obj){return obj.check(timeline,event)})},UserTimelineType=function(){function UserTimelineType(){}return UserTimelineType.prototype.getType=function(timeline,event){return timelineType(timeline,event)},UserTimelineType}(),angular.module("taigaUserTimeline").service("tgUserTimelineItemType",UserTimelineType)}.call(this),function(){var UserTimelineItemDirective;UserTimelineItemDirective=function(){return{templateUrl:"user-timeline/user-timeline-item/user-timeline-item.html",scope:{timeline:"=tgUserTimelineItem"}}},angular.module("taigaUserTimeline").directive("tgUserTimelineItem",UserTimelineItemDirective)}.call(this),function(){var UserTimelinePaginationSequence;UserTimelinePaginationSequence=function(){var obj;return obj={},obj.generate=function(config){var getContent,items,next,page;return page=1,items=Immutable.List(),config.minItems=config.minItems||20,next=function(){return items=Immutable.List(),getContent()},getContent=function(){return config.fetch(page).then(function(response){var data;return page++,data=response.get("data"),config.filter&&(data=config.filter(data)),config.map&&(data=data.map(config.map)),items=items.concat(data),items.sizej;j++)val=ref1[j],searchdata[name][val]=!0;isSelected=function(type,id){return null!=searchdata[type]&&searchdata[type][id]?!0:!1},results=[];for(key in filters)value=filters[key],results.push(function(){var k,len1,results1;for(results1=[],k=0,len1=value.length;len1>k;k++)obj=value[k],results1.push(obj.selected=isSelected(obj.type,obj.id)?!0:void 0);return results1}());return results},IssuesController.prototype.loadFilters=function(){var loadFilters,promise,urlfilters;return urlfilters=this.getUrlFilters(),urlfilters.q&&(this.scope.filtersQ=urlfilters.q),promise=this.loadMyFilters().then(function(_this){return function(myFilters){return _this.scope.filters.myFilters=myFilters,myFilters}}(this)),loadFilters={},loadFilters.project=this.scope.projectId,loadFilters.tags=urlfilters.tags,loadFilters.status=urlfilters.status,loadFilters.q=urlfilters.q,loadFilters.types=urlfilters.types,loadFilters.severities=urlfilters.severities,loadFilters.priorities=urlfilters.priorities,loadFilters.assigned_to=urlfilters.assignedTo,loadFilters.owner=urlfilters.createdBy,promise=promise.then(function(_this){return function(){return _this.rs.issues.filtersData(loadFilters)}}(this)),promise.then(function(_this){return function(data){var choicesFiltersFormat,tagsFilterFormat,usersFiltersFormat;return usersFiltersFormat=function(users,type,unknownOption){var reformatedUsers,unknownItem;return reformatedUsers=_.map(users,function(t){return t.type=type,t.name=t.full_name?t.full_name:unknownOption,t}),unknownItem=_.remove(reformatedUsers,function(u){return!u.id}),reformatedUsers=_.sortBy(reformatedUsers,function(u){return u.name.toUpperCase()}),unknownItem.length>0&&reformatedUsers.unshift(unknownItem[0]),reformatedUsers},choicesFiltersFormat=function(choices,type,byIdObject){return _.map(choices,function(t){return t.type=type,t})},tagsFilterFormat=function(tags){return _.map(tags,function(t){return t.id=t.name,t.type="tags",t})},_this.scope.filters.status=choicesFiltersFormat(data.statuses,"status",_this.scope.issueStatusById),_this.scope.filters.severities=choicesFiltersFormat(data.severities,"severities",_this.scope.severityById),_this.scope.filters.priorities=choicesFiltersFormat(data.priorities,"priorities",_this.scope.priorityById),_this.scope.filters.assignedTo=usersFiltersFormat(data.assigned_to,"assignedTo","Unassigned"),_this.scope.filters.createdBy=usersFiltersFormat(data.owners,"createdBy","Unknown"),_this.scope.filters.types=choicesFiltersFormat(data.types,"types",_this.scope.issueTypeById),_this.scope.filters.tags=tagsFilterFormat(data.tags),_this.removeNotExistingFiltersFromUrl(),_this.markSelectedFilters(_this.scope.filters,urlfilters),_this.rootscope.$broadcast("filters:loaded",_this.scope.filters)}}(this))},IssuesController.prototype.loadIssuesRequests=0,IssuesController.prototype.loadIssues=function(){var name,promise,ref,values;this.scope.urlFilters=this.getUrlFilters(),this.scope.httpParams={},ref=this.scope.urlFilters;for(name in ref)values=ref[name],"severities"===name?name="severity":"orderBy"===name?name="order_by":"priorities"===name?name="priority":"assignedTo"===name?name="assigned_to":"createdBy"===name?name="owner":"status"===name?name="status":"types"===name&&(name="type"),this.scope.httpParams[name]=values;return promise=this.rs.issues.list(this.scope.projectId,this.scope.httpParams),this.loadIssuesRequests+=1,promise.index=this.loadIssuesRequests,promise.then(function(_this){return function(data){return promise.index===_this.loadIssuesRequests&&(_this.scope.issues=data.models,_this.scope.page=data.current,_this.scope.count=data.count,_this.scope.paginatedBy=data.paginatedBy),data}}(this)),promise},IssuesController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(project){return _this.fillUsersAndRoles(project.members,project.roles),_this.initializeSubscription(),_this.loadFilters(),_this.loadIssues()}}(this))},IssuesController.prototype.saveCurrentFiltersTo=function(newFilter){var deferred;return deferred=this.q.defer(),this.rs.issues.getMyFilters(this.scope.projectId).then(function(_this){return function(filters){return filters[newFilter]=_this.location.search(),_this.rs.issues.storeMyFilters(_this.scope.projectId,filters).then(function(){return deferred.resolve()})}}(this)),deferred.promise},IssuesController.prototype.deleteMyFilter=function(filter){var deferred;return deferred=this.q.defer(),this.rs.issues.getMyFilters(this.scope.projectId).then(function(_this){return function(filters){return delete filters[filter],_this.rs.issues.storeMyFilters(_this.scope.projectId,filters).then(function(){return deferred.resolve()})}}(this)),deferred.promise},IssuesController.prototype.addNewIssue=function(){return this.rootscope.$broadcast("issueform:new",this.scope.project)},IssuesController.prototype.addIssuesInBulk=function(){return this.rootscope.$broadcast("issueform:bulk",this.scope.projectId)},IssuesController}(mixOf(taiga.Controller,taiga.PageMixin,taiga.FiltersMixin)),module.controller("IssuesController",IssuesController),IssuesDirective=function($log,$location,$template,$compile){var link,linkOrdering,linkPagination,template;return template=$template.get("issue/issue-paginator.html",!0),linkPagination=function($scope,$el,$attrs,$ctrl){var $pagEl,afterCurrent,atBegin,atEnd,beforeCurrent,getNumPages,renderPagination;return afterCurrent=2,beforeCurrent=4,atBegin=2,atEnd=2,$pagEl=$el.find(".issues-paginator"),getNumPages=function(){var numPages;return numPages=$scope.count/$scope.paginatedBy,numPages=parseInt(numPages,10)=numPages)return void $pagEl.hide();for($pagEl.show(),pages=[],options={},options.pages=pages,options.showPrevious=$scope.page>1,options.showNext=!($scope.page===numPages),cpage=$scope.page,i=j=1,ref=numPages;ref>=1?ref>=j:j>=ref;i=ref>=1?++j:--j)i===cpage+afterCurrent&&numPages>cpage+afterCurrent+atEnd?pages.push({classes:"dots",type:"dots"}):i===cpage-beforeCurrent&&cpage>atBegin+beforeCurrent?pages.push({classes:"dots",type:"dots"}):i>cpage+afterCurrent&&numPages-atEnd>=i||cpage-beforeCurrent>i&&i>atBegin||(i===cpage?pages.push({classes:"active",num:i,type:"page-active"}):pages.push({classes:"page",num:i,type:"page"}));return html=template(options),html=$compile(html)($scope),$pagEl.html(html)},$scope.$watch("issues",function(value){return value?renderPagination():void 0}),$el.on("click",".issues-paginator a.next",function(event){return event.preventDefault(),$scope.$apply(function(){return $ctrl.selectFilter("page",$scope.page+1),$ctrl.loadIssues()})}),$el.on("click",".issues-paginator a.previous",function(event){return event.preventDefault(),$scope.$apply(function(){return $ctrl.selectFilter("page",$scope.page-1),$ctrl.loadIssues()})}),$el.on("click",".issues-paginator li.page > a",function(event){var pagenum,target;return event.preventDefault(),target=angular.element(event.currentTarget),pagenum=target.data("pagenum"),$scope.$apply(function(){return $ctrl.selectFilter("page",pagenum),$ctrl.loadIssues()})})},linkOrdering=function($scope,$el,$attrs,$ctrl){var colHeadElement,currentOrder,icon;return currentOrder=$ctrl.getUrlFilter("orderBy")||"created_date",currentOrder&&(icon=startswith(currentOrder,"-")?"icon-arrow-up":"icon-arrow-bottom",colHeadElement=$el.find(".row.title > div[data-fieldname='"+trim(currentOrder,"-")+"']"),colHeadElement.html(colHeadElement.html()+"")),$el.on("click",".row.title > div",function(event){var finalOrder,newOrder,target;return target=angular.element(event.currentTarget),currentOrder=$ctrl.getUrlFilter("orderBy"),newOrder=target.data("fieldname"),finalOrder=currentOrder===newOrder?"-"+newOrder:newOrder,$scope.$apply(function(){return $ctrl.replaceFilter("orderBy",finalOrder),$ctrl.storeFilters(),$ctrl.loadIssues().then(function(){return $el.find(".row.title > div > span.icon").remove(),icon=startswith(finalOrder,"-")?"icon-arrow-up":"icon-arrow-bottom",target.html(target.html()+"")})})})},link=function($scope,$el,$attrs){var $ctrl;return $ctrl=$el.controller(),linkOrdering($scope,$el,$attrs,$ctrl),linkPagination($scope,$el,$attrs,$ctrl),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgIssues",["$log","$tgLocation","$tgTemplate","$compile",IssuesDirective]),IssuesFiltersDirective=function($q,$log,$location,$rs,$confirm,$loading,$template,$translate,$compile,$auth){var link,template,templateSelected;return template=$template.get("issue/issues-filters.html",!0),templateSelected=$template.get("issue/issues-filters-selected.html",!0),link=function($scope,$el,$attrs){var $ctrl,getFiltersType,initializeSelectedFilters,reloadIssues,renderFilters,renderSelectedFilters,selectQFilter,selectedFilters,showCategories,showFilters,toggleFilterSelection,unwatchIssues;return $ctrl=$el.closest(".wrapper").controller(),selectedFilters=[],showFilters=function(title,type){return $el.find(".filters-cats").hide(),$el.find(".filter-list").removeClass("hidden"),$el.find("h2.breadcrumb").removeClass("hidden"),$el.find("h2 a.subfilter span.title").html(title),$el.find("h2 a.subfilter span.title").prop("data-type",type)},showCategories=function(){return $el.find(".filters-cats").show(),$el.find(".filter-list").addClass("hidden"),$el.find("h2.breadcrumb").addClass("hidden")},initializeSelectedFilters=function(filters){var j,len,name,val,values;selectedFilters=[];for(name in filters)for(values=filters[name],j=0,len=values.length;len>j;j++)val=values[j],val.selected&&selectedFilters.push(val);return renderSelectedFilters(selectedFilters)},renderSelectedFilters=function(selectedFilters){var html;return _.filter(selectedFilters,function(_this){return function(f){return f.color?f.style="border-left: 3px solid "+f.color:void 0}}(this)),html=templateSelected({filters:selectedFilters}),html=$compile(html)($scope),$el.find(".filters-applied").html(html),$auth.isAuthenticated()&&selectedFilters.length>0?$el.find(".save-filters").show():$el.find(".save-filters").hide()},renderFilters=function(filters){var html;return _.filter(filters,function(_this){return function(f){return f.color?f.style="border-left: 3px solid "+f.color:void 0}}(this)),html=template({filters:filters}),html=$compile(html)($scope),$el.find(".filter-list").html(html)},getFiltersType=function(){return $el.find("h2 a.subfilter span.title").prop("data-type")},reloadIssues=function(){var currentFiltersType;return currentFiltersType=getFiltersType(),$q.all([$ctrl.loadIssues(),$ctrl.loadFilters()]).then(function(){var filters;return filters=$scope.filters[currentFiltersType],renderFilters(_.reject(filters,"selected"))})},toggleFilterSelection=function(type,id){var currentFiltersType,filter,filterId,filters;return"myFilters"===type?($rs.issues.getMyFilters($scope.projectId).then(function(data){var filters,myFilters;return myFilters=data,filters=myFilters[id],filters.page=1,$ctrl.replaceAllFilters(filters),$ctrl.storeFilters(),$ctrl.loadIssues(),$ctrl.markSelectedFilters($scope.filters,filters),initializeSelectedFilters($scope.filters)}),null):(filters=$scope.filters[type],filterId="tags"===type?taiga.toString(id):id,filter=_.find(filters,{id:filterId}),filter.selected=!filter.selected,null===id&&(id="null"),filter.selected?(selectedFilters.push(filter),$ctrl.selectFilter(type,id),$ctrl.selectFilter("page",1),$ctrl.storeFilters()):(selectedFilters=_.reject(selectedFilters,function(f){return f.id===filter.id&&f.type===filter.type}),$ctrl.unselectFilter(type,id),$ctrl.selectFilter("page",1),$ctrl.storeFilters()),reloadIssues(),renderSelectedFilters(selectedFilters),currentFiltersType=getFiltersType(),type===currentFiltersType?renderFilters(_.reject(filters,"selected")):void 0)},$scope.$on("filters:loaded",function(ctx,filters){return initializeSelectedFilters(filters)}),$scope.$on("filters:issueupdate",function(ctx,filters){var html;return html=template({filters:filters.status}),html=$compile(html)($scope),$el.find(".filter-list").html(html)}),selectQFilter=debounceLeading(100,function(value,oldValue){return void 0!==value&&value!==oldValue?($ctrl.replaceFilter("page",null,!0),0===value.length?($ctrl.replaceFilter("q",null),$ctrl.storeFilters()):($ctrl.replaceFilter("q",value),$ctrl.storeFilters()),reloadIssues()):void 0}),unwatchIssues=$scope.$watch("issues",function(newValue){return _.isUndefined(newValue)?void 0:($scope.$watch("filtersQ",selectQFilter),unwatchIssues())}),$el.on("click",".filters-cats > ul > li > a",function(event){var tags,target;return event.preventDefault(),target=angular.element(event.currentTarget),tags=$scope.filters[target.data("type")],renderFilters(_.reject(tags,"selected")),showFilters(target.attr("title"),target.data("type"))}),$el.on("click",".filters-inner > .filters-step-cat > .breadcrumb > .back",function(event){return event.preventDefault(),showCategories($el)}),$el.on("click",".filters-applied a",function(event){var id,target,type;return event.preventDefault(),target=angular.element(event.currentTarget),id=target.data("id")||null,type=target.data("type"),toggleFilterSelection(type,id)}),$el.on("click",".filter-list .single-filter",function(event){var id,target,type;return event.preventDefault(),target=angular.element(event.currentTarget),target.toggleClass("active"),id=target.data("id")||null,type=target.data("type"),"myFilters"===type&&target.removeClass("active"),toggleFilterSelection(type,id)}),$el.on("click",".filter-list .single-filter .icon-delete",function(event){var customFilterName,message,target,title;return event.preventDefault(),event.stopPropagation(),target=angular.element(event.currentTarget),customFilterName=target.parent().data("id"),title=$translate.instant("ISSUES.FILTERS.CONFIRM_DELETE.TITLE"),message=$translate.instant("ISSUES.FILTERS.CONFIRM_DELETE.MESSAGE",{customFilterName:customFilterName}),$confirm.askOnDelete(title,message).then(function(askResponse){var promise;return promise=$ctrl.deleteMyFilter(customFilterName),promise.then(function(){return promise=$ctrl.loadMyFilters(),promise.then(function(filters){return askResponse.finish(),$scope.filters.myFilters=filters,renderFilters($scope.filters.myFilters)}),promise.then(null,function(){return askResponse.finish()})}),promise.then(null,function(){return askResponse.finish(!1),$confirm.notify("error")})})}),$el.on("click",".save-filters",function(event){return event.preventDefault(),renderFilters($scope.filters.myFilters),showFilters("My filters","myFilters"),$el.find(".save-filters").hide(),$el.find(".my-filter-name").removeClass("hidden"),$el.find(".my-filter-name").focus(),$scope.$apply()}),$el.on("keyup",".my-filter-name",function(event){var currentLoading,newFilter,promise,target;return event.preventDefault(),13===event.keyCode?(target=angular.element(event.currentTarget),newFilter=target.val(),currentLoading=$loading().target($el.find(".new")).start(),promise=$ctrl.saveCurrentFiltersTo(newFilter),promise.then(function(){var loadPromise;return loadPromise=$ctrl.loadMyFilters(),loadPromise.then(function(filters){var currentfilterstype;return currentLoading.finish(),$scope.filters.myFilters=filters,currentfilterstype=$el.find("h2 a.subfilter span.title").prop("data-type"),"myFilters"===currentfilterstype&&renderFilters($scope.filters.myFilters),$el.find(".my-filter-name").addClass("hidden"),$el.find(".save-filters").show()}),loadPromise.then(null,function(){return currentLoading.finish(),$confirm.notify("error","Error loading custom filters")})}),promise.then(null,function(){return currentLoading.finish(),$el.find(".my-filter-name").val(newFilter).focus().select(),$confirm.notify("error","Filter not saved")})):27===event.keyCode?($el.find(".my-filter-name").val(""),$el.find(".my-filter-name").addClass("hidden"),$el.find(".save-filters").show()):void 0})},{link:link}},module.directive("tgIssuesFilters",["$q","$log","$tgLocation","$tgResources","$tgConfirm","$tgLoading","$tgTemplate","$translate","$compile","$tgAuth",IssuesFiltersDirective]),IssueStatusInlineEditionDirective=function($repo,$template,$rootscope){var link,selectionTemplate,updateIssueStatus;return selectionTemplate=$template.get("issue/issue-status-inline-edition-selection.html",!0),updateIssueStatus=function($el,issue,issueStatusById){var issueStatusDom,issueStatusDomParent,status;return issueStatusDomParent=$el.find(".issue-status"),issueStatusDom=$el.find(".issue-status .issue-status-bind"),status=issueStatusById[issue.status],status?(issueStatusDom.text(status.name),issueStatusDom.prop("title",status.name),issueStatusDomParent.css("color",status.color)):void 0},link=function($scope,$el,$attrs){var $ctrl,issue;return $ctrl=$el.controller(),issue=$scope.$eval($attrs.tgIssueStatusInlineEdition),$el.on("click",".issue-status",function(event){return event.preventDefault(),event.stopPropagation(),$el.find(".pop-status").popover().open()}),$el.on("click",".status",function(event){var filter,j,len,ref,target;for(event.preventDefault(),event.stopPropagation(),target=angular.element(event.currentTarget),ref=$scope.filters.status,j=0,len=ref.length;len>j;j++)filter=ref[j],filter.id===issue.status&&filter.count--;return issue.status=target.data("status-id"),$el.find(".pop-status").popover().close(),updateIssueStatus($el,issue,$scope.issueStatusById),$scope.$apply(function(){var k,len1,ref1;for($repo.save(issue).then(function(){return $ctrl.loadIssues()}),ref1=$scope.filters.status,k=0,len1=ref1.length;len1>k;k++)filter=ref1[k],filter.id===issue.status&&filter.count++;return $rootscope.$broadcast("filters:issueupdate",$scope.filters)})}),taiga.bindOnce($scope,"project",function(project){return $el.append(selectionTemplate({statuses:project.issue_statuses})),updateIssueStatus($el,issue,$scope.issueStatusById),-1===project.my_permissions.indexOf("modify_issue")?($el.unbind("click"),$el.find("a").addClass("not-clickable")):void 0}),$scope.$watch($attrs.tgIssueStatusInlineEdition,function(_this){return function(val){return updateIssueStatus($el,val,$scope.issueStatusById)}}(this)),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgIssueStatusInlineEdition",["$tgRepo","$tgTemplate","$rootScope",IssueStatusInlineEditionDirective]),IssueAssignedToInlineEditionDirective=function($repo,$rootscope,$translate){var link,template;return template=_.template('<%- name %>\n
<%- name %>
'),link=function($scope,$el,$attrs){var $ctrl,issue,updateIssue;return updateIssue=function(issue){var ctx,member;return ctx={name:$translate.instant("COMMON.ASSIGNED_TO.NOT_ASSIGNED"),imgurl:"/"+window._version+"/images/unnamed.png"},member=$scope.usersById[issue.assigned_to],member&&(ctx.name=member.full_name_display,ctx.imgurl=member.photo),$el.find(".avatar").html(template(ctx)),$el.find(".issue-assignedto").attr("title",ctx.name)},$ctrl=$el.controller(),issue=$scope.$eval($attrs.tgIssueAssignedToInlineEdition),updateIssue(issue),$el.on("click",".issue-assignedto",function(event){return $rootscope.$broadcast("assigned-to:add",issue)}),taiga.bindOnce($scope,"project",function(project){return-1===project.my_permissions.indexOf("modify_issue")?($el.unbind("click"),$el.find("a").addClass("not-clickable")):void 0}),$scope.$on("assigned-to:added",function(_this){return function(ctx,userId,updatedIssue){return updatedIssue.id===issue.id?(updatedIssue.assigned_to=userId,$repo.save(updatedIssue),updateIssue(updatedIssue)):void 0}}(this)),$scope.$watch($attrs.tgIssueAssignedToInlineEdition,function(_this){return function(val){return updateIssue(val)}}(this)),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgIssueAssignedToInlineEdition",["$tgRepo","$rootScope","$translate",IssueAssignedToInlineEditionDirective])}.call(this),function(){var UsClientRequirementButtonDirective,UsStatusButtonDirective,UsStatusDisplayDirective,UsTeamRequirementButtonDirective,UserStoryDetailController,bindMethods,bindOnce,groupBy,mixOf,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,groupBy=this.taiga.groupBy,bindOnce=this.taiga.bindOnce,bindMethods=this.taiga.bindMethods,module=angular.module("taigaUserStories"),UserStoryDetailController=function(superClass){function UserStoryDetailController(scope,rootscope,repo,confirm,rs,params,q,location,log,appMetaService,navUrls,analytics,translate){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.log=log,this.appMetaService=appMetaService,this.navUrls=navUrls,this.analytics=analytics,this.translate=translate,bindMethods(this),this.scope.usRef=this.params.usref,this.scope.sectionName=this.translate.instant("US.SECTION_NAME"),this.initializeEventHandlers(),promise=this.loadInitialData(),promise.then(function(_this){return function(){return _this._setMeta(),_this.initializeOnDeleteGoToUrl()}}(this)),promise.then(null,this.onInitialDataError.bind(this))}return extend(UserStoryDetailController,superClass),UserStoryDetailController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$log","tgAppMetaService","$tgNavUrls","$tgAnalytics","$translate"],UserStoryDetailController.prototype._setMeta=function(){var closedTasks,description,progressPercentage,ref,title,totalTasks;return totalTasks=this.scope.tasks.length,closedTasks=_.filter(this.scope.tasks,function(_this){return function(t){return _this.scope.taskStatusById[t.status].is_closed}}(this)).length,progressPercentage=totalTasks>0?Math.round(100*closedTasks/totalTasks):0,title=this.translate.instant("US.PAGE_TITLE",{userStoryRef:"#"+this.scope.us.ref,userStorySubject:this.scope.us.subject,projectName:this.scope.project.name}),description=this.translate.instant("US.PAGE_DESCRIPTION",{userStoryStatus:(null!=(ref=this.scope.statusById[this.scope.us.status])?ref.name:void 0)||"--",userStoryPoints:this.scope.us.total_points,userStoryDescription:angular.element(this.scope.us.description_html||"").text(),userStoryClosedTasks:closedTasks,userStoryTotalTasks:totalTasks,userStoryProgressPercentage:progressPercentage}),this.appMetaService.setAll(title,description)},UserStoryDetailController.prototype.initializeEventHandlers=function(){return this.scope.$on("related-tasks:update",function(_this){return function(){var allClosed;return _this.scope.tasks=_.clone(_this.scope.tasks,!1),allClosed=_.every(_this.scope.tasks,function(task){return task.is_closed}),_this.scope.us.is_closed!==allClosed?_this.loadUs():void 0}}(this)),this.scope.$on("attachment:create",function(_this){return function(){return _this.analytics.trackEvent("attachment","create","create attachment on userstory",1)}}(this)),this.scope.$on("comment:new",function(_this){return function(){return _this.loadUs()}}(this))},UserStoryDetailController.prototype.initializeOnDeleteGoToUrl=function(){var ctx;return ctx={project:this.scope.project.slug},this.scope.onDeleteGoToUrl=this.navUrls.resolve("project",ctx),this.scope.project.is_backlog_activated?this.scope.us.milestone?(ctx.sprint=this.scope.sprint.slug,this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-taskboard",ctx)):this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-backlog",ctx):this.scope.project.is_kanban_activated?this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-kanban",ctx):void 0},UserStoryDetailController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return _this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),_this.scope.statusList=project.us_statuses,_this.scope.statusById=groupBy(project.us_statuses,function(x){return x.id}),_this.scope.taskStatusById=groupBy(project.task_statuses,function(x){return x.id}),_this.scope.pointsList=_.sortBy(project.points,"order"),_this.scope.pointsById=groupBy(_this.scope.pointsList,function(e){return e.id}),project}}(this))},UserStoryDetailController.prototype.loadUs=function(){var httpParams,kanbanStaus,milestone,noMilestone;return httpParams=_.pick(this.location.search(),"milestone","no-milestone","kanban-status"),milestone=httpParams.milestone,milestone&&this.rs.userstories.storeQueryParams(this.scope.projectId,{milestone:milestone,order_by:"sprint_order"}),noMilestone=httpParams["no-milestone"],noMilestone&&this.rs.userstories.storeQueryParams(this.scope.projectId,{milestone:"null",order_by:"backlog_order"}),kanbanStaus=httpParams["kanban-status"],kanbanStaus&&this.rs.userstories.storeQueryParams(this.scope.projectId,{status:kanbanStaus,order_by:"kanban_order"}),this.rs.userstories.getByRef(this.scope.projectId,this.params.usref).then(function(_this){return function(us){var ctx,ref,ref1;return _this.scope.us=us,_this.scope.usId=us.id,_this.scope.commentModel=us,null!=(null!=(ref=_this.scope.us.neighbors.previous)?ref.ref:void 0)&&(ctx={project:_this.scope.project.slug,ref:_this.scope.us.neighbors.previous.ref},_this.scope.previousUrl=_this.navUrls.resolve("project-userstories-detail",ctx)),null!=(null!=(ref1=_this.scope.us.neighbors.next)?ref1.ref:void 0)&&(ctx={project:_this.scope.project.slug,ref:_this.scope.us.neighbors.next.ref},_this.scope.nextUrl=_this.navUrls.resolve("project-userstories-detail",ctx)),us}}(this))},UserStoryDetailController.prototype.loadSprint=function(){return this.scope.us.milestone?this.rs.sprints.get(this.scope.us.project,this.scope.us.milestone).then(function(_this){return function(sprint){return _this.scope.sprint=sprint,sprint}}(this)):void 0},UserStoryDetailController.prototype.loadTasks=function(){return this.rs.tasks.list(this.scope.projectId,null,this.scope.usId).then(function(_this){return function(tasks){return _this.scope.tasks=tasks,tasks}}(this))},UserStoryDetailController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(project){return _this.fillUsersAndRoles(project.members,project.roles),_this.loadUs().then(function(){return _this.q.all([_this.loadSprint(),_this.loadTasks()])})}}(this))},UserStoryDetailController.prototype.onUpvote=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.loadUs(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error")}}(this),this.rs.userstories.upvote(this.scope.usId).then(onSuccess,onError)},UserStoryDetailController.prototype.onDownvote=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){ +return _this.loadUs(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error")}}(this),this.rs.userstories.downvote(this.scope.usId).then(onSuccess,onError)},UserStoryDetailController.prototype.onWatch=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.loadUs(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error")}}(this),this.rs.userstories.watch(this.scope.usId).then(onSuccess,onError)},UserStoryDetailController.prototype.onUnwatch=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.loadUs(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error")}}(this),this.rs.userstories.unwatch(this.scope.usId).then(onSuccess,onError)},UserStoryDetailController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("UserStoryDetailController",UserStoryDetailController),UsStatusDisplayDirective=function($template,$compile){var link,template;return template=$template.get("common/components/status-display.html",!0),link=function($scope,$el,$attrs){var render;return render=function(us){var html,status;return status=$scope.statusById[us.status],html=template({is_closed:us.is_closed,status:status}),html=$compile(html)($scope),$el.html(html)},$scope.$watch($attrs.ngModel,function(us){return null!=us?render(us):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgUsStatusDisplay",["$tgTemplate","$compile",UsStatusDisplayDirective]),UsStatusButtonDirective=function($rootScope,$repo,$confirm,$loading,$qqueue,$template){var link,template;return template=$template.get("us/us-status-button.html",!0),link=function($scope,$el,$attrs,$model){var isEditable,render,save;return isEditable=function(){return-1!==$scope.project.my_permissions.indexOf("modify_us")},render=function(_this){return function(us){var html,status;return status=$scope.statusById[us.status],html=template({status:status,statuses:$scope.statusList,editable:isEditable()}),$el.html(html)}}(this),save=$qqueue.bindAdd(function(_this){return function(status){var currentLoading,onError,onSuccess,us;return us=$model.$modelValue.clone(),us.status=status,$.fn.popover().closeAll(),currentLoading=$loading().target($el).start(),onSuccess=function(){return $model.$setViewValue(us),$rootScope.$broadcast("object:updated"),currentLoading.finish()},onError=function(){return $confirm.notify("error"),currentLoading.finish()},$repo.save(us).then(onSuccess,onError)}}(this)),$el.on("click",".js-edit-status",function(event){return event.preventDefault(),event.stopPropagation(),isEditable()?$el.find(".pop-status").popover().open():void 0}),$el.on("click",".status",function(event){var status,target;return event.preventDefault(),event.stopPropagation(),isEditable()?(target=angular.element(event.currentTarget),status=target.data("status-id"),save(status)):void 0}),$scope.$watch($attrs.ngModel,function(us){return us?render(us):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgUsStatusButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQqueue","$tgTemplate",UsStatusButtonDirective]),UsTeamRequirementButtonDirective=function($rootscope,$tgrepo,$confirm,$loading,$qqueue,$template,$compile){var link,template;return template=$template.get("us/us-team-requirement-button.html",!0),link=function($scope,$el,$attrs,$model){var canEdit,render,save;return canEdit=function(){return-1!==$scope.project.my_permissions.indexOf("modify_us")},render=function(us){var ctx,html;return ctx={canEdit:canEdit(),isRequired:us.team_requirement},html=template(ctx),html=$compile(html)($scope),$el.html(html)},save=$qqueue.bindAdd(function(_this){return function(team_requirement){var currentLoading,promise,us;return us=$model.$modelValue.clone(),us.team_requirement=team_requirement,currentLoading=$loading().target($el.find("label")).start(),promise=$tgrepo.save(us),promise.then(function(){return $model.$setViewValue(us),currentLoading.finish(),$rootscope.$broadcast("object:updated")}),promise.then(null,function(){return currentLoading.finish(),$confirm.notify("error")})}}(this)),$el.on("click",".team-requirement",function(event){var team_requirement;if(canEdit())return team_requirement=!$model.$modelValue.team_requirement,save(team_requirement)}),$scope.$watch($attrs.ngModel,function(us){return us?render(us):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgUsTeamRequirementButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQqueue","$tgTemplate","$compile",UsTeamRequirementButtonDirective]),UsClientRequirementButtonDirective=function($rootscope,$tgrepo,$confirm,$loading,$qqueue,$template,$compile){var link,template;return template=$template.get("us/us-client-requirement-button.html",!0),link=function($scope,$el,$attrs,$model){var canEdit,render,save;return canEdit=function(){return-1!==$scope.project.my_permissions.indexOf("modify_us")},render=function(us){var ctx,html;return ctx={canEdit:canEdit(),isRequired:us.client_requirement},html=$compile(template(ctx))($scope),$el.html(html)},save=$qqueue.bindAdd(function(_this){return function(client_requirement){var currentLoading,promise,us;return us=$model.$modelValue.clone(),us.client_requirement=client_requirement,currentLoading=$loading().target($el.find("label")).start(),promise=$tgrepo.save(us),promise.then(function(){return $model.$setViewValue(us),currentLoading.finish(),$rootscope.$broadcast("object:updated")}),promise.then(null,function(){return $confirm.notify("error")})}}(this)),$el.on("click",".client-requirement",function(event){var client_requirement;if(canEdit())return client_requirement=!$model.$modelValue.client_requirement,save(client_requirement)}),$scope.$watch($attrs.ngModel,function(us){return us?render(us):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgUsClientRequirementButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQqueue","$tgTemplate","$compile",UsClientRequirementButtonDirective])}.call(this),function(){var TaskDetailController,TaskIsIocaineButtonDirective,TaskStatusButtonDirective,TaskStatusDisplayDirective,bindMethods,groupBy,mixOf,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,groupBy=this.taiga.groupBy,bindMethods=this.taiga.bindMethods,module=angular.module("taigaTasks"),TaskDetailController=function(superClass){function TaskDetailController(scope,rootscope,repo,confirm,rs,params,q,location,log,appMetaService,navUrls,analytics,translate){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.log=log,this.appMetaService=appMetaService,this.navUrls=navUrls,this.analytics=analytics,this.translate=translate,bindMethods(this),this.scope.taskRef=this.params.taskref,this.scope.sectionName=this.translate.instant("TASK.SECTION_NAME"),this.initializeEventHandlers(),promise=this.loadInitialData(),promise.then(function(_this){return function(){return _this._setMeta(),_this.initializeOnDeleteGoToUrl()}}(this)),promise.then(null,this.onInitialDataError.bind(this))}return extend(TaskDetailController,superClass),TaskDetailController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$log","tgAppMetaService","$tgNavUrls","$tgAnalytics","$translate"],TaskDetailController.prototype._setMeta=function(){var description,ref,title;return title=this.translate.instant("TASK.PAGE_TITLE",{taskRef:"#"+this.scope.task.ref,taskSubject:this.scope.task.subject,projectName:this.scope.project.name}),description=this.translate.instant("TASK.PAGE_DESCRIPTION",{taskStatus:(null!=(ref=this.scope.statusById[this.scope.task.status])?ref.name:void 0)||"--",taskDescription:angular.element(this.scope.task.description_html||"").text()}),this.appMetaService.setAll(title,description)},TaskDetailController.prototype.initializeEventHandlers=function(){return this.scope.$on("attachment:create",function(_this){return function(){return _this.analytics.trackEvent("attachment","create","create attachment on task",1)}}(this)),this.scope.$on("custom-attributes-values:edit",function(_this){return function(){return _this.rootscope.$broadcast("object:updated")}}(this)),this.scope.$on("comment:new",function(_this){return function(){return _this.loadTask()}}(this))},TaskDetailController.prototype.initializeOnDeleteGoToUrl=function(){var ctx;if(ctx={project:this.scope.project.slug},this.scope.onDeleteGoToUrl=this.navUrls.resolve("project",ctx),this.scope.project.is_backlog_activated){if(this.scope.task.milestone)return ctx.sprint=this.scope.sprint.slug,this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-taskboard",ctx);if(this.scope.task.us)return ctx.ref=this.scope.us.ref,this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-userstories-detail",ctx)}else if(this.scope.project.is_kanban_activated&&this.scope.us)return ctx.ref=this.scope.us.ref,this.scope.onDeleteGoToUrl=this.navUrls.resolve("project-userstories-detail",ctx)},TaskDetailController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return _this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),_this.scope.statusList=project.task_statuses,_this.scope.statusById=groupBy(project.task_statuses,function(x){return x.id}),project}}(this))},TaskDetailController.prototype.loadTask=function(){return this.rs.tasks.getByRef(this.scope.projectId,this.params.taskref).then(function(_this){return function(task){var ctx,ref,ref1;return _this.scope.task=task,_this.scope.taskId=task.id,_this.scope.commentModel=task,null!=(null!=(ref=_this.scope.task.neighbors.previous)?ref.ref:void 0)&&(ctx={project:_this.scope.project.slug,ref:_this.scope.task.neighbors.previous.ref},_this.scope.previousUrl=_this.navUrls.resolve("project-tasks-detail",ctx)),null!=(null!=(ref1=_this.scope.task.neighbors.next)?ref1.ref:void 0)&&(ctx={project:_this.scope.project.slug,ref:_this.scope.task.neighbors.next.ref},_this.scope.nextUrl=_this.navUrls.resolve("project-tasks-detail",ctx)),task}}(this))},TaskDetailController.prototype.loadSprint=function(){return this.scope.task.milestone?this.rs.sprints.get(this.scope.task.project,this.scope.task.milestone).then(function(_this){return function(sprint){return _this.scope.sprint=sprint,sprint}}(this)):void 0},TaskDetailController.prototype.loadUserStory=function(){return this.scope.task.user_story?this.rs.userstories.get(this.scope.task.project,this.scope.task.user_story).then(function(_this){return function(us){return _this.scope.us=us,us}}(this)):void 0},TaskDetailController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(project){return _this.fillUsersAndRoles(project.members,project.roles),_this.loadTask().then(function(){return _this.q.all([_this.loadSprint(),_this.loadUserStory()])})}}(this))},TaskDetailController.prototype.onUpvote=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.loadTask(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error")}}(this),this.rs.tasks.upvote(this.scope.taskId).then(onSuccess,onError)},TaskDetailController.prototype.onDownvote=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.loadTask(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error")}}(this),this.rs.tasks.downvote(this.scope.taskId).then(onSuccess,onError)},TaskDetailController.prototype.onWatch=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.loadTask(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error")}}(this),this.rs.tasks.watch(this.scope.taskId).then(onSuccess,onError)},TaskDetailController.prototype.onUnwatch=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.loadTask(),_this.rootscope.$broadcast("object:updated")}}(this),onError=function(_this){return function(){return _this.confirm.notify("error")}}(this),this.rs.tasks.unwatch(this.scope.taskId).then(onSuccess,onError)},TaskDetailController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("TaskDetailController",TaskDetailController),TaskStatusDisplayDirective=function($template,$compile){var link,template;return template=$template.get("common/components/status-display.html",!0),link=function($scope,$el,$attrs){var render;return render=function(task){var html,status;return status=$scope.statusById[task.status],html=template({is_closed:status.is_closed,status:status}),html=$compile(html)($scope),$el.html(html)},$scope.$watch($attrs.ngModel,function(task){return null!=task?render(task):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgTaskStatusDisplay",["$tgTemplate","$compile",TaskStatusDisplayDirective]),TaskStatusButtonDirective=function($rootScope,$repo,$confirm,$loading,$qqueue,$compile,$translate,$template){var link,template;return template=$template.get("us/us-status-button.html",!0),link=function($scope,$el,$attrs,$model){var isEditable,render,save;return isEditable=function(){return-1!==$scope.project.my_permissions.indexOf("modify_task")},render=function(_this){return function(task){var html,status;return status=$scope.statusById[task.status],html=$compile(template({status:status,statuses:$scope.statusList,editable:isEditable()}))($scope),$el.html(html)}}(this),save=$qqueue.bindAdd(function(_this){return function(status){var currentLoading,onError,onSuccess,task;return task=$model.$modelValue.clone(),task.status=status,currentLoading=$loading().target($el).start(),onSuccess=function(){return $model.$setViewValue(task),$rootScope.$broadcast("object:updated"),currentLoading.finish()},onError=function(){return $confirm.notify("error"),currentLoading.finish()},$repo.save(task).then(onSuccess,onError)}}(this)),$el.on("click",".js-edit-status",function(event){return event.preventDefault(),event.stopPropagation(),isEditable()?$el.find(".pop-status").popover().open():void 0}),$el.on("click",".status",function(event){var target;return event.preventDefault(),event.stopPropagation(),isEditable()?(target=angular.element(event.currentTarget),$.fn.popover().closeAll(),save(target.data("status-id"))):void 0}),$scope.$watch($attrs.ngModel,function(task){return task?render(task):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgTaskStatusButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQqueue","$compile","$translate","$tgTemplate",TaskStatusButtonDirective]),TaskIsIocaineButtonDirective=function($rootscope,$tgrepo,$confirm,$loading,$qqueue,$compile,$template){var link,template;return template=$template.get("issue/iocaine-button.html",!0),link=function($scope,$el,$attrs,$model){var isEditable,render,save;return isEditable=function(){return-1!==$scope.project.my_permissions.indexOf("modify_task")},render=function(task){var ctx,html;return isEditable()||task.is_iocaine?(ctx={isIocaine:task.is_iocaine,isEditable:isEditable()},html=$compile(template(ctx))($scope),$el.html(html)):void $el.html("")},save=$qqueue.bindAdd(function(_this){return function(is_iocaine){var currentLoading,promise,task;return task=$model.$modelValue.clone(),task.is_iocaine=is_iocaine,currentLoading=$loading().target($el.find("label")).start(),promise=$tgrepo.save(task),promise.then(function(){return $model.$setViewValue(task),$rootscope.$broadcast("object:updated")}),promise.then(null,function(){return $confirm.notify("error")}),promise["finally"](function(){return currentLoading.finish()})}}(this)),$el.on("click",".is-iocaine",function(event){var is_iocaine;if(isEditable())return is_iocaine=!$model.$modelValue.is_iocaine,save(is_iocaine)}),$scope.$watch($attrs.ngModel,function(task){return task?render(task):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgTaskIsIocaineButton",["$rootScope","$tgRepo","$tgConfirm","$tgLoading","$tgQqueue","$compile","$tgTemplate",TaskIsIocaineButtonDirective])}.call(this),function(){var LeaveProjectDirective,TeamController,TeamFiltersDirective,TeamMemberCurrentUserDirective,TeamMemberStatsDirective,TeamMembersDirective,membersFilter,mixOf,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,module=angular.module("taigaTeam"),TeamController=function(superClass){function TeamController(scope,rootscope,repo,rs,params,q,location,navUrls,appMetaService,auth,translate,projectService){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.rs=rs,this.params=params,this.q=q,this.location=location,this.navUrls=navUrls,this.appMetaService=appMetaService,this.auth=auth,this.translate=translate,this.projectService=projectService,this.scope.sectionName="TEAM.SECTION_NAME",promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,title;return title=_this.translate.instant("TEAM.PAGE_TITLE",{projectName:_this.scope.project.name}),description=_this.translate.instant("TEAM.PAGE_DESCRIPTION",{projectName:_this.scope.project.name,projectDescription:_this.scope.project.description}),_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this))}return extend(TeamController,superClass),TeamController.$inject=["$scope","$rootScope","$tgRepo","$tgResources","$routeParams","$q","$location","$tgNavUrls","tgAppMetaService","$tgAuth","$translate","tgProjectService"],TeamController.prototype.setRole=function(role){return role?this.scope.filtersRole=role:this.scope.filtersRole=null},TeamController.prototype.loadMembers=function(){var i,len,member,ref,user;for(user=this.auth.getUser(),this.scope.totals={},ref=this.scope.activeUsers,i=0,len=ref.length;len>i;i++)member=ref[i],this.scope.totals[member.id]=0;return this.scope.currentUser=_.find(this.scope.activeUsers,{id:null!=user?user.id:void 0}),this.scope.memberships=_.reject(this.scope.activeUsers,{id:null!=user?user.id:void 0})},TeamController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return _this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),_this.scope.issuesEnabled=project.is_issues_activated,_this.scope.tasksEnabled=project.is_kanban_activated||project.is_backlog_activated,_this.scope.wikiEnabled=project.is_wiki_activated,project}}(this))},TeamController.prototype.loadMemberStats=function(){return this.rs.projects.memberStats(this.scope.projectId).then(function(_this){return function(stats){var totals;return totals={},_.forEach(_this.scope.totals,function(total,userId){var vals;return vals=_.map(stats,function(memberStats,statsKey){return memberStats[userId]}),total=_.reduce(vals,function(sum,el){return sum+el}),_this.scope.totals[userId]=total}),_this.scope.stats=_this._processStats(stats),_this.scope.stats.totals=_this.scope.totals}}(this))},TeamController.prototype._processStat=function(stat){var max,min,singleStat;return max=_.max(stat),min=_.min(stat),singleStat=_.map(stat,function(value,key){return value===min?[key,.1]:value===max?[key,1]:[key,.5*value/max]}),singleStat=_.object(singleStat)},TeamController.prototype._processStats=function(stats){var key,value;for(key in stats)value=stats[key],stats[key]=this._processStat(value);return stats},TeamController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(project){return _this.fillUsersAndRoles(project.members,project.roles),_this.loadMembers(),_this.loadMemberStats()}}(this))},TeamController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("TeamController",TeamController),TeamFiltersDirective=function(){return{templateUrl:"team/team-filter.html"}},module.directive("tgTeamFilters",[TeamFiltersDirective]),TeamMemberStatsDirective=function(){return{templateUrl:"team/team-member-stats.html",scope:{stats:"=",userId:"=user",issuesEnabled:"=issuesenabled",tasksEnabled:"=tasksenabled",wikiEnabled:"=wikienabled"}}},module.directive("tgTeamMemberStats",TeamMemberStatsDirective),TeamMemberCurrentUserDirective=function(){return{templateUrl:"team/team-member-current-user.html",scope:{projectId:"=projectid",currentUser:"=currentuser",stats:"=",issuesEnabled:"=issuesenabled",tasksEnabled:"=tasksenabled",wikiEnabled:"=wikienabled"}}},module.directive("tgTeamCurrentUser",TeamMemberCurrentUserDirective),TeamMembersDirective=function(){var template;return template="team/team-members.html",{templateUrl:template,scope:{memberships:"=",filtersQ:"=filtersq",filtersRole:"=filtersrole",stats:"=",issuesEnabled:"=issuesenabled",tasksEnabled:"=tasksenabled",wikiEnabled:"=wikienabled"}}},module.directive("tgTeamMembers",TeamMembersDirective),LeaveProjectDirective=function($repo,$confirm,$location,$rs,$navurls,$translate){var link;return link=function($scope,$el,$attrs){return $scope.leave=function(){var confirm_leave_project_text,leave_project_text;return leave_project_text=$translate.instant("TEAM.ACTION_LEAVE_PROJECT"),confirm_leave_project_text=$translate.instant("TEAM.CONFIRM_LEAVE_PROJECT"),$confirm.ask(leave_project_text,confirm_leave_project_text).then(function(_this){return function(response){var promise;return promise=$rs.projects.leave($attrs.projectid),promise.then(function(){return response.finish(),$confirm.notify("success"),$location.path($navurls.resolve("home"))}),promise.then(null,function(response){return response.finish(),$confirm.notify("error",response.data._error_message)})}}(this))}},{scope:{},templateUrl:"team/leave-project.html",link:link}},module.directive("tgLeaveProject",["$tgRepo","$tgConfirm","$tgLocation","$tgResources","$tgNavUrls","$translate",LeaveProjectDirective]),membersFilter=function(){return function(members,filtersQ,filtersRole){return _.filter(members,function(m){return(!filtersRole||m.role===filtersRole.id)&&(!filtersQ||m.full_name.search(new RegExp(filtersQ,"i"))>=0)})}},module.filter("membersFilter",membersFilter)}.call(this),function(){var EditableWikiContentDirective,WikiDetailController,WikiSummaryDirective,bindOnce,debounce,groupBy,mixOf,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,groupBy=this.taiga.groupBy,bindOnce=this.taiga.bindOnce,debounce=this.taiga.debounce,module=angular.module("taigaWiki"),WikiDetailController=function(superClass){function WikiDetailController(scope,rootscope,repo,model,confirm,rs,params,q,location,filter,log,appMetaService,navUrls,analytics,translate){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.model=model,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.filter=filter,this.log=log,this.appMetaService=appMetaService,this.navUrls=navUrls,this.analytics=analytics,this.translate=translate,this.scope.projectSlug=this.params.pslug,this.scope.wikiSlug=this.params.slug,this.scope.wikiTitle=this.scope.wikiSlug,this.scope.sectionName="Wiki",this.scope.linksVisible=!1,promise=this.loadInitialData(),promise.then(function(_this){return function(){return _this._setMeta()}}(this)),promise.then(null,this.onInitialDataError.bind(this))}return extend(WikiDetailController,superClass),WikiDetailController.$inject=["$scope","$rootScope","$tgRepo","$tgModel","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$filter","$log","tgAppMetaService","$tgNavUrls","$tgAnalytics","$translate"],WikiDetailController.prototype._setMeta=function(){var description,ref,ref1,ref2,title;return title=this.translate.instant("WIKI.PAGE_TITLE",{wikiPageName:this.scope.wikiTitle,projectName:this.scope.project.name}),description=this.translate.instant("WIKI.PAGE_DESCRIPTION",{wikiPageContent:angular.element((null!=(ref=this.scope.wiki)?ref.html:void 0)||"").text(),totalEditions:(null!=(ref1=this.scope.wiki)?ref1.editions:void 0)||0,lastModifiedDate:moment(null!=(ref2=this.scope.wiki)?ref2.modified_date:void 0).format(this.translate.instant("WIKI.DATETIME"))}),this.appMetaService.setAll(title,description)},WikiDetailController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return project.is_wiki_activated||_this.location.path(_this.navUrls.resolve("permission-denied")),_this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),project}}(this))},WikiDetailController.prototype.loadWiki=function(){var promise;return promise=this.rs.wiki.getBySlug(this.scope.projectId,this.params.slug),promise.then(function(_this){return function(wiki){return _this.scope.wiki=wiki,_this.scope.wikiId=wiki.id,_this.scope.wiki}}(this)),promise.then(null,function(_this){return function(xhr){var data;return _this.scope.wikiId=null,-1===_this.scope.project.my_permissions.indexOf("add_wiki_page")?null:(data={project:_this.scope.projectId,slug:_this.scope.wikiSlug,content:""},_this.scope.wiki=_this.model.make_model("wiki",data),_this.scope.wiki)}}(this))},WikiDetailController.prototype.loadWikiLinks=function(){return this.rs.wiki.listLinks(this.scope.projectId).then(function(_this){return function(wikiLinks){var selectedWikiLink;return _this.scope.wikiLinks=wikiLinks,selectedWikiLink=_.find(wikiLinks,{href:_this.scope.wikiSlug}),null!=selectedWikiLink?_this.scope.wikiTitle=selectedWikiLink.title:void 0}}(this))},WikiDetailController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(project){return _this.fillUsersAndRoles(project.members,project.roles),_this.q.all([_this.loadWikiLinks(),_this.loadWiki()]).then(_this.checkLinksPerms.bind(_this))}}(this))},WikiDetailController.prototype.checkLinksPerms=function(){return-1!==this.scope.project.my_permissions.indexOf("modify_wiki_link")||-1!==this.scope.project.my_permissions.indexOf("view_wiki_links")&&this.scope.wikiLinks.length?this.scope.linksVisible=!0:void 0},WikiDetailController.prototype["delete"]=function(){var message,title;return title=this.translate.instant("WIKI.DELETE_LIGHTBOX_TITLE"),message=this.scope.wikiTitle,this.confirm.askOnDelete(title,message).then(function(_this){return function(askResponse){var onError,onSuccess;return onSuccess=function(){var ctx;return askResponse.finish(),ctx={project:_this.scope.projectSlug},_this.location.path(_this.navUrls.resolve("project-wiki",ctx)),_this.confirm.notify("success")},onError=function(){return askResponse.finish(!1),_this.confirm.notify("error")},_this.repo.remove(_this.scope.wiki).then(onSuccess,onError)}}(this))},WikiDetailController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("WikiDetailController",WikiDetailController),WikiSummaryDirective=function($log,$template,$compile,$translate){var link,template;return template=$template.get("wiki/wiki-summary.html",!0),link=function($scope,$el,$attrs,$model){var render;return render=function(wiki){var ctx,html,user;return null==$scope.usersById?$log.error("WikiSummaryDirective requires userById set in scope."):user=$scope.usersById[wiki.last_modifier],user=void 0===user?{name:"unknown",imgUrl:"/"+window._version+"/images/user-noimage.png"}:{name:user.full_name_display,imgUrl:user.photo},ctx={totalEditions:wiki.editions,lastModifiedDate:moment(wiki.modified_date).format($translate.instant("WIKI.DATETIME")),user:user},html=template(ctx),html=$compile(html)($scope),$el.html(html)},$scope.$watch($attrs.ngModel,function(wikiPage){return wikiPage?render(wikiPage):void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgWikiSummary",["$log","$tgTemplate","$compile","$translate",WikiSummaryDirective]),EditableWikiContentDirective=function($window,$document,$repo,$confirm,$loading,$analytics,$qqueue){var link;return link=function($scope,$el,$attrs,$model){var cancelEdition,disableEdition,getSelectedText,isEditable,save,switchToEditMode,switchToReadMode;return isEditable=function(){return-1!==$scope.project.my_permissions.indexOf("modify_wiki_page")},switchToEditMode=function(){return $el.find(".edit-wiki-content").show(),$el.find(".view-wiki-content").hide(),$el.find("textarea").focus()},switchToReadMode=function(){return $el.find(".edit-wiki-content").hide(),$el.find(".view-wiki-content").show()},disableEdition=function(){return $el.find(".view-wiki-content .edit").remove(),$el.find(".edit-wiki-content").remove()},cancelEdition=function(){return $model.$modelValue.id?($scope.$apply(function(_this){return function(){return $model.$modelValue.revert()}}(this)),switchToReadMode()):void 0},getSelectedText=function(){return $window.getSelection?$window.getSelection().toString():$document.selection?$document.selection.createRange().text:null},save=$qqueue.bindAdd(function(wiki){var currentLoading,onError,onSuccess,promise;return onSuccess=function(wikiPage){return null==wiki.id&&$analytics.trackEvent("wikipage","create","create wiki page",1),$model.$setViewValue(wikiPage.clone()),$confirm.notify("success"),switchToReadMode()},onError=function(){return $confirm.notify("error")},currentLoading=$loading().removeClasses("icon-floppy").target($el.find(".icon-floppy")).start(),promise=null!=wiki.id?$repo.save(wiki).then(onSuccess,onError):$repo.create("wiki",wiki).then(onSuccess,onError),promise["finally"](function(){return currentLoading.finish()})}),$el.on("click","a",function(event){var href,target;return target=angular.element(event.target),href=target.attr("href"),0===href.indexOf("#")?(event.preventDefault(),$("body").scrollTop($(href).offset().top)):void 0}),$el.on("mousedown",".view-wiki-content",function(event){var target;target=angular.element(event.target),isEditable()&&2===event.button}),$el.on("mouseup",".view-wiki-content",function(event){var target;return target=angular.element(event.target),getSelectedText()||!isEditable()||target.is("a")||target.is("pre")?void 0:switchToEditMode()}),$el.on("click",".save",debounce(2e3,function(){return save($scope.wiki)})),$el.on("click",".cancel",function(){return cancelEdition()}),$el.on("keydown","textarea",function(event){return 27===event.keyCode?cancelEdition():void 0}),$scope.$watch($attrs.ngModel,function(wikiPage){return wikiPage?isEditable()?($el.addClass("editable"),null==wikiPage.id||0===$.trim(wikiPage.content).length?switchToEditMode():void 0):disableEdition():void 0; +}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,restrict:"EA",require:"ngModel",templateUrl:"wiki/editable-wiki-content.html"}},module.directive("tgEditableWikiContent",["$window","$document","$tgRepo","$tgConfirm","$tgLoading","$tgAnalytics","$tgQqueue",EditableWikiContentDirective])}.call(this),function(){var WikiNavDirective,bindOnce,groupBy,mixOf,module,taiga;taiga=this.taiga,mixOf=this.taiga.mixOf,groupBy=this.taiga.groupBy,bindOnce=this.taiga.bindOnce,module=angular.module("taigaWiki"),WikiNavDirective=function($tgrepo,$log,$location,$confirm,$navUrls,$analytics,$loading,$template,$compile,$translate){var link,template;return template=$template.get("wiki/wiki-nav.html",!0),link=function($scope,$el,$attrs){var $ctrl,render;return $ctrl=$el.controller(),null==$attrs.ngModel?$log.error("WikiNavDirective: no ng-model attr is defined"):(render=function(wikiLinks){var addWikiLinkPermission,deleteWikiLinkPermission,html;return addWikiLinkPermission=$scope.project.my_permissions.indexOf("add_wiki_link")>-1,deleteWikiLinkPermission=$scope.project.my_permissions.indexOf("delete_wiki_link")>-1,html=template({wikiLinks:wikiLinks,projectSlug:$scope.projectSlug,addWikiLinkPermission:addWikiLinkPermission,deleteWikiLinkPermission:deleteWikiLinkPermission}),html=$compile(html)($scope),$el.off(),$el.html(html),$el.on("click",".wiki-link .link-title",function(event){var linkId,linkSlug,target;return event.preventDefault(),target=angular.element(event.currentTarget),linkId=target.parents(".wiki-link").data("id"),linkSlug=$scope.wikiLinks[linkId].href,$scope.$apply(function(){var ctx;return ctx={project:$scope.projectSlug,slug:linkSlug},$location.path($navUrls.resolve("project-wiki-page",ctx))})}),$el.on("click",".add-button",function(event){return event.preventDefault(),$el.find(".new").removeClass("hidden"),$el.find(".new input").focus(),$el.find(".add-button").hide()}),$el.on("click",".wiki-link .icon-delete",function(event){var linkId,message,target,title;return event.preventDefault(),event.stopPropagation(),target=angular.element(event.currentTarget),linkId=target.parents(".wiki-link").data("id"),title=$translate.instant("WIKI.DELETE_LIGHTBOX_TITLE"),message=$scope.wikiLinks[linkId].title,$confirm.askOnDelete(title,message).then(function(_this){return function(askResponse){var promise;return promise=$tgrepo.remove($scope.wikiLinks[linkId]),promise.then(function(){return promise=$ctrl.loadWikiLinks(),promise.then(function(){return askResponse.finish(),render($scope.wikiLinks)}),promise.then(null,function(){return askResponse.finish()})}),promise.then(null,function(){return askResponse.finish(!1),$confirm.notify("error")})}}(this))}),$el.on("keyup",".new input",function(event){var currentLoading,newLink,promise,target;return event.preventDefault(),13===event.keyCode?(target=angular.element(event.currentTarget),newLink=target.val(),currentLoading=$loading().target($el.find(".new")).start(),promise=$tgrepo.create("wiki-links",{project:$scope.projectId,title:newLink}),promise.then(function(){var loadPromise;return $analytics.trackEvent("wikilink","create","create wiki link",1),loadPromise=$ctrl.loadWikiLinks(),loadPromise.then(function(){return currentLoading.finish(),$el.find(".new").addClass("hidden"),$el.find(".new input").val(""),$el.find(".add-button").show(),render($scope.wikiLinks)}),loadPromise.then(null,function(){return currentLoading.finish(),$el.find(".new").addClass("hidden"),$el.find(".new input").val(""),$el.find(".add-button").show(),$confirm.notify("error","Error loading wiki links")})}),promise.then(null,function(error){var ref;return currentLoading.finish(),$el.find(".new input").val(newLink),$el.find(".new input").focus().select(),null!=(null!=error&&null!=(ref=error.__all__)?ref[0]:void 0)?$confirm.notify("error","The link already exists"):$confirm.notify("error")})):27===event.keyCode?(target=angular.element(event.currentTarget),$el.find(".new").addClass("hidden"),$el.find(".new input").val(""),$el.find(".add-button").show()):void 0})},bindOnce($scope,$attrs.ngModel,render))},{link:link}},module.directive("tgWikiNav",["$tgRepo","$log","$tgLocation","$tgConfirm","$tgNavUrls","$tgAnalytics","$tgLoading","$tgTemplate","$compile","$translate",WikiNavDirective])}.call(this),function(){var CreateMembersDirective,MAX_MEMBERSHIP_FIELDSETS,debounce,module,taiga;taiga=this.taiga,debounce=this.taiga.debounce,module=angular.module("taigaKanban"),MAX_MEMBERSHIP_FIELDSETS=4,CreateMembersDirective=function($rs,$rootScope,$confirm,$loading,lightboxService,$compile){var extraTextTemplate,link,template;return extraTextTemplate='
\n \n
',template=_.template('
'),link=function($scope,$el,$attrs){var createFieldSet,resetForm,submit,submitButton;return createFieldSet=function(required){var ctx;return null==required&&(required=!0),ctx={roleList:$scope.project.roles,required:required},$compile(template(ctx))($scope)},resetForm=function(){var fieldSet,invitations;return $el.find("form textarea").remove(),$el.find("form .add-member-wrapper").remove(),invitations=$el.find(".add-member-forms"),invitations.html($compile(extraTextTemplate)($scope)),fieldSet=createFieldSet(),invitations.prepend(fieldSet)},$scope.$on("membersform:new",function(){return resetForm(),lightboxService.open($el)}),$scope.$on("$destroy",function(){return $el.off()}),$el.on("click",".delete-fieldset",function(event){var fieldSet,lastActionButton,target;return event.preventDefault(),target=angular.element(event.currentTarget),fieldSet=target.closest(".add-member-wrapper"),fieldSet.remove(),lastActionButton=$el.find(".add-member-wrapper fieldset:last > a"),lastActionButton.hasClass("icon-delete delete-fieldset")?lastActionButton.removeClass("icon-delete delete-fieldset").addClass("icon-plus add-fieldset"):void 0}),$el.on("click",".add-fieldset",function(event){var fieldSet,newFieldSet,target;return event.preventDefault(),target=angular.element(event.currentTarget),fieldSet=target.closest(".add-member-wrapper"),target.removeClass("icon-plus add-fieldset").addClass("icon-delete delete-fieldset"),newFieldSet=createFieldSet(!1),fieldSet.after(newFieldSet),$scope.$digest(),$el.find(".add-member-wrapper").length===MAX_MEMBERSHIP_FIELDSETS?$el.find(".add-member-wrapper fieldset:last > a").removeClass("icon-plus add-fieldset").addClass("icon-delete delete-fieldset"):void 0}),submit=debounce(2e3,function(_this){return function(event){var currentLoading,form,invitation_extra_text,invitations,memberWrappers,onError,onSuccess,promise;return event.preventDefault(),currentLoading=$loading().target(submitButton).start(),onSuccess=function(data){return currentLoading.finish(),lightboxService.close($el),$confirm.notify("success"),$rootScope.$broadcast("membersform:new:success")},onError=function(data){return currentLoading.finish(),lightboxService.close($el),$confirm.notify("error"),$rootScope.$broadcast("membersform:new:error")},form=$el.find("form").checksley(),form.destroy(),form.initialize(),form.validate()?(memberWrappers=$el.find("form .add-member-wrapper"),memberWrappers=_.filter(memberWrappers,function(mw){return angular.element(mw).find("input").hasClass("checksley-ok")}),invitations=_.map(memberWrappers,function(mw){var email,memberWrapper,role;return memberWrapper=angular.element(mw),email=memberWrapper.find("input"),role=memberWrapper.find("select"),{email:email.val(),role_id:role.val()}}),invitations.length?(invitation_extra_text=$el.find("form textarea").val(),promise=$rs.memberships.bulkCreateMemberships($scope.project.id,invitations,invitation_extra_text),promise.then(onSuccess,onError)):void 0):void 0}}(this)),submitButton=$el.find(".submit-button"),$el.on("submit","form",submit)},{link:link}},module.directive("tgLbCreateMembers",["$tgResources","$rootScope","$tgConfirm","$tgLoading","lightboxService","$compile",CreateMembersDirective])}.call(this),function(){var MembershipsController,MembershipsDirective,MembershipsRowActionsDirective,MembershipsRowAdminCheckboxDirective,MembershipsRowAvatarDirective,MembershipsRowRoleSelectorDirective,bindMethods,mixOf,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,bindMethods=this.taiga.bindMethods,module=angular.module("taigaAdmin"),MembershipsController=function(superClass){function MembershipsController(scope,rootscope,repo,confirm,rs,params,q,location,navUrls,analytics,appMetaService,translate){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.navUrls=navUrls,this.analytics=analytics,this.appMetaService=appMetaService,this.translate=translate,bindMethods(this),this.scope.project={},this.scope.filters={},promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,title;return title=_this.translate.instant("ADMIN.MEMBERSHIPS.PAGE_TITLE",{projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this)),this.scope.$on("membersform:new:success",function(_this){return function(){return _this.loadMembers(),_this.analytics.trackEvent("membership","create","create memberships on admin",1)}}(this))}return extend(MembershipsController,superClass),MembershipsController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAnalytics","tgAppMetaService","$translate"],MembershipsController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return project.i_am_owner||_this.location.path(_this.navUrls.resolve("permission-denied")),_this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),project}}(this))},MembershipsController.prototype.loadMembers=function(){var httpFilters;return httpFilters=this.getUrlFilters(),this.rs.memberships.list(this.scope.projectId,httpFilters).then(function(_this){return function(data){return _this.scope.memberships=_.filter(data.models,function(membership){return null===membership.user||membership.is_user_active}),_this.scope.page=data.current,_this.scope.count=data.count,_this.scope.paginatedBy=data.paginatedBy,data}}(this))},MembershipsController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(){return _this.loadMembers()}}(this)),promise},MembershipsController.prototype.getUrlFilters=function(){var filters;return filters=_.pick(this.location.search(),"page"),filters.page||(filters.page=1),filters},MembershipsController.prototype.addNewMembers=function(){return this.rootscope.$broadcast("membersform:new")},MembershipsController}(mixOf(taiga.Controller,taiga.PageMixin,taiga.FiltersMixin)),module.controller("MembershipsController",MembershipsController),MembershipsDirective=function($template,$compile){var link,linkPagination,template;return template=$template.get("admin/admin-membership-paginator.html",!0),linkPagination=function($scope,$el,$attrs,$ctrl){var $pagEl,afterCurrent,atBegin,atEnd,beforeCurrent,getNumPages,renderPagination;return afterCurrent=2,beforeCurrent=4,atBegin=2,atEnd=2,$pagEl=$el.find(".memberships-paginator"),getNumPages=function(){var numPages;return numPages=$scope.count/$scope.paginatedBy,numPages=parseInt(numPages,10)=numPages)return void $pagEl.hide();for(pages=[],options={},options.pages=pages,options.showPrevious=$scope.page>1,options.showNext=!($scope.page===numPages),cpage=$scope.page,i=j=1,ref=numPages;ref>=1?ref>=j:j>=ref;i=ref>=1?++j:--j)i===cpage+afterCurrent&&numPages>cpage+afterCurrent+atEnd?pages.push({classes:"dots",type:"dots"}):i===cpage-beforeCurrent&&cpage>atBegin+beforeCurrent?pages.push({classes:"dots",type:"dots"}):i>cpage+afterCurrent&&numPages-atEnd>=i||cpage-beforeCurrent>i&&i>atBegin||(i===cpage?pages.push({classes:"active",num:i,type:"page-active"}):pages.push({classes:"page",num:i,type:"page"}));return html=template(options),html=$compile(html)($scope),$pagEl.html(html),$pagEl.show()},$scope.$watch("memberships",function(value){return value?renderPagination():void 0}),$el.on("click",".memberships-paginator a.next",function(event){return event.preventDefault(),$scope.$apply(function(){return $ctrl.selectFilter("page",$scope.page+1),$ctrl.loadMembers()})}),$el.on("click",".memberships-paginator a.previous",function(event){return event.preventDefault(),$scope.$apply(function(){return $ctrl.selectFilter("page",$scope.page-1),$ctrl.loadMembers()})}),$el.on("click",".memberships-paginator li.page > a",function(event){var pagenum,target;return event.preventDefault(),target=angular.element(event.currentTarget),pagenum=target.data("pagenum"),$scope.$apply(function(){return $ctrl.selectFilter("page",pagenum),$ctrl.loadMembers()})})},link=function($scope,$el,$attrs){var $ctrl;return $ctrl=$el.controller(),linkPagination($scope,$el,$attrs,$ctrl),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgMemberships",["$tgTemplate","$compile",MembershipsDirective]),MembershipsRowAvatarDirective=function($log,$template,$translate){var link,template;return template=$template.get("admin/memberships-row-avatar.html",!0),link=function($scope,$el,$attrs){var member,pending,render;return pending=$translate.instant("ADMIN.MEMBERSHIP.STATUS_PENDING"),render=function(member){var ctx,html;return ctx={full_name:member.full_name?member.full_name:"",email:member.user_email?member.user_email:member.email,imgurl:member.photo?member.photo:"/"+window._version+"/images/unnamed.png",pending:member.is_user_active?"":pending},html=template(ctx),$el.html(html)},null==$attrs.tgMembershipsRowAvatar?$log.error("MembershipsRowAvatarDirective: the directive need a member"):(member=$scope.$eval($attrs.tgMembershipsRowAvatar),render(member),$scope.$on("$destroy",function(){return $el.off()}))},{link:link}},module.directive("tgMembershipsRowAvatar",["$log","$tgTemplate","$translate",MembershipsRowAvatarDirective]),MembershipsRowAdminCheckboxDirective=function($log,$repo,$confirm,$template,$compile){var link,template;return template=$template.get("admin/admin-memberships-row-checkbox.html",!0),link=function($scope,$el,$attrs){var html,member,render;return render=function(member){var ctx,html;return ctx={inputId:"is-admin-"+member.id},html=template(ctx),html=$compile(html)($scope),$el.html(html)},null==$attrs.tgMembershipsRowAdminCheckbox?$log.error("MembershipsRowAdminCheckboxDirective: the directive need a member"):(member=$scope.$eval($attrs.tgMembershipsRowAdminCheckbox),html=render(member),member.is_owner&&$el.find(":checkbox").prop("checked",!0),$el.on("click",":checkbox",function(_this){return function(event){var onError,onSuccess,target;return onSuccess=function(){return $confirm.notify("success")},onError=function(data){return member.revert(),$el.find(":checkbox").prop("checked",member.is_owner),$confirm.notify("error",data.is_owner[0])},target=angular.element(event.currentTarget),member.is_owner=target.prop("checked"),$repo.save(member).then(onSuccess,onError)}}(this)),$scope.$on("$destroy",function(){return $el.off()}))},{link:link}},module.directive("tgMembershipsRowAdminCheckbox",["$log","$tgRepo","$tgConfirm","$tgTemplate","$compile",MembershipsRowAdminCheckboxDirective]),MembershipsRowRoleSelectorDirective=function($log,$repo,$confirm){var link,template;return template=_.template(''),link=function($scope,$el,$attrs){var $ctrl,html,member,render;return render=function(member){var ctx,html;return ctx={roleList:$scope.project.roles,selectedRole:member.role},html=template(ctx),$el.html(html)},null==$attrs.tgMembershipsRowRoleSelector?$log.error("MembershipsRowRoleSelectorDirective: the directive need a member"):($ctrl=$el.controller(),member=$scope.$eval($attrs.tgMembershipsRowRoleSelector),html=render(member),$el.on("change","select",function(_this){return function(event){var newRole,onError,onSuccess,target;return onSuccess=function(){return $confirm.notify("success")},onError=function(){return $confirm.notify("error")},target=angular.element(event.currentTarget),newRole=parseInt(target.val(),10),member.role!==newRole?(member.role=newRole,$repo.save(member).then(onSuccess,onError)):void 0}}(this)),$scope.$on("$destroy",function(){return $el.off()}))},{link:link}},module.directive("tgMembershipsRowRoleSelector",["$log","$tgRepo","$tgConfirm",MembershipsRowRoleSelectorDirective]),MembershipsRowActionsDirective=function($log,$repo,$rs,$confirm,$compile,$translate){var activedTemplate,link,pendingTemplate;return activedTemplate='
\n
\n\n \n',pendingTemplate='\n\n\n \n',link=function($scope,$el,$attrs){var $ctrl,member,render;return render=function(member){var html;return html=member.user?$compile(activedTemplate)($scope):$compile(pendingTemplate)($scope),$el.html(html)},null==$attrs.tgMembershipsRowActions?$log.error("MembershipsRowActionsDirective: the directive need a member"):($ctrl=$el.controller(),member=$scope.$eval($attrs.tgMembershipsRowActions),render(member),$el.on("click",".js-resend",function(event){var onError,onSuccess;return event.preventDefault(),onSuccess=function(){var text;return text=$translate.instant("ADMIN.MEMBERSHIP.SUCCESS_SEND_INVITATION",{email:$scope.member.email}),$confirm.notify("success",text)},onError=function(){var text;return text=$translate.instant("ADMIM.MEMBERSHIP.ERROR_SEND_INVITATION"),$confirm.notify("error",text)},$rs.memberships.resendInvitation($scope.member.id).then(onSuccess,onError)}),$el.on("click",".delete",function(event){var defaultMsg,message,title;return event.preventDefault(),title=$translate.instant("ADMIN.MEMBERSHIP.DELETE_MEMBER"),defaultMsg=$translate.instant("ADMIN.MEMBERSHIP.DEFAULT_DELETE_MESSAGE",{email:member.email}),message=member.user?member.full_name:defaultMsg,$confirm.askOnDelete(title,message).then(function(askResponse){var onError,onSuccess;return onSuccess=function(_this){return function(){var text;return askResponse.finish(),$scope.page>1&&$scope.count-1<=$scope.paginatedBy&&$ctrl.selectFilter("page",$scope.page-1),$ctrl.loadMembers(),text=$translate.instant("ADMIN.MEMBERSHIP.SUCCESS_DELETE"),$confirm.notify("success",null,text)}}(this),onError=function(_this){return function(){var text;return askResponse.finish(!1),text=$translate.instant("ADMIN.MEMBERSHIP.ERROR_DELETE",{message:message}),$confirm.notify("error",null,text)}}(this),$repo.remove(member).then(onSuccess,onError)})}),$scope.$on("$destroy",function(){return $el.off()}))},{link:link}},module.directive("tgMembershipsRowActions",["$log","$tgRepo","$tgResources","$tgConfirm","$compile","$translate",MembershipsRowActionsDirective])}.call(this),function(){var AdminNavigationDirective,module;AdminNavigationDirective=function(){var link;return link=function($scope,$el,$attrs){var section;return section=$attrs.tgAdminNavigation,$el.find(".active").removeClass("active"),$el.find("#adminmenu-"+section+" a").addClass("active"),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module=angular.module("taigaAdmin"),module.directive("tgAdminNavigation",AdminNavigationDirective)}.call(this),function(){var CsvExporterController,CsvExporterIssuesController,CsvExporterTasksController,CsvExporterUserstoriesController,CsvIssueDirective,CsvTaskDirective,CsvUsDirective,ProjectDefaultValuesDirective,ProjectExportDirective,ProjectLogoDirective,ProjectLogoModelDirective,ProjectModulesDirective,ProjectProfileController,ProjectProfileDirective,bindOnce,debounce,groupBy,joinStr,mixOf,module,taiga,toString,trim,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty,bind=function(fn,me){return function(){return fn.apply(me,arguments)}};taiga=this.taiga,mixOf=this.taiga.mixOf,trim=this.taiga.trim,toString=this.taiga.toString,joinStr=this.taiga.joinStr,groupBy=this.taiga.groupBy,bindOnce=this.taiga.bindOnce,debounce=this.taiga.debounce,module=angular.module("taigaAdmin"),ProjectProfileController=function(superClass){function ProjectProfileController(scope,rootscope,repo,confirm,rs,params,q,location,navUrls,appMetaService,translate){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.navUrls=navUrls,this.appMetaService=appMetaService,this.translate=translate,this.scope.project={},promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,sectionName,title;return sectionName=_this.translate.instant(_this.scope.sectionName),title=_this.translate.instant("ADMIN.PROJECT_PROFILE.PAGE_TITLE",{sectionName:sectionName,projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this)),this.scope.$on("project:loaded",function(_this){return function(){var description,sectionName,title;return sectionName=_this.translate.instant(_this.scope.sectionName),title=_this.translate.instant("ADMIN.PROJECT_PROFILE.PAGE_TITLE",{sectionName:sectionName,projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this))}return extend(ProjectProfileController,superClass),ProjectProfileController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","tgAppMetaService","$translate"],ProjectProfileController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return project.i_am_owner||_this.location.path(_this.navUrls.resolve("permission-denied")),_this.scope.projectId=project.id,_this.scope.project=project,_this.scope.pointsList=_.sortBy(project.points,"order"),_this.scope.usStatusList=_.sortBy(project.us_statuses,"order"),_this.scope.taskStatusList=_.sortBy(project.task_statuses,"order"),_this.scope.prioritiesList=_.sortBy(project.priorities,"order"),_this.scope.severitiesList=_.sortBy(project.severities,"order"),_this.scope.issueTypesList=_.sortBy(project.issue_types,"order"),_this.scope.issueStatusList=_.sortBy(project.issue_statuses,"order"),_this.scope.$emit("project:loaded",project),project}}(this))},ProjectProfileController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject()},ProjectProfileController.prototype.openDeleteLightbox=function(){return this.rootscope.$broadcast("deletelightbox:new",this.scope.project)},ProjectProfileController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("ProjectProfileController",ProjectProfileController),ProjectProfileDirective=function($repo,$confirm,$loading,$navurls,$location,projectService,currentUserService){var link;return link=function($scope,$el,$attrs){var $ctrl,form,submit,submitButton;return $ctrl=$el.controller(),form=$el.find("form").checksley({onlyOneErrorElement:!0}),submit=debounce(2e3,function(_this){return function(event){var currentLoading,promise;return event.preventDefault(),form.validate()?(currentLoading=$loading().target(submitButton).start(),promise=$repo.save($scope.project),promise.then(function(){var newUrl;return currentLoading.finish(),$confirm.notify("success"),newUrl=$navurls.resolve("project-admin-project-profile-details",{project:$scope.project.slug}),$location.path(newUrl),$ctrl.loadInitialData(),projectService.fetchProject(),currentUserService.loadProjects()}),promise.then(null,function(data){return currentLoading.finish(),form.setErrors(data),data._error_message?$confirm.notify("error",data._error_message):void 0})):void 0}}(this)),submitButton=$el.find(".submit-button"),$el.on("submit","form",submit)},{link:link}},module.directive("tgProjectProfile",["$tgRepo","$tgConfirm","$tgLoading","$tgNavUrls","$tgLocation","tgProjectService","tgCurrentUserService",ProjectProfileDirective]),ProjectDefaultValuesDirective=function($repo,$confirm,$loading){var link;return link=function($scope,$el,$attrs){var form,submit,submitButton;return form=$el.find("form").checksley({onlyOneErrorElement:!0}),submit=debounce(2e3,function(_this){return function(event){var currentLoading,promise;return event.preventDefault(),form.validate()?(currentLoading=$loading().target(submitButton).start(),promise=$repo.save($scope.project),promise.then(function(){return currentLoading.finish(),$confirm.notify("success")}),promise.then(null,function(data){return currentLoading.finish(),form.setErrors(data),data._error_message?$confirm.notify("error",data._error_message):void 0})):void 0}}(this)),submitButton=$el.find(".submit-button"),$el.on("submit","form",submit),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgProjectDefaultValues",["$tgRepo","$tgConfirm","$tgLoading",ProjectDefaultValuesDirective]),ProjectModulesDirective=function($repo,$confirm,$loading,projectService){var link;return link=function($scope,$el,$attrs){var submit;return submit=function(_this){return function(){var currentLoading,form,promise,target;return form=$el.find("form").checksley(),form.validate()?(target=angular.element(".admin-functionalities .submit-button"),currentLoading=$loading().target(target).start(),promise=$repo.save($scope.project),promise.then(function(){return currentLoading.finish(),$confirm.notify("success"),$scope.$emit("project:loaded",$scope.project),projectService.fetchProject()}),promise.then(null,function(data){return currentLoading.finish(),$confirm.notify("error",data._error_message)})):void 0}}(this),$el.on("submit","form",function(event){return event.preventDefault(),submit()}),$el.on("click",".admin-functionalities a.button-green",function(event){return event.preventDefault(),submit()}),$scope.$watch("isVideoconferenceActivated",function(isVideoconferenceActivated){return isVideoconferenceActivated?$el.find(".videoconference-attributes").removeClass("hidden"):($el.find(".videoconference-attributes").addClass("hidden"),$scope.project.videoconferences=null,$scope.project.videoconferences_extra_data="")}),$scope.$watch("project",function(project){return null!=project.videoconferences?$scope.isVideoconferenceActivated=!0:$scope.isVideoconferenceActivated=!1})},{link:link}},module.directive("tgProjectModules",["$tgRepo","$tgConfirm","$tgLoading","tgProjectService",ProjectModulesDirective]),ProjectExportDirective=function($window,$rs,$confirm,$translate){var link;return link=function($scope,$el,$attrs){var asyn_message,buttonsEl,dump_ready_text,hideButtons,hideResult,hideSpinner,loading_msg,loading_title,resultEl,resultMessageEl,resultTitleEl,setAsyncMessage,setAsyncTitle,setLoadingMessage,setLoadingTitle,setSyncMessage,setSyncTitle,showButtons,showErrorMode,showExportResultAsyncMode,showExportResultSyncMode,showLoadingMode,showResult,showSpinner,spinnerEl,syn_message;return buttonsEl=$el.find(".admin-project-export-buttons"),showButtons=function(){return buttonsEl.removeClass("hidden")},hideButtons=function(){return buttonsEl.addClass("hidden")},resultEl=$el.find(".admin-project-export-result"),showResult=function(){return resultEl.removeClass("hidden")},hideResult=function(){return resultEl.addClass("hidden")},spinnerEl=$el.find(".spin"),showSpinner=function(){return spinnerEl.removeClass("hidden")},hideSpinner=function(){return spinnerEl.addClass("hidden")},resultTitleEl=$el.find(".result-title"),loading_title=$translate.instant("ADMIN.PROJECT_EXPORT.LOADING_TITLE"),loading_msg=$translate.instant("ADMIN.PROJECT_EXPORT.LOADING_MESSAGE"),dump_ready_text=function(){return resultTitleEl.html($translate.instant("ADMIN.PROJECT_EXPORT.DUMP_READY"))},asyn_message=function(){return resultTitleEl.html($translate.instant("ADMIN.PROJECT_EXPORT.ASYNC_MESSAGE"))},syn_message=function(url){return resultTitleEl.html($translate.instant("ADMIN.PROJECT_EXPORT.SYNC_MESSAGE",{url:url}))},setLoadingTitle=function(){return resultTitleEl.html(loading_title)},setAsyncTitle=function(){return resultTitleEl.html(loading_msg)},setSyncTitle=function(){return resultTitleEl.html(dump_ready_text)},resultMessageEl=$el.find(".result-message "),setLoadingMessage=function(){return resultMessageEl.html(loading_msg)},setAsyncMessage=function(){return resultMessageEl.html(asyn_message)},setSyncMessage=function(url){return resultMessageEl.html(syn_message(url))},showLoadingMode=function(){return showSpinner(),setLoadingTitle(),setLoadingMessage(),hideButtons(),showResult()},showExportResultAsyncMode=function(){return hideSpinner(),setAsyncTitle(),setAsyncMessage()},showExportResultSyncMode=function(url){return hideSpinner(),setSyncTitle(),setSyncMessage(url)},showErrorMode=function(){return hideSpinner(),hideResult(),showButtons()},$el.on("click","a.button-export",debounce(2e3,function(_this){return function(event){var onError,onSuccess;return event.preventDefault(),onSuccess=function(result){var dumpUrl;return 202===result.status?showExportResultAsyncMode():(dumpUrl=result.data.url,showExportResultSyncMode(dumpUrl),$window.open(dumpUrl,"_blank"))},onError=function(result){var errorMsg,ref;return showErrorMode(),errorMsg=$translate.instant("ADMIN.PROJECT_EXPORT.ERROR"),429===result.status?errorMsg=$translate.instant("ADMIN.PROJECT_EXPORT.ERROR_BUSY"):(null!=(ref=result.data)?ref._error_message:void 0)&&(errorMsg=$translate.instant("ADMIN.PROJECT_EXPORT.ERROR_BUSY",{message:result.data._error_message})),$confirm.notify("error",errorMsg)},showLoadingMode(),$rs.projects["export"]($scope.projectId).then(onSuccess,onError)}}(this)))},{link:link}},module.directive("tgProjectExport",["$window","$tgResources","$tgConfirm","$translate",ProjectExportDirective]),CsvExporterController=function(superClass){function CsvExporterController(scope,rootscope,urls,confirm,rs,translate){this.scope=scope,this.rootscope=rootscope,this.urls=urls,this.confirm=confirm, +this.rs=rs,this.translate=translate,this._generateUuid=bind(this._generateUuid,this),this.setCsvUuid=bind(this.setCsvUuid,this),this.rootscope.$on("project:loaded",this.setCsvUuid),this.scope.$watch("csvUuid",function(_this){return function(value){return value?_this.scope.csvUrl=_this.urls.resolveAbsolute(_this.type+"-csv",value):_this.scope.csvUrl=""}}(this))}return extend(CsvExporterController,superClass),CsvExporterController.$inject=["$scope","$rootScope","$tgUrls","$tgConfirm","$tgResources","$translate"],CsvExporterController.prototype.setCsvUuid=function(){return this.scope.csvUuid=this.scope.project[this.type+"_csv_uuid"]},CsvExporterController.prototype._generateUuid=function(response){var promise;return null==response&&(response=null),promise=this.rs.projects["regenerate_"+this.type+"_csv_uuid"](this.scope.projectId),promise.then(function(_this){return function(data){var ref;return _this.scope.csvUuid=null!=(ref=data.data)?ref.uuid:void 0}}(this)),promise.then(null,function(_this){return function(){return _this.confirm.notify("error")}}(this)),promise["finally"](function(){return response?response.finish():void 0}),promise},CsvExporterController.prototype.regenerateUuid=function(){var subtitle,title;return this.scope.csvUuid?(title=this.translate.instant("ADMIN.REPORTS.REGENERATE_TITLE"),subtitle=this.translate.instant("ADMIN.REPORTS.REGENERATE_SUBTITLE"),this.confirm.ask(title,subtitle).then(this._generateUuid)):this._generateUuid()},CsvExporterController}(taiga.Controller),CsvExporterUserstoriesController=function(superClass){function CsvExporterUserstoriesController(){return CsvExporterUserstoriesController.__super__.constructor.apply(this,arguments)}return extend(CsvExporterUserstoriesController,superClass),CsvExporterUserstoriesController.prototype.type="userstories",CsvExporterUserstoriesController}(CsvExporterController),CsvExporterTasksController=function(superClass){function CsvExporterTasksController(){return CsvExporterTasksController.__super__.constructor.apply(this,arguments)}return extend(CsvExporterTasksController,superClass),CsvExporterTasksController.prototype.type="tasks",CsvExporterTasksController}(CsvExporterController),CsvExporterIssuesController=function(superClass){function CsvExporterIssuesController(){return CsvExporterIssuesController.__super__.constructor.apply(this,arguments)}return extend(CsvExporterIssuesController,superClass),CsvExporterIssuesController.prototype.type="issues",CsvExporterIssuesController}(CsvExporterController),module.controller("CsvExporterUserstoriesController",CsvExporterUserstoriesController),module.controller("CsvExporterTasksController",CsvExporterTasksController),module.controller("CsvExporterIssuesController",CsvExporterIssuesController),CsvUsDirective=function($translate){var link;return link=function($scope){return $scope.sectionTitle="ADMIN.CSV.SECTION_TITLE_US"},{controller:"CsvExporterUserstoriesController",controllerAs:"ctrl",templateUrl:"admin/project-csv.html",link:link,scope:!0}},module.directive("tgCsvUs",["$translate",CsvUsDirective]),CsvTaskDirective=function($translate){var link;return link=function($scope){return $scope.sectionTitle="ADMIN.CSV.SECTION_TITLE_TASK"},{controller:"CsvExporterTasksController",controllerAs:"ctrl",templateUrl:"admin/project-csv.html",link:link,scope:!0}},module.directive("tgCsvTask",["$translate",CsvTaskDirective]),CsvIssueDirective=function($translate){var link;return link=function($scope){return $scope.sectionTitle="ADMIN.CSV.SECTION_TITLE_ISSUE"},{controller:"CsvExporterIssuesController",controllerAs:"ctrl",templateUrl:"admin/project-csv.html",link:link,scope:!0}},module.directive("tgCsvIssue",["$translate",CsvIssueDirective]),ProjectLogoDirective=function($auth,$model,$rs,$confirm){var link;return link=function($scope,$el,$attrs){var onError,onSuccess,showSizeInfo;return showSizeInfo=function(){return $el.find(".size-info").addClass("active")},onSuccess=function(response){var project;return project=$model.make_model("projects",response.data),$scope.project=project,$el.find(".loading-overlay").removeClass("active"),$confirm.notify("success")},onError=function(response){return 413===response.status&&showSizeInfo(),$el.find(".loading-overlay").removeClass("active"),$confirm.notify("error",response.data._error_message)},$el.on("click",".js-change-logo",function(){return $el.find("#logo-field").click()}),$el.on("change","#logo-field",function(event){return $scope.logoAttachment?($el.find(".loading-overlay").addClass("active"),$rs.projects.changeLogo($scope.project.id,$scope.logoAttachment).then(onSuccess,onError)):void 0}),$el.on("click","a.js-use-default-logo",function(event){return $el.find(".loading-overlay").addClass("active"),$rs.projects.removeLogo($scope.project.id).then(onSuccess,onError)}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgProjectLogo",["$tgAuth","$tgModel","$tgResources","$tgConfirm",ProjectLogoDirective]),ProjectLogoModelDirective=function($parse){var link;return link=function($scope,$el,$attrs){var model,modelSetter;return model=$parse($attrs.tgProjectLogoModel),modelSetter=model.assign,$el.bind("change",function(){return $scope.$apply(function(){return modelSetter($scope,$el[0].files[0])})})},{link:link}},module.directive("tgProjectLogoModel",["$parse",ProjectLogoModelDirective])}.call(this),function(){var ColorSelectionDirective,DATE_TYPE,MULTILINE_TYPE,ProjectCustomAttributesController,ProjectCustomAttributesDirective,ProjectValuesController,ProjectValuesDirective,ProjectValuesSectionController,TEXT_TYPE,TYPE_CHOICES,bindOnce,debounce,groupBy,joinStr,mixOf,module,taiga,toString,trim,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty,bind=function(fn,me){return function(){return fn.apply(me,arguments)}};taiga=this.taiga,mixOf=this.taiga.mixOf,trim=this.taiga.trim,toString=this.taiga.toString,joinStr=this.taiga.joinStr,groupBy=this.taiga.groupBy,bindOnce=this.taiga.bindOnce,debounce=this.taiga.debounce,module=angular.module("taigaAdmin"),ProjectValuesSectionController=function(superClass){function ProjectValuesSectionController(scope,rootscope,repo,confirm,rs,params,q,location,navUrls,appMetaService,translate){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.navUrls=navUrls,this.appMetaService=appMetaService,this.translate=translate,this.scope.project={},promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,sectionName,title;return sectionName=_this.translate.instant(_this.scope.sectionName),title=_this.translate.instant("ADMIN.PROJECT_VALUES.PAGE_TITLE",{sectionName:sectionName,projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this))}return extend(ProjectValuesSectionController,superClass),ProjectValuesSectionController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","tgAppMetaService","$translate"],ProjectValuesSectionController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return project.i_am_owner||_this.location.path(_this.navUrls.resolve("permission-denied")),_this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),project}}(this))},ProjectValuesSectionController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject()},ProjectValuesSectionController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("ProjectValuesSectionController",ProjectValuesSectionController),ProjectValuesController=function(superClass){function ProjectValuesController(scope,rootscope,repo,confirm,rs){this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.moveValue=bind(this.moveValue,this),this.loadValues=bind(this.loadValues,this),this.scope.$on("admin:project-values:move",this.moveValue),this.rootscope.$on("project:loaded",this.loadValues)}return extend(ProjectValuesController,superClass),ProjectValuesController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources"],ProjectValuesController.prototype.loadValues=function(){return this.rs[this.scope.resource].listValues(this.scope.projectId,this.scope.type).then(function(_this){return function(values){return _this.scope.values=values,_this.scope.maxValueOrder=_.max(values,"order").order,values}}(this))},ProjectValuesController.prototype.moveValue=function(ctx,itemValue,itemIndex){var r,values;return values=this.scope.values,r=values.indexOf(itemValue),values.splice(r,1),values.splice(itemIndex,0,itemValue),_.each(values,function(value,index){return value.order=index}),this.repo.saveAll(values)},ProjectValuesController}(taiga.Controller),module.controller("ProjectValuesController",ProjectValuesController),ProjectValuesDirective=function($log,$repo,$confirm,$location,animationFrame,$translate,$rootscope){var link,linkDragAndDrop,linkValue;return linkDragAndDrop=function($scope,$el,$attrs){var itemEl,newParentScope,oldParentScope,tdom;return oldParentScope=null,newParentScope=null,itemEl=null,tdom=$el.find(".sortable"),tdom.sortable({handle:".row.table-main.visualization",dropOnEmpty:!0,connectWith:".project-values-body",revert:400,axis:"y"}),tdom.on("sortstop",function(event,ui){var itemIndex,itemValue;return itemEl=ui.item,itemValue=itemEl.scope().value,itemIndex=itemEl.index(),$scope.$broadcast("admin:project-values:move",itemValue,itemIndex)}),$scope.$on("$destroy",function(){return $el.off()})},linkValue=function($scope,$el,$attrs){var $ctrl,cancel,goToBottomList,initializeNewValue,initializeTextTranslations,objName,saveNewValue,saveValue,valueType;return $ctrl=$el.controller(),valueType=$attrs.type,objName=$attrs.objname,initializeNewValue=function(){return $scope.newValue={name:"",is_closed:!1,is_archived:!1}},initializeTextTranslations=function(){return $scope.addNewElementText=$translate.instant("ADMIN.PROJECT_VALUES_"+objName.toUpperCase()+".ACTION_ADD")},initializeNewValue(),initializeTextTranslations(),$rootscope.$on("$translateChangeEnd",function(){return $scope.$evalAsync(initializeTextTranslations)}),goToBottomList=function(_this){return function(focus){var table;return null==focus&&(focus=!1),table=$el.find(".table-main"),$(document.body).scrollTop(table.offset().top+table.height()),focus?$el.find(".new-value input:visible").first().focus():void 0}}(this),saveValue=function(target){var form,formEl,promise,value;return formEl=target.parents("form"),form=formEl.checksley(),form.validate()?(value=formEl.scope().value,promise=$repo.save(value),promise.then(function(_this){return function(){var row;return row=target.parents(".row.table-main"),row.addClass("hidden"),row.siblings(".visualization").removeClass("hidden")}}(this)),promise.then(null,function(data){return form.setErrors(data)})):void 0},saveNewValue=function(target){var form,formEl,promise;return formEl=target.parents("form"),form=formEl.checksley(),form.validate()?($scope.newValue.project=$scope.project.id,$scope.newValue.order=$scope.maxValueOrder?$scope.maxValueOrder+1:1,promise=$repo.create(valueType,$scope.newValue),promise.then(function(_this){return function(data){return target.addClass("hidden"),$scope.values.push(data),$scope.maxValueOrder=data.order,initializeNewValue()}}(this)),promise.then(null,function(data){return form.setErrors(data)})):void 0},cancel=function(target){var formEl,row,value;return row=target.parents(".row.table-main"),formEl=target.parents("form"),value=formEl.scope().value,$scope.$apply(function(){return row.addClass("hidden"),value.revert(),row.siblings(".visualization").removeClass("hidden")})},$el.on("click",".show-add-new",function(event){return event.preventDefault(),$el.find(".new-value").removeClass("hidden"),goToBottomList(!0)}),$el.on("click",".add-new",debounce(2e3,function(event){var target;return event.preventDefault(),target=$el.find(".new-value"),saveNewValue(target)})),$el.on("click",".delete-new",function(event){return event.preventDefault(),$el.find(".new-value").addClass("hidden"),initializeNewValue()}),$el.on("click",".edit-value",function(event){var editionRow,row,target;return event.preventDefault(),target=angular.element(event.currentTarget),row=target.parents(".row.table-main"),row.addClass("hidden"),editionRow=row.siblings(".edition"),editionRow.removeClass("hidden"),editionRow.find("input:visible").first().focus().select()}),$el.on("keyup",".edition input",function(event){var target;return 13===event.keyCode?(target=angular.element(event.currentTarget),saveValue(target)):27===event.keyCode?(target=angular.element(event.currentTarget),cancel(target)):void 0}),$el.on("keyup",".new-value input",function(event){var target;return 13===event.keyCode?(target=$el.find(".new-value"),saveNewValue(target)):27===event.keyCode?($el.find(".new-value").addClass("hidden"),initializeNewValue()):void 0}),$el.on("click",".save",function(event){var target;return event.preventDefault(),target=angular.element(event.currentTarget),saveValue(target)}),$el.on("click",".cancel",function(event){var target;return event.preventDefault(),target=angular.element(event.currentTarget),cancel(target)}),$el.on("click",".delete-value",function(event){var choices,formEl,subtitle,target,text,title,value;return event.preventDefault(),target=angular.element(event.currentTarget),formEl=target.parents("form"),value=formEl.scope().value,choices={},_.each($scope.values,function(option){return value.id!==option.id?choices[option.id]=option.name:void 0}),subtitle=value.name,0===_.keys(choices).length?$confirm.error($translate.instant("ADMIN.PROJECT_VALUES.ERROR_DELETE_ALL")):(title=$translate.instant("ADMIN.COMMON.TITLE_ACTION_DELETE_VALUE"),text=$translate.instant("ADMIN.PROJECT_VALUES.REPLACEMENT"),$confirm.askChoice(title,subtitle,choices,text).then(function(response){var onError,onSucces;return onSucces=function(){return $ctrl.loadValues()["finally"](function(){return response.finish()})},onError=function(){return $confirm.notify("error")},$repo.remove(value,{moveTo:response.selected}).then(onSucces,onError)}))})},link=function($scope,$el,$attrs){return linkDragAndDrop($scope,$el,$attrs),linkValue($scope,$el,$attrs),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgProjectValues",["$log","$tgRepo","$tgConfirm","$tgLocation","animationFrame","$translate","$rootScope",ProjectValuesDirective]),ColorSelectionDirective=function(){var link;return link=function($scope,$el,$attrs,$model){var $ctrl;return $ctrl=$el.controller(),$scope.$watch($attrs.ngModel,function(element){return $scope.color=element.color}),$el.on("click",".current-color",function(event){var body,target;return event.preventDefault(),event.stopPropagation(),target=angular.element(event.currentTarget),$el.find(".select-color").hide(),target.siblings(".select-color").show(),body=angular.element("body"),body.on("click",function(_this){return function(event){return 0===angular.element(event.target).parent(".select-color").length?($el.find(".select-color").hide(),body.unbind("click")):void 0}}(this))}),$el.on("click",".select-color .color",function(event){var target;return event.preventDefault(),target=angular.element(event.currentTarget),$scope.$apply(function(){return $model.$modelValue.color=target.data("color")}),$el.find(".select-color").hide()}),$el.on("click",".select-color .selected-color",function(event){return event.preventDefault(),$scope.$apply(function(){return $model.$modelValue.color=$scope.color}),$el.find(".select-color").hide()}),$scope.$on("$destroy",function(){return $el.off()})},{link:link,require:"ngModel"}},module.directive("tgColorSelection",ColorSelectionDirective),TEXT_TYPE="text",MULTILINE_TYPE="multiline",DATE_TYPE="date",TYPE_CHOICES=[{key:TEXT_TYPE,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT"},{key:MULTILINE_TYPE,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI"},{key:DATE_TYPE,name:"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE"}],ProjectCustomAttributesController=function(superClass){function ProjectCustomAttributesController(scope,rootscope,repo,rs,params,q,location,navUrls,appMetaService,translate){this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.rs=rs,this.params=params,this.q=q,this.location=location,this.navUrls=navUrls,this.appMetaService=appMetaService,this.translate=translate,this.moveCustomAttributes=bind(this.moveCustomAttributes,this),this.deleteCustomAttribute=bind(this.deleteCustomAttribute,this),this.saveCustomAttribute=bind(this.saveCustomAttribute,this),this.createCustomAttribute=bind(this.createCustomAttribute,this),this.loadCustomAttributes=bind(this.loadCustomAttributes,this),this.scope.TYPE_CHOICES=TYPE_CHOICES,this.scope.project={},this.rootscope.$on("project:loaded",function(_this){return function(){var description,sectionName,title;return _this.loadCustomAttributes(),sectionName=_this.translate.instant(_this.scope.sectionName),title=_this.translate.instant("ADMIN.CUSTOM_ATTRIBUTES.PAGE_TITLE",{sectionName:sectionName,projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this))}return extend(ProjectCustomAttributesController,superClass),ProjectCustomAttributesController.$inject=["$scope","$rootScope","$tgRepo","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","tgAppMetaService","$translate"],ProjectCustomAttributesController.prototype.loadCustomAttributes=function(){return this.rs.customAttributes[this.scope.type].list(this.scope.projectId).then(function(_this){return function(customAttributes){return _this.scope.customAttributes=customAttributes,_this.scope.maxOrder=_.max(customAttributes,"order").order,customAttributes}}(this))},ProjectCustomAttributesController.prototype.createCustomAttribute=function(attrValues){return this.repo.create("custom-attributes/"+this.scope.type,attrValues)},ProjectCustomAttributesController.prototype.saveCustomAttribute=function(attrModel){return this.repo.save(attrModel)},ProjectCustomAttributesController.prototype.deleteCustomAttribute=function(attrModel){return this.repo.remove(attrModel)},ProjectCustomAttributesController.prototype.moveCustomAttributes=function(attrModel,newIndex){var customAttributes,r;return customAttributes=this.scope.customAttributes,r=customAttributes.indexOf(attrModel),customAttributes.splice(r,1),customAttributes.splice(newIndex,0,attrModel),_.each(customAttributes,function(val,idx){return val.order=idx}),this.repo.saveAll(customAttributes)},ProjectCustomAttributesController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("ProjectCustomAttributesController",ProjectCustomAttributesController),ProjectCustomAttributesDirective=function($log,$confirm,animationFrame,$translate){var link;return link=function($scope,$el,$attrs){var $ctrl,cancelCreate,cancelUpdate,create,deleteCustomAttribute,hideAddButton,hideCancelButton,hideCreateForm,hideEditForm,resetNewAttr,revertChangesInCustomAttribute,showAddButton,showCancelButton,showCreateForm,showEditForm,sortableEl,update;return $ctrl=$el.controller(),$scope.$on("$destroy",function(){return $el.off()}),sortableEl=$el.find(".js-sortable"),sortableEl.sortable({handle:".js-view-custom-field",dropOnEmpty:!0,revert:400,axis:"y"}),sortableEl.on("sortstop",function(event,ui){var itemAttr,itemEl,itemIndex;return itemEl=ui.item,itemAttr=itemEl.scope().attr,itemIndex=itemEl.index(),$ctrl.moveCustomAttributes(itemAttr,itemIndex)}),showCreateForm=function(){return $el.find(".js-new-custom-field").removeClass("hidden"),$el.find(".js-new-custom-field input:visible").first().focus()},hideCreateForm=function(){return $el.find(".js-new-custom-field").addClass("hidden")},showAddButton=function(){return $el.find(".js-add-custom-field-button").removeClass("hidden")},hideAddButton=function(){return $el.find(".js-add-custom-field-button").addClass("hidden")},showCancelButton=function(){return $el.find(".js-cancel-new-custom-field-button").removeClass("hidden")},hideCancelButton=function(){return $el.find(".js-cancel-new-custom-field-button").addClass("hidden")},resetNewAttr=function(){return $scope.newAttr={}},create=function(formEl){var attr,form,onError,onSucces;return form=formEl.checksley(),form.validate()?(onSucces=function(_this){return function(){return $ctrl.loadCustomAttributes(),hideCreateForm(),resetNewAttr(),$confirm.notify("success")}}(this),onError=function(_this){return function(data){return form.setErrors(data)}}(this),attr=$scope.newAttr,attr.project=$scope.projectId,attr.order=$scope.maxOrder?$scope.maxOrder+1:1,$ctrl.createCustomAttribute(attr).then(onSucces,onError)):void 0},cancelCreate=function(){return hideCreateForm(),resetNewAttr()},$scope.$watch("customAttributes",function(customAttributes){return customAttributes?0===customAttributes.length?(hideCancelButton(),hideAddButton(),showCreateForm()):(hideCreateForm(),showAddButton(),showCancelButton()):void 0}),$el.on("click",".js-add-custom-field-button",function(event){return event.preventDefault(),showCreateForm()}),$el.on("click",".js-create-custom-field-button",debounce(2e3,function(event){var formEl,target;return event.preventDefault(),target=angular.element(event.currentTarget),formEl=target.closest("form"),create(formEl)})),$el.on("click",".js-cancel-new-custom-field-button",function(event){return event.preventDefault(),cancelCreate()}),$el.on("keyup",".js-new-custom-field input",function(event){var formEl,target;return 13===event.keyCode?(target=angular.element(event.currentTarget),formEl=target.closest("form"),create(formEl)):27===event.keyCode?cancelCreate():void 0}),showEditForm=function(formEl){return formEl.find(".js-view-custom-field").addClass("hidden"),formEl.find(".js-edit-custom-field").removeClass("hidden"),formEl.find(".js-edit-custom-field input:visible").first().focus().select()},hideEditForm=function(formEl){return formEl.find(".js-edit-custom-field").addClass("hidden"),formEl.find(".js-view-custom-field").removeClass("hidden")},revertChangesInCustomAttribute=function(formEl){return $scope.$apply(function(){return formEl.scope().attr.revert()})},update=function(formEl){var attr,form,onError,onSucces;return form=formEl.checksley(),form.validate()?(onSucces=function(_this){return function(){return $ctrl.loadCustomAttributes(),hideEditForm(formEl),$confirm.notify("success")}}(this),onError=function(_this){return function(data){return form.setErrors(data)}}(this),attr=formEl.scope().attr,$ctrl.saveCustomAttribute(attr).then(onSucces,onError)):void 0},cancelUpdate=function(formEl){return hideEditForm(formEl),revertChangesInCustomAttribute(formEl)},$el.on("click",".js-edit-custom-field-button",function(event){var formEl,target;return event.preventDefault(),target=angular.element(event.currentTarget),formEl=target.closest("form"),showEditForm(formEl)}),$el.on("click",".js-update-custom-field-button",debounce(2e3,function(event){var formEl,target;return event.preventDefault(),target=angular.element(event.currentTarget),formEl=target.closest("form"),update(formEl)})),$el.on("click",".js-cancel-edit-custom-field-button",function(event){var formEl,target;return event.preventDefault(),target=angular.element(event.currentTarget),formEl=target.closest("form"),cancelUpdate(formEl)}),$el.on("keyup",".js-edit-custom-field input",function(event){var formEl,target;return 13===event.keyCode?(target=angular.element(event.currentTarget),formEl=target.closest("form"),update(formEl)):27===event.keyCode?(target=angular.element(event.currentTarget),formEl=target.closest("form"),cancelUpdate(formEl)):void 0}),deleteCustomAttribute=function(formEl){var attr,message,text,title;return attr=formEl.scope().attr,message=attr.name,title=$translate.instant("COMMON.CUSTOM_ATTRIBUTES.DELETE"),text=$translate.instant("COMMON.CUSTOM_ATTRIBUTES.CONFIRM_DELETE"),$confirm.ask(title,text,message).then(function(response){var onError,onSucces;return onSucces=function(){return $ctrl.loadCustomAttributes()["finally"](function(){return response.finish()})},onError=function(){return $confirm.notify("error",null,"We have not been able to delete '"+message+"'.")},$ctrl.deleteCustomAttribute(attr).then(onSucces,onError)})},$el.on("click",".js-delete-custom-field-button",debounce(2e3,function(event){var formEl,target;return event.preventDefault(),target=angular.element(event.currentTarget),formEl=target.closest("form"),deleteCustomAttribute(formEl)}))},{link:link}},module.directive("tgProjectCustomAttributes",["$log","$tgConfirm","animationFrame","$translate",ProjectCustomAttributesDirective])}.call(this),function(){var EditRoleDirective,NewRoleDirective,RolePermissionsDirective,RolesController,RolesDirective,bindMethods,bindOnce,debounce,mixOf,module,taiga,bind=function(fn,me){return function(){return fn.apply(me,arguments)}},extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty,indexOf=[].indexOf||function(item){for(var i=0,l=this.length;l>i;i++)if(i in this&&this[i]===item)return i;return-1};taiga=this.taiga,mixOf=this.taiga.mixOf,bindOnce=this.taiga.bindOnce,debounce=this.taiga.debounce,bindMethods=this.taiga.bindMethods,module=angular.module("taigaAdmin"),RolesController=function(superClass){function RolesController(scope,rootscope,repo,confirm,rs,params,q,location,navUrls,appMetaService,translate){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.navUrls=navUrls,this.appMetaService=appMetaService,this.translate=translate,this._disableComputable=bind(this._disableComputable,this),this._enableComputable=bind(this._enableComputable,this),bindMethods(this),this.scope.sectionName="ADMIN.MENU.PERMISSIONS",this.scope.project={},this.scope.anyComputableRole=!0,promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,title;return title=_this.translate.instant("ADMIN.ROLES.PAGE_TITLE",{projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this))}return extend(RolesController,superClass),RolesController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","tgAppMetaService","$translate"],RolesController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return project.i_am_owner||_this.location.path(_this.navUrls.resolve("permission-denied")),_this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),_this.scope.anyComputableRole=_.some(_.map(project.roles,function(point){return point.computable})),project}}(this))},RolesController.prototype.loadRoles=function(){return this.rs.roles.list(this.scope.projectId).then(function(_this){return function(roles){var public_permission;return roles=roles.map(function(role){return role.external_user=!1,role}),public_permission={name:_this.translate.instant("ADMIN.ROLES.EXTERNAL_USER"),permissions:_this.scope.project.public_permissions,external_user:!0},roles.push(public_permission),_this.scope.roles=roles,_this.scope.role=_this.scope.roles[0],roles}}(this))},RolesController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(){return _this.loadRoles()}}(this)),promise},RolesController.prototype.setRole=function(role){return this.scope.role=role,this.scope.$broadcast("role:changed",this.scope.role)},RolesController.prototype["delete"]=function(){var choices,i,len,ref,replacement,role,subtitle,title,warning;for(choices={},ref=this.scope.roles,i=0,len=ref.length;len>i;i++)role=ref[i],role.id!==this.scope.role.id&&(choices[role.id]=role.name);return 0===_.keys(choices).length?this.confirm.error(this.translate.instant("ADMIN.ROLES.ERROR_DELETE_ALL")):(title=this.translate.instant("ADMIN.ROLES.TITLE_DELETE_ROLE"),subtitle=this.scope.role.name,replacement=this.translate.instant("ADMIN.ROLES.REPLACEMENT_ROLE"),warning=this.translate.instant("ADMIN.ROLES.WARNING_DELETE_ROLE"),this.confirm.askChoice(title,subtitle,choices,replacement,warning).then(function(_this){return function(response){var onError,onSuccess;return onSuccess=function(){return _this.loadProject(),_this.loadRoles()["finally"](function(){return response.finish()})},onError=function(){return _this.confirm.notify("error")},_this.repo.remove(_this.scope.role,{moveTo:response.selected}).then(onSuccess,onError)}}(this)))},RolesController.prototype._enableComputable=function(){var onError,onSuccess;return onSuccess=function(_this){return function(){return _this.confirm.notify("success"),_this.loadProject()}}(this),onError=function(_this){return function(){return _this.confirm.notify("error"),_this.scope.role.revert()}}(this),this.repo.save(this.scope.role).then(onSuccess,onError)},RolesController.prototype._disableComputable=function(){var askOnError,askOnSuccess,message,subtitle,title;return askOnSuccess=function(_this){return function(response){var onError,onSuccess;return onSuccess=function(){return response.finish(),_this.confirm.notify("success"),_this.loadProject()},onError=function(){return response.finish(),_this.confirm.notify("error"),_this.scope.role.revert()},_this.repo.save(_this.scope.role).then(onSuccess,onError)}}(this),askOnError=function(_this){return function(response){return _this.scope.role.revert()}}(this),title=this.translate.instant("ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_TITLE"),subtitle=this.translate.instant("ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_SUBTITLE",{roleName:this.scope.role.name}),message=this.translate.instant("ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_MESSAGE"),this.confirm.ask(title,subtitle,message).then(askOnSuccess,askOnError)},RolesController.prototype.toggleComputable=debounce(2e3,function(){return this.scope.role.computable?this._enableComputable():this._disableComputable()}),RolesController}(mixOf(taiga.Controller,taiga.PageMixin,taiga.FiltersMixin)),module.controller("RolesController",RolesController),EditRoleDirective=function($repo,$confirm){var link;return link=function($scope,$el,$attrs){var submit,toggleView;return toggleView=function(){return $el.find(".total").toggle(),$el.find(".edit-role").toggle()},submit=function(){var promise;return $scope.role.name=$el.find("input").val(),promise=$repo.save($scope.role),promise.then(function(){return $confirm.notify("success")}),promise.then(null,function(data){return $confirm.notify("error")}),toggleView()},$el.on("click","a.icon-edit",function(){return toggleView(),$el.find("input").focus(),$el.find("input").val($scope.role.name)}),$el.on("click","a.save",submit),$el.on("keyup","input",function(event){return 13===event.keyCode?submit():27===event.keyCode?toggleView():void 0}),$scope.$on("role:changed",function(){return $el.find(".edit-role").is(":visible")?toggleView():void 0}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgEditRole",["$tgRepo","$tgConfirm",EditRoleDirective]),RolesDirective=function(){var link;return link=function($scope,$el,$attrs){var $ctrl;return $ctrl=$el.controller(),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgRoles",RolesDirective),NewRoleDirective=function($tgrepo,$confirm){ +var DEFAULT_PERMISSIONS,link;return DEFAULT_PERMISSIONS=["view_project","view_milestones","view_us","view_tasks","view_issues"],link=function($scope,$el,$attrs){var $ctrl;return $ctrl=$el.controller(),$scope.$on("$destroy",function(){return $el.off()}),$el.on("click","a.add-button",function(event){return event.preventDefault(),$el.find(".new").removeClass("hidden"),$el.find(".new").focus(),$el.find(".add-button").hide()}),$el.on("keyup",".new",function(event){var newRole,onError,onSuccess,target;return event.preventDefault(),13===event.keyCode?(target=angular.element(event.currentTarget),newRole={project:$scope.projectId,name:target.val(),permissions:DEFAULT_PERMISSIONS,order:_.max($scope.roles,function(r){return r.order}).order+1,computable:!1},$el.find(".new").addClass("hidden"),$el.find(".new").val(""),onSuccess=function(role){var insertPosition;return insertPosition=$scope.roles.length-1,$scope.roles.splice(insertPosition,0,role),$ctrl.setRole(role),$el.find(".add-button").show(),$ctrl.loadProject()},onError=function(){return $confirm.notify("error")},$tgrepo.create("roles",newRole).then(onSuccess,onError)):27===event.keyCode?(target=angular.element(event.currentTarget),$el.find(".new").addClass("hidden"),$el.find(".new").val(""),$el.find(".add-button").show()):void 0})},{link:link}},module.directive("tgNewRole",["$tgRepo","$tgConfirm",NewRoleDirective]),RolePermissionsDirective=function($rootscope,$repo,$confirm,$compile){var baseTemplate,categoryTemplate,link,resumeTemplate;return resumeTemplate=_.template('
\n
\n
<%- category.activePermissions %>/<%- category.permissions.length %>
\n <% _.each(category.permissions, function(permission) { %>\n
\n <% }) %>\n
\n
'),categoryTemplate=_.template('
\n
\n
\n
\n
\n <% _.each(category.permissions, function(permission) { %>\n
\n \n
\n disabled="disabled" <% } %>\n <% if(permission.active) { %> checked="checked" <% } %>/>\n
\n \n \n
\n
\n <% }) %>\n
\n
\n
'),baseTemplate=_.template('
'),link=function($scope,$el,$attrs){var $ctrl,generateCategoriesFromRole,renderCategory,renderPermissions,renderResume;return $ctrl=$el.controller(),generateCategoriesFromRole=function(role){var categories,isPermissionEditable,issuePermissions,milestonePermissions,setActivePermissions,setActivePermissionsPerCategory,taskPermissions,userStoryPermissions,wikiPermissions;return setActivePermissions=function(permissions){return _.map(permissions,function(x){var ref;return _.extend({},x,{active:(ref=x.key,indexOf.call(role.permissions,ref)>=0)})})},isPermissionEditable=function(permission,role,project){return role.external_user&&!project.is_private&&0===permission.key.indexOf("view_")?!1:!0},setActivePermissionsPerCategory=function(category){return _.map(category,function(cat){return cat.permissions=cat.permissions.map(function(permission){return permission.editable=isPermissionEditable(permission,role,$scope.project),permission}),_.extend({},cat,{activePermissions:_.filter(cat.permissions,"active").length})})},categories=[],milestonePermissions=[{key:"view_milestones",name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.VIEW_SPRINTS"},{key:"add_milestone",name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.ADD_SPRINTS"},{key:"modify_milestone",name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.MODIFY_SPRINTS"},{key:"delete_milestone",name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.DELETE_SPRINTS"}],categories.push({name:"COMMON.PERMISIONS_CATEGORIES.SPRINTS.NAME",permissions:setActivePermissions(milestonePermissions)}),userStoryPermissions=[{key:"view_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.VIEW_USER_STORIES"},{key:"add_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.ADD_USER_STORIES"},{key:"modify_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.MODIFY_USER_STORIES"},{key:"delete_us",name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.DELETE_USER_STORIES"}],categories.push({name:"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.NAME",permissions:setActivePermissions(userStoryPermissions)}),taskPermissions=[{key:"view_tasks",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.VIEW_TASKS"},{key:"add_task",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.ADD_TASKS"},{key:"modify_task",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.MODIFY_TASKS"},{key:"delete_task",name:"COMMON.PERMISIONS_CATEGORIES.TASKS.DELETE_TASKS"}],categories.push({name:"COMMON.PERMISIONS_CATEGORIES.TASKS.NAME",permissions:setActivePermissions(taskPermissions)}),issuePermissions=[{key:"view_issues",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.VIEW_ISSUES"},{key:"add_issue",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.ADD_ISSUES"},{key:"modify_issue",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.MODIFY_ISSUES"},{key:"delete_issue",name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.DELETE_ISSUES"}],categories.push({name:"COMMON.PERMISIONS_CATEGORIES.ISSUES.NAME",permissions:setActivePermissions(issuePermissions)}),wikiPermissions=[{key:"view_wiki_pages",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_PAGES"},{key:"add_wiki_page",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_PAGES"},{key:"modify_wiki_page",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.MODIFY_WIKI_PAGES"},{key:"delete_wiki_page",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_PAGES"},{key:"view_wiki_links",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_LINKS"},{key:"add_wiki_link",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_LINKS"},{key:"delete_wiki_link",name:"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_LINKS"}],categories.push({name:"COMMON.PERMISIONS_CATEGORIES.WIKI.NAME",permissions:setActivePermissions(wikiPermissions)}),setActivePermissionsPerCategory(categories)},renderResume=function(element,category){return element.find(".resume").html($compile(resumeTemplate({category:category}))($scope))},renderCategory=function(category,index){var html;return html=categoryTemplate({category:category,index:index}),html=angular.element(html),renderResume(html,category),$compile(html)($scope)},renderPermissions=function(){var html;return $el.off(),html=baseTemplate(),_.each(generateCategoriesFromRole($scope.role),function(category,index){return html=angular.element(html).append(renderCategory(category,index))}),$el.html(html),$el.on("click",".resume",function(event){var target;return event.preventDefault(),target=angular.element(event.currentTarget),target.next().toggleClass("open")}),$el.on("change",".category-item input",function(event){var getActivePermissions,onError,onSuccess,target;return getActivePermissions=function(){var activePermissions;return activePermissions=_.filter($el.find(".category-item input"),function(t){return angular.element(t).is(":checked")}),activePermissions=_.sortBy(_.map(activePermissions,function(t){var permission;return permission=angular.element(t).parents(".category-item").data("id")})),activePermissions.length&&activePermissions.push("view_project"),activePermissions},target=angular.element(event.currentTarget),$scope.role.permissions=getActivePermissions(),onSuccess=function(){var categories,categoryId;return categories=generateCategoriesFromRole($scope.role),categoryId=target.parents(".category-config").data("id"),renderResume(target.parents(".category-config"),categories[categoryId]),$rootscope.$broadcast("projects:reload"),$confirm.notify("success"),$ctrl.loadProject()},onError=function(){return $confirm.notify("error"),target.prop("checked",!target.prop("checked")),$scope.role.permissions=getActivePermissions()},$scope.role.external_user?($scope.project.public_permissions=$scope.role.permissions,$scope.project.anon_permissions=$scope.role.permissions.filter(function(permission){return 0===permission.indexOf("view_")}),$repo.save($scope.project).then(onSuccess,onError)):$repo.save($scope.role).then(onSuccess,onError)})},$scope.$on("$destroy",function(){return $el.off()}),$scope.$on("role:changed",function(){return renderPermissions()}),bindOnce($scope,$attrs.ngModel,renderPermissions)},{link:link}},module.directive("tgRolePermissions",["$rootScope","$tgRepo","$tgConfirm","$compile",RolePermissionsDirective])}.call(this),function(){var BitbucketController,BitbucketWebhooksDirective,GithubController,GithubWebhooksDirective,GitlabController,GitlabWebhooksDirective,NewWebhookDirective,SelectInputText,ValidOriginIpsDirective,WebhookDirective,WebhooksController,bindMethods,debounce,mixOf,module,taiga,timeout,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,bindMethods=this.taiga.bindMethods,debounce=this.taiga.debounce,timeout=this.taiga.timeout,module=angular.module("taigaAdmin"),WebhooksController=function(superClass){function WebhooksController(scope,repo,rs,params,location,navUrls,appMetaService,translate){var promise;this.scope=scope,this.repo=repo,this.rs=rs,this.params=params,this.location=location,this.navUrls=navUrls,this.appMetaService=appMetaService,this.translate=translate,bindMethods(this),this.scope.sectionName="ADMIN.WEBHOOKS.SECTION_NAME",this.scope.project={},promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,title;return title=_this.translate.instant("ADMIN.WEBHOOKS.PAGE_TITLE",{projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this)),this.scope.$on("webhooks:reload",this.loadWebhooks)}return extend(WebhooksController,superClass),WebhooksController.$inject=["$scope","$tgRepo","$tgResources","$routeParams","$tgLocation","$tgNavUrls","tgAppMetaService","$translate"],WebhooksController.prototype.loadWebhooks=function(){return this.rs.webhooks.list(this.scope.projectId).then(function(_this){return function(webhooks){return _this.scope.webhooks=webhooks}}(this))},WebhooksController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return project.i_am_owner||_this.location.path(_this.navUrls.resolve("permission-denied")),_this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),project}}(this))},WebhooksController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(){return _this.loadWebhooks()}}(this)),promise},WebhooksController}(mixOf(taiga.Controller,taiga.PageMixin,taiga.FiltersMixin)),module.controller("WebhooksController",WebhooksController),WebhookDirective=function($rs,$repo,$confirm,$loading,$translate){var link;return link=function($scope,$el,$attrs){var cancel,openHistory,save,showEditMode,showVisualizationMode,updateLogs,updateShowHideHistoryText,webhook;return webhook=$scope.$eval($attrs.tgWebhook),updateLogs=function(){var prettyDate;return prettyDate=$translate.instant("ADMIN.WEBHOOKS.DATE"),$rs.webhooklogs.list(webhook.id).then(function(_this){return function(webhooklogs){var i,len,log,ref;for(i=0,len=webhooklogs.length;len>i;i++)log=webhooklogs[i],log.validStatus=200<=(ref=log.status)&&300>ref,log.prettySentHeaders=_.map(_.pairs(log.request_headers),function(arg){var header,value;return header=arg[0],value=arg[1],header+": "+value}).join("\n"),log.prettySentData=JSON.stringify(log.request_data),log.prettyDate=moment(log.created).format(prettyDate);return webhook.logs_counter=webhooklogs.length,webhook.logs=webhooklogs,updateShowHideHistoryText()}}(this))},updateShowHideHistoryText=function(){var historyElement,text,textElement,title;return textElement=$el.find(".toggle-history"),historyElement=textElement.parents(".single-webhook-wrapper").find(".webhooks-history"),historyElement.hasClass("open")?(text=$translate.instant("ADMIN.WEBHOOKS.ACTION_HIDE_HISTORY"),title=$translate.instant("ADMIN.WEBHOOKS.ACTION_HIDE_HISTORY_TITLE")):(text=$translate.instant("ADMIN.WEBHOOKS.ACTION_SHOW_HISTORY"),title=$translate.instant("ADMIN.WEBHOOKS.ACTION_SHOW_HISTORY_TITLE")),textElement.text(text),textElement.prop("title",title)},showVisualizationMode=function(){return $el.find(".edition-mode").addClass("hidden"),$el.find(".visualization-mode").removeClass("hidden")},showEditMode=function(){return $el.find(".visualization-mode").addClass("hidden"),$el.find(".edition-mode").removeClass("hidden")},openHistory=function(){return $el.find(".webhooks-history").addClass("open")},cancel=function(){return showVisualizationMode(),$scope.$apply(function(){return webhook.revert()})},save=debounce(2e3,function(target){var form,promise;return form=target.parents("form").checksley(),form.validate()?(promise=$repo.save(webhook),promise.then(function(_this){return function(){return showVisualizationMode()}}(this)),promise.then(null,function(data){return $confirm.notify("error"),form.setErrors(data)})):void 0}),$el.on("click",".test-webhook",function(){return openHistory(),$rs.webhooks.test(webhook.id).then(function(_this){return function(){return updateLogs()}}(this))}),$el.on("click",".edit-webhook",function(){return showEditMode()}),$el.on("click",".cancel-existing",function(){return cancel()}),$el.on("click",".edit-existing",function(event){var target;return event.preventDefault(),target=angular.element(event.currentTarget),save(target)}),$el.on("keyup",".edition-mode input",function(event){var target;return 13===event.keyCode?(target=angular.element(event.currentTarget),save(target)):27===event.keyCode?(target=angular.element(event.currentTarget),cancel(target)):void 0}),$el.on("click",".delete-webhook",function(){var message,title;return title=$translate.instant("ADMIN.WEBHOOKS.DELETE"),message=$translate.instant("ADMIN.WEBHOOKS.WEBHOOK_NAME",{name:webhook.name}),$confirm.askOnDelete(title,message).then(function(_this){return function(askResponse){var onError,onSucces;return onSucces=function(){return askResponse.finish(),$scope.$emit("webhooks:reload")},onError=function(){return askResponse.finish(!1),$confirm.notify("error")},$repo.remove(webhook).then(onSucces,onError)}}(this))}),$el.on("click",".toggle-history",function(event){var target;return target=angular.element(event.currentTarget),null==webhook.logs||0===webhook.logs.length?updateLogs().then(function(){return timeout(0,function(){return $el.find(".webhooks-history").toggleClass("open"),updateShowHideHistoryText()})}):($el.find(".webhooks-history").toggleClass("open"),$scope.$apply(function(){return updateShowHideHistoryText()}))}),$el.on("click",".history-single",function(event){var target;return target=angular.element(event.currentTarget),target.toggleClass("history-single-open"),target.siblings(".history-single-response").toggleClass("open")}),$el.on("click",".resend-request",function(event){var log,target;return target=angular.element(event.currentTarget),log=target.data("log"),$rs.webhooklogs.resend(log).then(function(_this){return function(){return updateLogs()}}(this))})},{link:link}},module.directive("tgWebhook",["$tgResources","$tgRepo","$tgConfirm","$tgLoading","$translate",WebhookDirective]),NewWebhookDirective=function($rs,$repo,$confirm,$loading){var link;return link=function($scope,$el,$attrs){var addWebhookDOMNode,formDOMNode,initializeNewValue,save,webhook;return webhook=$scope.$eval($attrs.tgWebhook),formDOMNode=$el.find(".new-webhook-form"),addWebhookDOMNode=$el.find(".add-webhook"),initializeNewValue=function(){return $scope.newValue={name:"",url:"",key:""}},initializeNewValue(),$scope.$watch("webhooks",function(webhooks){return null!=webhooks?0===webhooks.length?(formDOMNode.removeClass("hidden"),addWebhookDOMNode.addClass("hidden"),formDOMNode.find("input")[0].focus()):(formDOMNode.addClass("hidden"),addWebhookDOMNode.removeClass("hidden")):void 0}),save=debounce(2e3,function(){var form,promise;return form=formDOMNode.checksley(),form.validate()?($scope.newValue.project=$scope.project.id,promise=$repo.create("webhooks",$scope.newValue),promise.then(function(_this){return function(){return $scope.$emit("webhooks:reload"),initializeNewValue()}}(this)),promise.then(null,function(data){return $confirm.notify("error"),form.setErrors(data)})):void 0}),formDOMNode.on("click",".add-new",function(event){return event.preventDefault(),save()}),formDOMNode.on("keyup","input",function(event){return 13===event.keyCode?save():void 0}),formDOMNode.on("click",".cancel-new",function(event){return $scope.$apply(function(){return initializeNewValue()})}),addWebhookDOMNode.on("click",function(event){return formDOMNode.removeClass("hidden"),formDOMNode.find("input")[0].focus()})},{link:link}},module.directive("tgNewWebhook",["$tgResources","$tgRepo","$tgConfirm","$tgLoading",NewWebhookDirective]),GithubController=function(superClass){function GithubController(scope,repo,rs,params,appMetaService,translate){var promise;this.scope=scope,this.repo=repo,this.rs=rs,this.params=params,this.appMetaService=appMetaService,this.translate=translate,bindMethods(this),this.scope.sectionName=this.translate.instant("ADMIN.GITHUB.SECTION_NAME"),this.scope.project={},promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,title;return title=_this.translate.instant("ADMIN.GITHUB.PAGE_TITLE",{projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this))}return extend(GithubController,superClass),GithubController.$inject=["$scope","$tgRepo","$tgResources","$routeParams","tgAppMetaService","$translate"],GithubController.prototype.loadModules=function(){return this.rs.modules.list(this.scope.projectId,"github").then(function(_this){return function(github){return _this.scope.github=github}}(this))},GithubController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return _this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),project}}(this))},GithubController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(){return _this.loadModules()}}(this)),promise},GithubController}(mixOf(taiga.Controller,taiga.PageMixin,taiga.FiltersMixin)),module.controller("GithubController",GithubController),GitlabController=function(superClass){function GitlabController(scope,repo,rs,params,appMetaService,translate){var promise;this.scope=scope,this.repo=repo,this.rs=rs,this.params=params,this.appMetaService=appMetaService,this.translate=translate,bindMethods(this),this.scope.sectionName=this.translate.instant("ADMIN.GITLAB.SECTION_NAME"),this.scope.project={},promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,title;return title=_this.translate.instant("ADMIN.GITLAB.PAGE_TITLE",{projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this)),this.scope.$on("project:modules:reload",function(_this){return function(){return _this.loadModules()}}(this))}return extend(GitlabController,superClass),GitlabController.$inject=["$scope","$tgRepo","$tgResources","$routeParams","tgAppMetaService","$translate"],GitlabController.prototype.loadModules=function(){return this.rs.modules.list(this.scope.projectId,"gitlab").then(function(_this){return function(gitlab){return _this.scope.gitlab=gitlab}}(this))},GitlabController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return _this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),project}}(this))},GitlabController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(){return _this.loadModules()}}(this)),promise},GitlabController}(mixOf(taiga.Controller,taiga.PageMixin,taiga.FiltersMixin)),module.controller("GitlabController",GitlabController),BitbucketController=function(superClass){function BitbucketController(scope,repo,rs,params,appMetaService,translate){var promise;this.scope=scope,this.repo=repo,this.rs=rs,this.params=params,this.appMetaService=appMetaService,this.translate=translate,bindMethods(this),this.scope.sectionName=this.translate.instant("ADMIN.BITBUCKET.SECTION_NAME"),this.scope.project={},promise=this.loadInitialData(),promise.then(function(_this){return function(){var description,title;return title=_this.translate.instant("ADMIN.BITBUCKET.PAGE_TITLE",{projectName:_this.scope.project.name}),description=_this.scope.project.description,_this.appMetaService.setAll(title,description)}}(this)),promise.then(null,this.onInitialDataError.bind(this)),this.scope.$on("project:modules:reload",function(_this){return function(){return _this.loadModules()}}(this))}return extend(BitbucketController,superClass),BitbucketController.$inject=["$scope","$tgRepo","$tgResources","$routeParams","tgAppMetaService","$translate"],BitbucketController.prototype.loadModules=function(){return this.rs.modules.list(this.scope.projectId,"bitbucket").then(function(_this){return function(bitbucket){return _this.scope.bitbucket=bitbucket}}(this))},BitbucketController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return _this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),project}}(this))},BitbucketController.prototype.loadInitialData=function(){var promise;return promise=this.loadProject(),promise.then(function(_this){return function(){return _this.loadModules()}}(this)),promise},BitbucketController}(mixOf(taiga.Controller,taiga.PageMixin,taiga.FiltersMixin)),module.controller("BitbucketController",BitbucketController),SelectInputText=function(){var link;return link=function($scope,$el,$attrs){return $el.on("click",".select-input-content",function(){return $el.find("input").select(),$el.find(".help-copy").addClass("visible")})},{link:link}},module.directive("tgSelectInputText",SelectInputText),GithubWebhooksDirective=function($repo,$confirm,$loading){var link;return link=function($scope,$el,$attrs){var form,submit,submitButton;return form=$el.find("form").checksley({onlyOneErrorElement:!0}),submit=debounce(2e3,function(_this){return function(event){var currentLoading,promise;return event.preventDefault(),form.validate()?(currentLoading=$loading().target(submitButton).start(),promise=$repo.saveAttribute($scope.github,"github"),promise.then(function(){return currentLoading.finish(),$confirm.notify("success")}),promise.then(null,function(data){return currentLoading.finish(),form.setErrors(data),data._error_message?$confirm.notify("error",data._error_message):void 0})):void 0}}(this)),submitButton=$el.find(".submit-button"),$el.on("submit","form",submit)},{link:link}},module.directive("tgGithubWebhooks",["$tgRepo","$tgConfirm","$tgLoading",GithubWebhooksDirective]),GitlabWebhooksDirective=function($repo,$confirm,$loading){var link;return link=function($scope,$el,$attrs){var form,submit,submitButton;return form=$el.find("form").checksley({onlyOneErrorElement:!0}),submit=debounce(2e3,function(_this){return function(event){var currentLoading,promise;return event.preventDefault(),form.validate()?(currentLoading=$loading().target(submitButton).start(),promise=$repo.saveAttribute($scope.gitlab,"gitlab"),promise.then(function(){return currentLoading.finish(),$confirm.notify("success"),$scope.$emit("project:modules:reload")}),promise.then(null,function(data){return currentLoading.finish(),form.setErrors(data),data._error_message?$confirm.notify("error",data._error_message):void 0})):void 0}}(this)),submitButton=$el.find(".submit-button"),$el.on("submit","form",submit)},{link:link}},module.directive("tgGitlabWebhooks",["$tgRepo","$tgConfirm","$tgLoading",GitlabWebhooksDirective]),BitbucketWebhooksDirective=function($repo,$confirm,$loading){var link;return link=function($scope,$el,$attrs){var form,submit,submitButton;return form=$el.find("form").checksley({onlyOneErrorElement:!0}),submit=debounce(2e3,function(_this){return function(event){var currentLoading,promise;return event.preventDefault(),form.validate()?(currentLoading=$loading().target(submitButton).start(),promise=$repo.saveAttribute($scope.bitbucket,"bitbucket"),promise.then(function(){return currentLoading.finish(),$confirm.notify("success"),$scope.$emit("project:modules:reload")}),promise.then(null,function(data){return currentLoading.finish(),form.setErrors(data),data._error_message?$confirm.notify("error",data._error_message):void 0})):void 0}}(this)),submitButton=$el.find(".submit-button"),$el.on("submit","form",submit)},{link:link}},module.directive("tgBitbucketWebhooks",["$tgRepo","$tgConfirm","$tgLoading",BitbucketWebhooksDirective]),ValidOriginIpsDirective=function(){var link;return link=function($scope,$el,$attrs,$ngModel){return $ngModel.$parsers.push(function(value){return value=$.trim(value),""===value?[]:value.split(",")})},{link:link,restrict:"EA",require:"ngModel"}},module.directive("tgValidOriginIps",ValidOriginIpsDirective)}.call(this),function(){var CreateProject,DeleteProjectDirective,bindOnce,debounce,module,taiga,timeout;taiga=this.taiga,bindOnce=this.taiga.bindOnce,timeout=this.taiga.timeout,debounce=this.taiga.debounce,module=angular.module("taigaProject"),CreateProject=function($rootscope,$repo,$confirm,$location,$navurls,$rs,$projectUrl,$loading,lightboxService,$cacheFactory,$translate,currentUserService){var directive,link;return link=function($scope,$el,attrs){var currentLoading,form,onErrorSubmit,onSuccessSubmit,openLightbox,submit,submitButton;return $scope.data={},$scope.templates=[],currentLoading=null,form=$el.find("form").checksley({onlyOneErrorElement:!0}),onSuccessSubmit=function(response){return $cacheFactory.get("$http").removeAll(),currentLoading.finish(),$rootscope.$broadcast("projects:reload"),$confirm.notify("success",$translate.instant("COMMON.SAVE")),$location.url($projectUrl.get(response)),lightboxService.close($el),currentUserService.loadProjects()},onErrorSubmit=function(response){var error_field,error_step,i,len,ref,selectors;for(currentLoading.finish(),form.setErrors(response),selectors=[],ref=_.keys(response),i=0,len=ref.length;len>i;i++)error_field=ref[i],selectors.push("[name="+error_field+"]");return $el.find(".active").removeClass("active"),error_step=$el.find(selectors.join(",")).first().parents(".wizard-step"),error_step.addClass("active"),$el.find(".progress-bar").removeClass().addClass("progress-bar").addClass(error_step.data("step"))},submit=function(_this){return function(event){var promise;return event.preventDefault(),form.validate()?(currentLoading=$loading().target(submitButton).start(),promise=$repo.create("projects",$scope.data),promise.then(onSuccessSubmit,onErrorSubmit)):void 0}}(this),openLightbox=function(){return $scope.data={},$scope.templates.length?$scope.data.creation_template=_.head(_.filter($scope.templates,function(x){return"scrum"===x.slug})).id:$rs.projects.templates().then(function(_this){return function(result){return $scope.templates=result,$scope.data.creation_template=_.head(_.filter($scope.templates,function(x){return"scrum"===x.slug})).id}}(this)),$el.find(".active").removeClass("active"),$el.find(".create-step1").addClass("active"),lightboxService.open($el),timeout(600,function(){return $el.find(".progress-bar").addClass("step1")})},$el.on("click",".button-next",function(event){var current,field,i,len,next,ref,step,valid;for(event.preventDefault(),current=$el.find(".active"),valid=!0,ref=form.fields,i=0,len=ref.length;len>i;i++)field=ref[i],current.find("[name="+field.element.attr("name")+"]").length&&(valid=field.validate()!==!1&&valid);return valid?(next=current.next(),current.toggleClass("active"),next.toggleClass("active"),step=next.data("step"),$el.find(".progress-bar").removeClass().addClass("progress-bar").addClass(step)):void 0}),$el.on("click",".button-prev",function(event){var current,prev,step;return event.preventDefault(),current=$el.find(".active"),prev=current.prev(),current.toggleClass("active"),prev.toggleClass("active"),step=prev.data("step"),$el.find(".progress-bar").removeClass().addClass("progress-bar").addClass(step)}),submitButton=$el.find(".submit-button"),$el.on("submit","form",submit),$el.on("click",".close",function(event){return event.preventDefault(),lightboxService.close($el)}),$scope.$on("$destroy",function(){return $el.off()}),openLightbox()},directive={link:link,templateUrl:"project/wizard-create-project.html",scope:{}}},module.directive("tgLbCreateProject",["$rootScope","$tgRepo","$tgConfirm","$location","$tgNavUrls","$tgResources","$projectUrl","$tgLoading","lightboxService","$cacheFactory","$translate","tgCurrentUserService",CreateProject]),DeleteProjectDirective=function($repo,$rootscope,$auth,$location,$navUrls,$confirm,lightboxService,tgLoader,currentUserService){var link;return link=function($scope,$el,$attrs){var projectToDelete,submit;return projectToDelete=null,$scope.$on("deletelightbox:new",function(ctx,project){return lightboxService.open($el),projectToDelete=project}),$scope.$on("$destroy",function(){return $el.off()}),submit=function(){var promise;return tgLoader.start(),lightboxService.close($el),promise=$repo.remove(projectToDelete),promise.then(function(data){return tgLoader.pageLoaded(),$rootscope.$broadcast("projects:reload"),$location.path($navUrls.resolve("home")),$confirm.notify("success"),currentUserService.loadProjects()}),promise.then(null,function(){return $confirm.notify("error"),lightboxService.close($el)})},$el.on("click",".button-red",function(event){return event.preventDefault(),lightboxService.close($el)}),$el.on("click",".button-green",function(event){return event.preventDefault(),submit()})},{link:link}},module.directive("tgLbDeleteProject",["$tgRepo","$rootScope","$tgAuth","$tgLocation","$tgNavUrls","$tgConfirm","lightboxService","tgLoader","tgCurrentUserService",DeleteProjectDirective])}.call(this),function(){var BindHtmlDirective,BindOnceAltDirective,BindOnceBindDirective,BindOnceHrefDirective,BindOnceHtmlDirective,BindOnceRefDirective,BindOnceSrcDirective,BindOnceTitleDirective,BindTitleDirective,bindOnce,module;bindOnce=this.taiga.bindOnce,BindOnceBindDirective=function(){var link;return link=function($scope,$el,$attrs){return bindOnce($scope,$attrs.tgBoBind,function(val){return $el.text(val)})},{link:link}},BindOnceHtmlDirective=function(){var link;return link=function($scope,$el,$attrs){return bindOnce($scope,$attrs.tgBoHtml,function(val){return $el.html(val)})},{link:link}},BindOnceRefDirective=function(){var link;return link=function($scope,$el,$attrs){ +return bindOnce($scope,$attrs.tgBoRef,function(val){return $el.html("#"+val+" ")})},{link:link}},BindOnceSrcDirective=function(){var link;return link=function($scope,$el,$attrs){return bindOnce($scope,$attrs.tgBoSrc,function(val){return $el.attr("src",val)})},{link:link}},BindOnceHrefDirective=function(){var link;return link=function($scope,$el,$attrs){return bindOnce($scope,$attrs.tgBoHref,function(val){return $el.attr("href",val)})},{link:link}},BindOnceAltDirective=function(){var link;return link=function($scope,$el,$attrs){return bindOnce($scope,$attrs.tgBoAlt,function(val){return $el.attr("alt",val)})},{link:link}},BindOnceTitleDirective=function(){var link;return link=function($scope,$el,$attrs){return bindOnce($scope,$attrs.tgBoTitle,function(val){return $el.attr("title",val)})},{link:link}},BindTitleDirective=function(){var link;return link=function($scope,$el,$attrs){return $scope.$watch($attrs.tgTitleHtml,function(val){return null!=val?$el.attr("title",val):void 0})},{link:link}},BindHtmlDirective=function(){var link;return link=function($scope,$el,$attrs){return $scope.$watch($attrs.tgBindHtml,function(val){return null!=val?$el.html(val):void 0})},{link:link}},module=angular.module("taigaBase"),module.directive("tgBoBind",BindOnceBindDirective),module.directive("tgBoHtml",BindOnceHtmlDirective),module.directive("tgBoRef",BindOnceRefDirective),module.directive("tgBoSrc",BindOnceSrcDirective),module.directive("tgBoHref",BindOnceHrefDirective),module.directive("tgBoAlt",BindOnceAltDirective),module.directive("tgBoTitle",BindOnceTitleDirective),module.directive("tgBindTitle",BindTitleDirective),module.directive("tgBindHtml",BindHtmlDirective)}.call(this),function(){var ConfigurationService,module;ConfigurationService=function(){function ConfigurationService(){this.config=window.taigaConfig}return ConfigurationService.prototype.get=function(key,defaultValue){return null==defaultValue&&(defaultValue=null),_.has(this.config,key)?this.config[key]:defaultValue},ConfigurationService}(),module=angular.module("taigaBase"),module.service("$tgConfig",ConfigurationService)}.call(this),function(){var ContribController,module,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;module=angular.module("taigaBase"),ContribController=function(superClass){function ContribController(rootScope,scope,params,repo,rs,confirm){var promise;this.rootScope=rootScope,this.scope=scope,this.params=params,this.repo=repo,this.rs=rs,this.confirm=confirm,this.scope.currentPlugin=_.first(_.where(this.rootScope.adminPlugins,{slug:this.params.plugin})),this.scope.projectSlug=this.params.pslug,promise=this.loadInitialData(),promise.then(null,function(_this){return function(){return _this.confirm.notify("error")}}(this))}return extend(ContribController,superClass),ContribController.$inject=["$rootScope","$scope","$routeParams","$tgRepo","$tgResources","$tgConfirm"],ContribController.prototype.loadProject=function(){return this.rs.projects.getBySlug(this.params.pslug).then(function(_this){return function(project){return _this.scope.projectId=project.id,_this.scope.project=project,_this.scope.$emit("project:loaded",project),_this.scope.$broadcast("project:loaded",project),project}}(this))},ContribController.prototype.loadInitialData=function(){return this.loadProject()},ContribController}(taiga.Controller),module.controller("ContribController",ContribController)}.call(this),function(){var FiltersStorageService,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,FiltersStorageService=function(superClass){function FiltersStorageService(storage,params){this.storage=storage,this.params=params}return extend(FiltersStorageService,superClass),FiltersStorageService.$inject=["$tgStorage","$routeParams"],FiltersStorageService.prototype.generateHash=function(components){return null==components&&(components=[]),components=_.map(components,function(x){return JSON.stringify(x)}),hex_sha1(components.join(":"))},FiltersStorageService}(taiga.Service)}.call(this),function(){var HttpService,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,HttpService=function(superClass){function HttpService(http,q,storage,rootScope,cacheFactory,translate){this.http=http,this.q=q,this.storage=storage,this.rootScope=rootScope,this.cacheFactory=cacheFactory,this.translate=translate,HttpService.__super__.constructor.call(this),this.cache=this.cacheFactory("httpget")}return extend(HttpService,superClass),HttpService.$inject=["$http","$q","$tgStorage","$rootScope","$cacheFactory","$translate"],HttpService.prototype.headers=function(){var headers,lang,token;return headers={},token=this.storage.get("token"),token&&(headers.Authorization="Bearer "+token),lang=this.translate.preferredLanguage(),lang&&(headers["Accept-Language"]=lang),headers},HttpService.prototype.request=function(options){return options.headers=_.merge({},options.headers||{},this.headers()),this.http(options)},HttpService.prototype.get=function(url,params,options){return options=_.merge({method:"GET",url:url},options),params&&(options.params=params),options.cache=this.cache,this.request(options)["finally"](function(_this){return function(data){return _this.cache.removeAll()}}(this))},HttpService.prototype.post=function(url,data,params,options){return options=_.merge({method:"POST",url:url},options),data&&(options.data=data),params&&(options.params=params),this.request(options)},HttpService.prototype.put=function(url,data,params,options){return options=_.merge({method:"PUT",url:url},options),data&&(options.data=data),params&&(options.params=params),this.request(options)},HttpService.prototype.patch=function(url,data,params,options){return options=_.merge({method:"PATCH",url:url},options),data&&(options.data=data),params&&(options.params=params),this.request(options)},HttpService.prototype["delete"]=function(url,data,params,options){return options=_.merge({method:"DELETE",url:url},options),data&&(options.data=data),params&&(options.params=params),this.request(options)},HttpService}(taiga.Service),module=angular.module("taigaBase"),module.service("$tgHttp",HttpService)}.call(this),function(){var locationFactory,module;locationFactory=function($location,$route,$rootscope){return $location.noreload=function(scope){var lastRoute,un;return lastRoute=$route.current,un=scope.$on("$locationChangeSuccess",function(){return $route.current=lastRoute,un()}),$location},$location.isInCurrentRouteParams=function(name,value){var params;return params=$location.search()||{},params[name]===value},$location},module=angular.module("taigaBase"),module.factory("$tgLocation",["$location","$route","$rootScope",locationFactory])}.call(this),function(){var Model,ModelService,module,provider,taiga,indexOf=[].indexOf||function(item){for(var i=0,l=this.length;l>i;i++)if(i in this&&this[i]===item)return i;return-1},extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;Model=function(){function Model(name,data,dataTypes){this._attrs=data,this._name=name,this._dataTypes=dataTypes,this.setAttrs(data),this.initialize()}return Model.prototype.clone=function(){var instance;return instance=new Model(this._name,this._attrs,this._dataTypes),instance._modifiedAttrs=this._modifiedAttrs,instance._isModified=this._isModified,instance},Model.prototype.applyCasts=function(){var attrName,castMethod,castName,ref,results;ref=this._dataTypes,results=[];for(attrName in ref)castName=ref[attrName],castMethod=service.casts[castName],castMethod&&results.push(this._attrs[attrName]=castMethod(this._attrs[attrName]));return results},Model.prototype.getIdAttrName=function(){return"id"},Model.prototype.getName=function(){return this._name},Model.prototype.getAttrs=function(patch){return null==patch&&(patch=!1),null!=this._attrs.version&&(this._modifiedAttrs.version=this._attrs.version),patch?_.extend({},this._modifiedAttrs):_.extend({},this._attrs,this._modifiedAttrs)},Model.prototype.setAttrs=function(attrs){return this._attrs=attrs,this._modifiedAttrs={},this.applyCasts(),this._isModified=!1},Model.prototype.setAttr=function(name,value){return this._modifiedAttrs[name]=value,this._isModified=!0},Model.prototype.initialize=function(){var getter,self,setter;return self=this,getter=function(name){return function(){return"string"==typeof name&&"__"===name.substr(0,2)?self[name]:indexOf.call(_.keys(self._modifiedAttrs),name)<0?self._attrs[name]:self._modifiedAttrs[name]}},setter=function(name){return function(value){return"string"==typeof name&&"__"===name.substr(0,2)?void(self[name]=value):void(self._attrs[name]!==value?(self._modifiedAttrs[name]=value,self._isModified=!0):delete self._modifiedAttrs[name])}},_.each(this._attrs,function(value,name){var options;return options={get:getter(name),set:setter(name),enumerable:!0,configurable:!0},Object.defineProperty(self,name,options)})},Model.prototype.serialize=function(){var data;return data={data:_.clone(this._attrs),name:this._name},JSON.stringify(data)},Model.prototype.isModified=function(){return this._isModified},Model.prototype.isAttributeModified=function(attribute){return null!=this._modifiedAttrs[attribute]},Model.prototype.markSaved=function(){return this._isModified=!1,this._attrs=this.getAttrs(),this._modifiedAttrs={}},Model.prototype.revert=function(){return this._modifiedAttrs={},this._isModified=!1},Model.desSerialize=function(sdata){var ddata,model;return ddata=JSON.parse(sdata),model=new Model(ddata.url,ddata.data)},Model}(),taiga=this.taiga,ModelService=function(superClass){function ModelService(q,urls,storage,http){this.q=q,this.urls=urls,this.storage=storage,this.http=http,ModelService.__super__.constructor.call(this)}return extend(ModelService,superClass),ModelService.$inject=["$q","$tgUrls","$tgStorage","$tgHttp"],ModelService}(taiga.Service),provider=function($q,$http,$gmUrls,$gmStorage){var service;return service={},service.make_model=function(name,data,cls,dataTypes){return null==cls&&(cls=Model),null==dataTypes&&(dataTypes={}),new cls(name,data,dataTypes)},service.cls=Model,service.casts={"int":function(value){return parseInt(value,10)},"float":function(value){return parseFloat(value,10)}},service},module=angular.module("taigaBase"),module.factory("$tgModel",["$q","$http","$tgUrls","$tgStorage",provider])}.call(this),function(){var NavigationUrlsDirective,NavigationUrlsService,bindOnce,module,taiga,trim,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,trim=this.taiga.trim,bindOnce=this.taiga.bindOnce,module=angular.module("taigaBase"),NavigationUrlsService=function(superClass){function NavigationUrlsService(){this.urls={}}return extend(NavigationUrlsService,superClass),NavigationUrlsService.prototype.update=function(urls){return this.urls=_.merge({},this.urls,urls||{})},NavigationUrlsService.prototype.formatUrl=function(url,ctx){var replacer;return null==ctx&&(ctx={}),replacer=function(match){return match=trim(match,":"),ctx[match]||"undefined"},url.replace(/(:\w+)/g,replacer)},NavigationUrlsService.prototype.resolve=function(name,ctx){var url;return url=this.urls[name],url?ctx?this.formatUrl(url,ctx):url:""},NavigationUrlsService}(taiga.Service),module.service("$tgNavUrls",NavigationUrlsService),NavigationUrlsDirective=function($navurls,$auth,$q,$location){var bindOnceP,link,parseNav;return bindOnceP=function($scope,attr){var defered;return defered=$q.defer(),bindOnce($scope,attr,function(v){return defered.resolve(v)}),defered.promise},parseNav=function(data,$scope){var index,name,obj,params,promises,ref,result,values;if(ref=_.map(data.split(":"),trim),name=ref[0],params=ref[1],params)for(result=params.split(/(\w+)=/),result=_.filter(result,function(str){return str.length}),result=_.map(result,function(str){return trim(str.replace(/,$/g,""))}),params=[],index=0;indexi;i++)param=params[i],key=Object.keys(param)[0],value=param[key],options[key]=$scope.$eval(value);return[name,options]})},link=function($scope,$el,$attrs){return $el.is("a")&&$el.attr("href","#"),$el.on("mouseenter",function(event){var target;return target=$(event.currentTarget),target.data("fullUrl")&&$attrs.tgNavGetParams===target.data("params")?void 0:parseNav($attrs.tgNav,$scope).then(function(result){var fullUrl,getURLParams,getURLParamsStr,name,options,url,user;return name=result[0],options=result[1],user=$auth.getUser(),user&&(options.user=user.username),url=$navurls.resolve(name),fullUrl=$navurls.formatUrl(url,options),$attrs.tgNavGetParams&&(getURLParams=JSON.parse($attrs.tgNavGetParams),getURLParamsStr=$.param(getURLParams),fullUrl=fullUrl+"?"+getURLParamsStr,target.data("params",$attrs.tgNavGetParams)),target.data("fullUrl",fullUrl),target.is("a")&&target.attr("href",fullUrl),$el.on("click",function(event){if(!event.metaKey&&!event.ctrlKey&&(event.preventDefault(),target=$(event.currentTarget),!target.hasClass("noclick")))switch(fullUrl=target.data("fullUrl"),event.which){case 1:return $location.url(fullUrl),$scope.$apply();case 2:return window.open(fullUrl)}})})}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgNav",["$tgNavUrls","$tgAuth","$q","$tgLocation",NavigationUrlsDirective])}.call(this),function(){var RepositoryService,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,RepositoryService=function(superClass){function RepositoryService(q,model1,storage,http,urls){this.q=q,this.model=model1,this.storage=storage,this.http=http,this.urls=urls,RepositoryService.__super__.constructor.call(this)}return extend(RepositoryService,superClass),RepositoryService.$inject=["$q","$tgModel","$tgStorage","$tgHttp","$tgUrls"],RepositoryService.prototype.resolveUrlForModel=function(model){var idAttrName;return idAttrName=model.getIdAttrName(),this.urls.resolve(model.getName())+"/"+model[idAttrName]},RepositoryService.prototype.resolveUrlForAttributeModel=function(model){return this.urls.resolve(model.getName(),model.parent)},RepositoryService.prototype.create=function(name,data,dataTypes,extraParams){var defered,promise,url;return null==dataTypes&&(dataTypes={}),null==extraParams&&(extraParams={}),defered=this.q.defer(),url=this.urls.resolve(name),promise=this.http.post(url,JSON.stringify(data)),promise.success(function(_this){return function(_data,_status){return defered.resolve(_this.model.make_model(name,_data,null,dataTypes))}}(this)),promise.error(function(_this){return function(data,status){return defered.reject(data)}}(this)),defered.promise},RepositoryService.prototype.remove=function(model,params){var defered,promise,url;return null==params&&(params={}),defered=this.q.defer(),url=this.resolveUrlForModel(model),promise=this.http["delete"](url,{},params),promise.success(function(data,status){return defered.resolve(model)}),promise.error(function(data,status){return defered.reject(model)}),defered.promise},RepositoryService.prototype.saveAll=function(models,patch){var promises;return null==patch&&(patch=!0),promises=_.map(models,function(_this){return function(x){return _this.save(x,!0)}}(this)),this.q.all(promises)},RepositoryService.prototype.save=function(model,patch){var data,defered,promise,url;return null==patch&&(patch=!0),defered=this.q.defer(),!model.isModified()&&patch?(defered.resolve(model),defered.promise):(url=this.resolveUrlForModel(model),data=JSON.stringify(model.getAttrs(patch)),promise=patch?this.http.patch(url,data):this.http.put(url,data),promise.success(function(_this){return function(data,status){return model._isModified=!1,model._attrs=_.extend(model.getAttrs(),data),model._modifiedAttrs={},model.applyCasts(),defered.resolve(model)}}(this)),promise.error(function(data,status){return defered.reject(data)}),defered.promise)},RepositoryService.prototype.saveAttribute=function(model,attribute,patch){var data,defered,promise,url;return null==patch&&(patch=!0),defered=this.q.defer(),!model.isModified()&&patch?(defered.resolve(model),defered.promise):(url=this.resolveUrlForAttributeModel(model),data={},data[attribute]=model.getAttrs(),promise=patch?this.http.patch(url,data):this.http.put(url,data),promise.success(function(_this){return function(data,status){return model._isModified=!1,model._attrs=_.extend(model.getAttrs(),data),model._modifiedAttrs={},model.applyCasts(),defered.resolve(model)}}(this)),promise.error(function(data,status){return defered.reject(data)}),defered.promise)},RepositoryService.prototype.refresh=function(model){var defered,promise,url;return defered=this.q.defer(),url=this.resolveUrlForModel(model),promise=this.http.get(url),promise.success(function(data,status){return model._modifiedAttrs={},model._attrs=data,model._isModified=!1,model.applyCasts(),defered.resolve(model)}),promise.error(function(data,status){return defered.reject(data)}),defered.promise},RepositoryService.prototype.queryMany=function(name,params,options,headers){var httpOptions,url;return null==options&&(options={}),null==headers&&(headers=!1),url=this.urls.resolve(name),httpOptions={headers:{}},options.enablePagination||(httpOptions.headers["x-disable-pagination"]="1"),this.http.get(url,params,httpOptions).then(function(_this){return function(data){var result;return result=_.map(data.data,function(x){return _this.model.make_model(name,x)}),headers?[result,data.headers]:result}}(this))},RepositoryService.prototype.queryOneAttribute=function(name,id,attribute,params,options){var httpOptions,url;return null==options&&(options={}),url=this.urls.resolve(name,id),httpOptions={headers:{}},options.enablePagination||(httpOptions.headers["x-disable-pagination"]="1"),this.http.get(url,params,httpOptions).then(function(_this){return function(data){var model;return model=_this.model.make_model(name,data.data[attribute]),model.parent=id,model}}(this))},RepositoryService.prototype.queryOne=function(name,id,params,options){var httpOptions,url;return null==options&&(options={}),url=this.urls.resolve(name),id&&(url=url+"/"+id),httpOptions={headers:{}},options.enablePagination||(httpOptions.headers["x-disable-pagination"]="1"),this.http.get(url,params,httpOptions).then(function(_this){return function(data){return _this.model.make_model(name,data.data)}}(this))},RepositoryService.prototype.queryOneRaw=function(name,id,params,options){var httpOptions,url;return null==options&&(options={}),url=this.urls.resolve(name),id&&(url=url+"/"+id),httpOptions=_.merge({headers:{}},options),options.enablePagination||(httpOptions.headers["x-disable-pagination"]="1"),this.http.get(url,params,httpOptions).then(function(_this){return function(data){return data.data}}(this))},RepositoryService.prototype.queryPaginated=function(name,params,options){var httpOptions,url;return null==options&&(options={}),url=this.urls.resolve(name),httpOptions=_.merge({headers:{}},options),this.http.get(url,params,httpOptions).then(function(_this){return function(data){var headers,result;return headers=data.headers(),result={},result.models=_.map(data.data,function(x){return _this.model.make_model(name,x)}),result.count=parseInt(headers["x-pagination-count"],10),result.current=parseInt(headers["x-pagination-current"]||1,10),result.paginatedBy=parseInt(headers["x-paginated-by"],10),result}}(this))},RepositoryService.prototype.queryOnePaginatedRaw=function(name,id,params,options){var httpOptions,url;return null==options&&(options={}),url=this.urls.resolve(name),id&&(url=url+"/"+id),httpOptions=_.merge({headers:{}},options),this.http.get(url,params,httpOptions).then(function(_this){return function(data){var headers,result;return headers=data.headers(),result={},result.data=data.data,result.count=parseInt(headers["x-pagination-count"],10),result.current=parseInt(headers["x-pagination-current"]||1,10),result.paginatedBy=parseInt(headers["x-paginated-by"],10),result}}(this))},RepositoryService.prototype.resolve=function(options){var cache,params;return params={},null!=options.pslug&&(params.project=options.pslug),null!=options.usref&&(params.us=options.usref),null!=options.taskref&&(params.task=options.taskref),null!=options.issueref&&(params.issue=options.issueref),null!=options.sslug&&(params.milestone=options.sslug),null!=options.wikipage&&(params.wikipage=options.wikipage),cache=!(options.wikipage||options.sslug),this.queryOneRaw("resolver",null,params,{cache:cache})},RepositoryService}(taiga.Service),module=angular.module("taigaBase"),module.service("$tgRepo",RepositoryService)}.call(this),function(){var StorageService,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,StorageService=function(superClass){function StorageService($rootScope){StorageService.__super__.constructor.call(this)}return extend(StorageService,superClass),StorageService.$inject=["$rootScope"],StorageService.prototype.get=function(key,_default){var serializedValue;return serializedValue=localStorage.getItem(key),null===serializedValue?_default||null:JSON.parse(serializedValue)},StorageService.prototype.set=function(key,val){return _.isObject(key)?_.each(key,function(_this){return function(val,key){return _this.set(key,val)}}(this)):localStorage.setItem(key,JSON.stringify(val))},StorageService.prototype.contains=function(key){var value;return value=this.get(key),null!==value},StorageService.prototype.remove=function(key){return localStorage.removeItem(key)},StorageService.prototype.clear=function(){return localStorage.clear()},StorageService}(taiga.Service),module=angular.module("taigaBase"),module.service("$tgStorage",StorageService)}.call(this),function(){var UrlsService,format,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;format=function(fmt,obj){return obj=_.clone(obj),fmt.replace(/%s/g,function(match){return String(obj.shift())})},taiga=this.taiga,UrlsService=function(superClass){function UrlsService(config){this.config=config,this.urls={},this.mainUrl=this.config.get("api")}return extend(UrlsService,superClass),UrlsService.$inject=["$tgConfig"],UrlsService.prototype.update=function(urls){return this.urls=_.merge(this.urls,urls)},UrlsService.prototype.resolve=function(){var args,name,url;if(args=_.toArray(arguments),0===args.length)throw Error("wrong arguments to setUrls");return name=args.slice(0,1)[0],url=format(this.urls[name],args.slice(1)),format("%s/%s",[_.str.rtrim(this.mainUrl,"/"),_.str.ltrim(url,"/")])},UrlsService.prototype.resolveAbsolute=function(){var url;return url=this.resolve.apply(this,arguments),/^https?:\/\//i.test(url)?url:/^\//.test(url)?window.location.protocol+"//"+window.location.host+url:window.location.protocol+"//"+window.location.host+"/"+url},UrlsService}(taiga.Service),module=angular.module("taigaBase"),module.service("$tgUrls",UrlsService)}.call(this),function(){var module,resourceProvider,taiga;taiga=this.taiga,resourceProvider=function($repo){var _get,service;return _get=function(objectId,resource){return $repo.queryOne(resource,objectId)},service={userstory:{get:function(objectId){return _get(objectId,"custom-attributes-values/userstory")}},task:{get:function(objectId){return _get(objectId,"custom-attributes-values/task")}},issue:{get:function(objectId){return _get(objectId,"custom-attributes-values/issue")}}},function(instance){return instance.customAttributesValues=service}},module=angular.module("taigaResources"),module.factory("$tgCustomAttributesValuesResourcesProvider",["$tgRepo",resourceProvider])}.call(this),function(){var module,resourceProvider,sizeFormat,taiga;taiga=this.taiga,sizeFormat=this.taiga.sizeFormat,resourceProvider=function($repo){var _list,service;return _list=function(projectId,resource){return $repo.queryMany(resource,{project:projectId})},service={userstory:{list:function(projectId){return _list(projectId,"custom-attributes/userstory")}},task:{list:function(projectId){return _list(projectId,"custom-attributes/task")}},issue:{list:function(projectId){return _list(projectId,"custom-attributes/issue")}}},function(instance){return instance.customAttributes=service}},module=angular.module("taigaResources"),module.factory("$tgCustomAttributesResourcesProvider",["$tgRepo",resourceProvider])}.call(this),function(){var module,resourceProvider,taiga;taiga=this.taiga,resourceProvider=function($repo,$http,$urls){var service;return service={},service.get=function(type,objectId){return $repo.queryOneRaw("history/"+type,objectId)},service.deleteComment=function(type,objectId,activityId){var params,url;return url=$urls.resolve("history/"+type),url=url+"/"+objectId+"/delete_comment",params={id:activityId},$http.post(url,null,params).then(function(_this){return function(data){return data.data}}(this))},service.undeleteComment=function(type,objectId,activityId){var params,url;return url=$urls.resolve("history/"+type),url=url+"/"+objectId+"/undelete_comment",params={id:activityId},$http.post(url,null,params).then(function(_this){return function(data){return data.data}}(this))},function(instance){return instance.history=service}},module=angular.module("taigaResources"),module.factory("$tgHistoryResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",resourceProvider])}.call(this),function(){var module,resourceProvider,taiga;taiga=this.taiga,resourceProvider=function($repo){var service;return service={},service.get=function(token){return $repo.queryOne("invitations",token)},function(instance){return instance.invitations=service}},module=angular.module("taigaResources"),module.factory("$tgInvitationsResourcesProvider",["$tgRepo",resourceProvider])}.call(this),function(){var generateHash,module,resourceProvider,taiga;taiga=this.taiga,generateHash=taiga.generateHash,resourceProvider=function($repo,$http,$urls,$storage,$q){var filtersHashSuffix,hashSuffix,myFiltersHashSuffix,service;return service={},hashSuffix="issues-queryparams",filtersHashSuffix="issues-filters",myFiltersHashSuffix="issues-my-filters",service.get=function(projectId,issueId){var params;return params=service.getQueryParams(projectId),params.project=projectId,$repo.queryOne("issues",issueId,params)},service.getByRef=function(projectId,ref){var params;return params=service.getQueryParams(projectId),params.project=projectId,params.ref=ref,$repo.queryOne("issues","by_ref",params)},service.listInAllProjects=function(filters){return $repo.queryMany("issues",filters)},service.list=function(projectId,filters,options){var params;return params={project:projectId},params=_.extend({},params,filters||{}),service.storeQueryParams(projectId,params),$repo.queryPaginated("issues",params,options)},service.bulkCreate=function(projectId,data){var params,url;return url=$urls.resolve("bulk-create-issues"),params={project_id:projectId,bulk_issues:data},$http.post(url,params)},service.upvote=function(issueId){var url;return url=$urls.resolve("issue-upvote",issueId),$http.post(url)},service.downvote=function(issueId){var url;return url=$urls.resolve("issue-downvote",issueId),$http.post(url)},service.watch=function(issueId){var url;return url=$urls.resolve("issue-watch",issueId),$http.post(url)},service.unwatch=function(issueId){var url;return url=$urls.resolve("issue-unwatch",issueId),$http.post(url)},service.stats=function(projectId){return $repo.queryOneRaw("projects",projectId+"/issues_stats")},service.filtersData=function(params){return $repo.queryOneRaw("issues-filters",null,params)},service.listValues=function(projectId,type){var params;return params={project:projectId},service.storeQueryParams(projectId,params),$repo.queryMany(type,params)},service.storeQueryParams=function(projectId,params){var hash,ns;return ns=projectId+":"+hashSuffix,hash=generateHash([projectId,ns]),$storage.set(hash,params)},service.getQueryParams=function(projectId){var hash,ns;return ns=projectId+":"+hashSuffix,hash=generateHash([projectId,ns]),$storage.get(hash)||{}},service.storeFilters=function(projectSlug,params){var hash,ns;return ns=projectSlug+":"+filtersHashSuffix,hash=generateHash([projectSlug,ns]),$storage.set(hash,params)},service.getFilters=function(projectSlug){var hash,ns;return ns=projectSlug+":"+filtersHashSuffix,hash=generateHash([projectSlug,ns]),$storage.get(hash)||{}},service.storeMyFilters=function(projectId,myFilters){var deferred,hash,ns,promise,url;return deferred=$q.defer(),url=$urls.resolve("user-storage"),ns=projectId+":"+myFiltersHashSuffix,hash=generateHash([projectId,ns]),_.isEmpty(myFilters)?(promise=$http["delete"](url+"/"+hash,{key:hash,value:myFilters}),promise.then(function(){return deferred.resolve()}),promise.then(null,function(){return deferred.reject()})):(promise=$http.put(url+"/"+hash,{key:hash,value:myFilters}),promise.then(function(data){return deferred.resolve()}),promise.then(null,function(data){var innerPromise;return innerPromise=$http.post(""+url,{key:hash,value:myFilters}),innerPromise.then(function(){return deferred.resolve()}),innerPromise.then(null,function(){return deferred.reject()})})),deferred.promise},service.getMyFilters=function(projectId){var deferred,hash,ns,promise,url;return deferred=$q.defer(),url=$urls.resolve("user-storage"),ns=projectId+":"+myFiltersHashSuffix,hash=generateHash([projectId,ns]),promise=$http.get(url+"/"+hash),promise.then(function(data){return deferred.resolve(data.data.value)}),promise.then(null,function(data){return deferred.resolve({})}),deferred.promise},function(instance){return instance.issues=service}},module=angular.module("taigaResources"),module.factory("$tgIssuesResourcesProvider",["$tgRepo","$tgHttp","$tgUrls","$tgStorage","$q",resourceProvider])}.call(this),function(){var generateHash,module,resourceProvider,taiga;taiga=this.taiga,generateHash=taiga.generateHash,resourceProvider=function($storage){var hashSuffixStatusColumnModes,hashSuffixStatusViewModes,service;return service={},hashSuffixStatusViewModes="kanban-statusviewmodels",hashSuffixStatusColumnModes="kanban-statuscolumnmodels",service.storeStatusViewModes=function(projectId,params){var hash,ns;return ns=projectId+":"+hashSuffixStatusViewModes,hash=generateHash([projectId,ns]),$storage.set(hash,params)},service.getStatusViewModes=function(projectId){ +var hash,ns;return ns=projectId+":"+hashSuffixStatusViewModes,hash=generateHash([projectId,ns]),$storage.get(hash)||{}},service.storeStatusColumnModes=function(projectId,params){var hash,ns;return ns=projectId+":"+hashSuffixStatusColumnModes,hash=generateHash([projectId,ns]),$storage.set(hash,params)},service.getStatusColumnModes=function(projectId){var hash,ns;return ns=projectId+":"+hashSuffixStatusColumnModes,hash=generateHash([projectId,ns]),$storage.get(hash)||{}},function(instance){return instance.kanban=service}},module=angular.module("taigaResources"),module.factory("$tgKanbanResourcesProvider",["$tgStorage",resourceProvider])}.call(this),function(){var module,resourceProvider,sizeFormat,taiga;taiga=this.taiga,sizeFormat=this.taiga.sizeFormat,resourceProvider=function($repo){var service;return service={list:function(){return $repo.queryMany("locales")}},function(instance){return instance.locales=service}},module=angular.module("taigaResources"),module.factory("$tgLocalesResourcesProvider",["$tgRepo",resourceProvider])}.call(this),function(){var module,resourceProvider,taiga;taiga=this.taiga,resourceProvider=function($repo,$urls,$http){var service;return service={},service.render=function(projectId,content){var params,url;return(null==content||""===content)&&(content=" "),params={project_id:projectId,content:content},url=$urls.resolve("wiki"),$http.post(url+"/render",params).then(function(_this){return function(data){return data.data}}(this))},function(instance){return instance.mdrender=service}},module=angular.module("taigaResources"),module.factory("$tgMdRenderResourcesProvider",["$tgRepo","$tgUrls","$tgHttp",resourceProvider])}.call(this),function(){var module,resourceProvider,taiga;taiga=this.taiga,resourceProvider=function($repo,$http,$urls){var service;return service={},service.get=function(id){return $repo.queryOne("memberships",id)},service.list=function(projectId,filters,enablePagination){var options,params;return null==enablePagination&&(enablePagination=!0),params={project:projectId},params=_.extend({},params,filters||{}),enablePagination?$repo.queryPaginated("memberships",params):$repo.queryMany("memberships",params,options={enablePagination:enablePagination})},service.listByUser=function(userId,filters){var params;return params={user:userId},params=_.extend({},params,filters||{}),$repo.queryPaginated("memberships",params)},service.resendInvitation=function(id){var url;return url=$urls.resolve("memberships"),$http.post(url+"/"+id+"/resend_invitation",{})},service.bulkCreateMemberships=function(projectId,data,invitation_extra_text){var params,url;return url=$urls.resolve("bulk-create-memberships"),params={project_id:projectId,bulk_memberships:data,invitation_extra_text:invitation_extra_text},$http.post(url,params)},function(instance){return instance.memberships=service}},module=angular.module("taigaResources"),module.factory("$tgMembershipsResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",resourceProvider])}.call(this),function(){var module,resourceProvider;resourceProvider=function($repo){var service;return service={},service.list=function(projectId,module){return $repo.queryOneAttribute("project-modules",projectId,module)},function(instance){return instance.modules=service}},module=angular.module("taigaResources"),module.factory("$tgModulesResourcesProvider",["$tgRepo",resourceProvider])}.call(this),function(){var module,resourceProvider,taiga;taiga=this.taiga,resourceProvider=function($repo,$http,$urls){var service;return service={},service.get=function(id){return $repo.queryOne("notify-policies",id)},service.list=function(filters){var params;return params=_.extend({},params,filters||{}),$repo.queryMany("notify-policies",params)},function(instance){return instance.notifyPolicies=service}},module=angular.module("taigaResources"),module.factory("$tgNotifyPoliciesResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",resourceProvider])}.call(this),function(){var module,resourceProvider,sizeFormat,taiga;taiga=this.taiga,sizeFormat=this.taiga.sizeFormat,resourceProvider=function($config,$repo,$http,$urls,$auth,$q,$translate){var service;return service={},service.get=function(projectId){return $repo.queryOne("projects",projectId)},service.getBySlug=function(projectSlug){return $repo.queryOne("projects","by_slug?slug="+projectSlug)},service.list=function(){return $repo.queryMany("projects")},service.listByMember=function(memberId){var params;return params={member:memberId,order_by:"memberships__user_order"},$repo.queryMany("projects",params)},service.templates=function(){return $repo.queryMany("project-templates")},service.usersList=function(projectId){var params;return params={project:projectId},$repo.queryMany("users",params)},service.rolesList=function(projectId){var params;return params={project:projectId},$repo.queryMany("roles",params)},service.stats=function(projectId){return $repo.queryOneRaw("projects",projectId+"/stats")},service.bulkUpdateOrder=function(bulkData){var url;return url=$urls.resolve("bulk-update-projects-order"),$http.post(url,bulkData)},service.regenerate_userstories_csv_uuid=function(projectId){var url;return url=$urls.resolve("projects")+"/"+projectId+"/regenerate_userstories_csv_uuid",$http.post(url)},service.regenerate_issues_csv_uuid=function(projectId){var url;return url=$urls.resolve("projects")+"/"+projectId+"/regenerate_issues_csv_uuid",$http.post(url)},service.regenerate_tasks_csv_uuid=function(projectId){var url;return url=$urls.resolve("projects")+"/"+projectId+"/regenerate_tasks_csv_uuid",$http.post(url)},service.leave=function(projectId){var url;return url=$urls.resolve("projects")+"/"+projectId+"/leave",$http.post(url)},service.memberStats=function(projectId){return $repo.queryOneRaw("projects",projectId+"/member_stats")},service.tagsColors=function(projectId){return $repo.queryOne("projects",projectId+"/tags_colors")},service["export"]=function(projectId){var url;return url=$urls.resolve("exporter")+"/"+projectId,$http.get(url)},service["import"]=function(file,statusUpdater){var complete,data,defered,errorMsg,failed,maxFileSize,response,uploadComplete,uploadFailed,uploadProgress,xhr;return defered=$q.defer(),maxFileSize=$config.get("maxUploadFileSize",null),maxFileSize&&file.size>maxFileSize?(errorMsg=$translate.instant("PROJECT.IMPORT.ERROR_MAX_SIZE_EXCEEDED",{fileName:file.name,fileSize:sizeFormat(file.size),maxFileSize:sizeFormat(maxFileSize)}),response={status:413,data:{_error_message:errorMsg}},defered.reject(response),defered.promise):(uploadProgress=function(_this){return function(evt){var message,percent;return percent=Math.round(evt.loaded/evt.total*100),message=$translate.instant("PROJECT.IMPORT.UPLOAD_IN_PROGRESS_MESSAGE",{uploadedSize:sizeFormat(evt.loaded),totalSize:sizeFormat(evt.total)}),statusUpdater("in-progress",null,message,percent)}}(this),uploadComplete=function(_this){return function(evt){return statusUpdater("done",$translate.instant("PROJECT.IMPORT.TITLE"),$translate.instant("PROJECT.IMPORT.DESCRIPTION"))}}(this),uploadFailed=function(_this){return function(evt){return statusUpdater("error")}}(this),complete=function(_this){return function(evt){var ref;response={};try{response.data=JSON.parse(evt.target.responseText)}catch(error){response.data={}}return response.status=evt.target.status,(201===(ref=response.status)||202===ref)&&defered.resolve(response),defered.reject(response)}}(this),failed=function(_this){return function(evt){return defered.reject("fail")}}(this),data=new FormData,data.append("dump",file),xhr=new XMLHttpRequest,xhr.upload.addEventListener("progress",uploadProgress,!1),xhr.upload.addEventListener("load",uploadComplete,!1),xhr.upload.addEventListener("error",uploadFailed,!1),xhr.upload.addEventListener("abort",uploadFailed,!1),xhr.addEventListener("load",complete,!1),xhr.addEventListener("error",failed,!1),xhr.open("POST",$urls.resolve("importer")),xhr.setRequestHeader("Authorization","Bearer "+$auth.getToken()),xhr.setRequestHeader("Accept","application/json"),xhr.send(data),defered.promise)},service.changeLogo=function(projectId,file){var data,defered,maxFileSize,options,response,url;return maxFileSize=$config.get("maxUploadFileSize",null),maxFileSize&&file.size>maxFileSize?(response={status:413,data:{_error_message:"'"+file.name+"' ("+sizeFormat(file.size)+") is too heavy for our oompa loompas, try it with a smaller than ("+sizeFormat(maxFileSize)+")"}},defered=$q.defer(),defered.reject(response),defered.promise):(data=new FormData,data.append("logo",file),options={transformRequest:angular.identity,headers:{"Content-Type":void 0}},url=$urls.resolve("projects")+"/"+projectId+"/change_logo",$http.post(url,data,{},options))},service.removeLogo=function(projectId){var url;return url=$urls.resolve("projects")+"/"+projectId+"/remove_logo",$http.post(url)},function(instance){return instance.projects=service}},module=angular.module("taigaResources"),module.factory("$tgProjectsResourcesProvider",["$tgConfig","$tgRepo","$tgHttp","$tgUrls","$tgAuth","$q","$translate",resourceProvider])}.call(this),function(){var module,resourceProvider,taiga;taiga=this.taiga,resourceProvider=function($repo,$http,$urls){var service;return service={},service.get=function(id){return $repo.queryOne("roles",id)},service.list=function(projectId){return $repo.queryMany("roles",{project:projectId})},function(instance){return instance.roles=service}},module=angular.module("taigaResources"),module.factory("$tgRolesResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",resourceProvider])}.call(this),function(){var module,resourceProvider,taiga;taiga=this.taiga,resourceProvider=function($repo,$urls,$http,$q){var service;return service={},service["do"]=function(projectId,term){var deferredAbort,params,request,url;return deferredAbort=$q.defer(),url=$urls.resolve("search"),params={url:url,method:"GET",timeout:deferredAbort.promise,cancelable:!0,params:{project:projectId,text:term,get_all:!1}},request=$http.request(params).then(function(data){return data.data}),request.abort=function(){return deferredAbort.resolve()},request["finally"]=function(){return request.abort=angular.noop,deferredAbort=request=null},request},function(instance){return instance.search=service}},module=angular.module("taigaResources"),module.factory("$tgSearchResourcesProvider",["$tgRepo","$tgUrls","$tgHttp","$q",resourceProvider])}.call(this),function(){var generateHash,module,resourceProvider,taiga;taiga=this.taiga,generateHash=taiga.generateHash,resourceProvider=function($repo,$model,$storage){var service;return service={},service.get=function(projectId,sprintId){return $repo.queryOne("milestones",sprintId).then(function(sprint){var uses;return uses=sprint.user_stories,uses=_.map(uses,function(u){return $model.make_model("userstories",u)}),sprint._attrs.user_stories=uses,sprint})},service.stats=function(projectId,sprintId){return $repo.queryOneRaw("milestones",sprintId+"/stats")},service.list=function(projectId,filters){var params;return params={project:projectId},params=_.extend({},params,filters||{}),$repo.queryMany("milestones",params,{},!0).then(function(_this){return function(result){var headers,i,len,m,milestones,uses;for(milestones=result[0],headers=result[1],i=0,len=milestones.length;len>i;i++)m=milestones[i],uses=m.user_stories,uses=_.map(uses,function(u){return $model.make_model("userstories",u)}),m._attrs.user_stories=uses;return{milestones:milestones,closed:parseInt(headers("Taiga-Info-Total-Closed-Milestones"),10),open:parseInt(headers("Taiga-Info-Total-Opened-Milestones"),10)}}}(this))},function(instance){return instance.sprints=service}},module=angular.module("taigaResources"),module.factory("$tgSprintsResourcesProvider",["$tgRepo","$tgModel","$tgStorage",resourceProvider])}.call(this),function(){var generateHash,module,resourceProvider,taiga;taiga=this.taiga,generateHash=taiga.generateHash,resourceProvider=function($repo,$http,$urls,$storage){var hashSuffix,hashSuffixStatusColumnModes,hashSuffixUsRowModes,service;return service={},hashSuffix="tasks-queryparams",hashSuffixStatusColumnModes="tasks-statuscolumnmodels",hashSuffixUsRowModes="tasks-usrowmodels",service.get=function(projectId,taskId){var params;return params=service.getQueryParams(projectId),params.project=projectId,$repo.queryOne("tasks",taskId,params)},service.getByRef=function(projectId,ref){var params;return params=service.getQueryParams(projectId),params.project=projectId,params.ref=ref,$repo.queryOne("tasks","by_ref",params)},service.listInAllProjects=function(filters){return $repo.queryMany("tasks",filters)},service.list=function(projectId,sprintId,userStoryId){var params;return null==sprintId&&(sprintId=null),null==userStoryId&&(userStoryId=null),params={project:projectId},sprintId&&(params.milestone=sprintId),userStoryId&&(params.user_story=userStoryId),service.storeQueryParams(projectId,params),$repo.queryMany("tasks",params)},service.bulkCreate=function(projectId,sprintId,usId,data){var params,url;return url=$urls.resolve("bulk-create-tasks"),params={project_id:projectId,sprint_id:sprintId,us_id:usId,bulk_tasks:data},$http.post(url,params).then(function(result){return result.data})},service.upvote=function(taskId){var url;return url=$urls.resolve("task-upvote",taskId),$http.post(url)},service.downvote=function(taskId){var url;return url=$urls.resolve("task-downvote",taskId),$http.post(url)},service.watch=function(taskId){var url;return url=$urls.resolve("task-watch",taskId),$http.post(url)},service.unwatch=function(taskId){var url;return url=$urls.resolve("task-unwatch",taskId),$http.post(url)},service.bulkUpdateTaskTaskboardOrder=function(projectId,data){var params,url;return url=$urls.resolve("bulk-update-task-taskboard-order"),params={project_id:projectId,bulk_tasks:data},$http.post(url,params)},service.listValues=function(projectId,type){var params;return params={project:projectId},$repo.queryMany(type,params)},service.storeQueryParams=function(projectId,params){var hash,ns;return ns=projectId+":"+hashSuffix,hash=generateHash([projectId,ns]),$storage.set(hash,params)},service.getQueryParams=function(projectId){var hash,ns;return ns=projectId+":"+hashSuffix,hash=generateHash([projectId,ns]),$storage.get(hash)||{}},service.storeStatusColumnModes=function(projectId,params){var hash,ns;return ns=projectId+":"+hashSuffixStatusColumnModes,hash=generateHash([projectId,ns]),$storage.set(hash,params)},service.getStatusColumnModes=function(projectId){var hash,ns;return ns=projectId+":"+hashSuffixStatusColumnModes,hash=generateHash([projectId,ns]),$storage.get(hash)||{}},service.storeUsRowModes=function(projectId,sprintId,params){var hash,ns;return ns=projectId+":"+hashSuffixUsRowModes,hash=generateHash([projectId,sprintId,ns]),$storage.set(hash,params)},service.getUsRowModes=function(projectId,sprintId){var hash,ns;return ns=projectId+":"+hashSuffixUsRowModes,hash=generateHash([projectId,sprintId,ns]),$storage.get(hash)||{}},function(instance){return instance.tasks=service}},module=angular.module("taigaResources"),module.factory("$tgTasksResourcesProvider",["$tgRepo","$tgHttp","$tgUrls","$tgStorage",resourceProvider])}.call(this),function(){var module,resourceProvider,sizeFormat,taiga;taiga=this.taiga,sizeFormat=this.taiga.sizeFormat,resourceProvider=function($config,$repo,$http,$urls,$q){var service;return service={},service.changeAvatar=function(file){var data,defered,maxFileSize,options,response,url;return maxFileSize=$config.get("maxUploadFileSize",null),maxFileSize&&file.size>maxFileSize?(response={status:413,data:{_error_message:"'"+file.name+"' ("+sizeFormat(file.size)+") is too heavy for our oompa loompas, try it with a smaller than ("+sizeFormat(maxFileSize)+")"}},defered=$q.defer(),defered.reject(response),defered.promise):(data=new FormData,data.append("avatar",file),options={transformRequest:angular.identity,headers:{"Content-Type":void 0}},url=$urls.resolve("users")+"/change_avatar",$http.post(url,data,{},options))},service.removeAvatar=function(){var url;return url=$urls.resolve("users")+"/remove_avatar",$http.post(url)},service.changePassword=function(currentPassword,newPassword){var data,url;return url=$urls.resolve("users")+"/change_password",data={current_password:currentPassword,password:newPassword},$http.post(url,data)},function(instance){return instance.userSettings=service}},module=angular.module("taigaResources"),module.factory("$tgUserSettingsResourcesProvider",["$tgConfig","$tgRepo","$tgHttp","$tgUrls","$q",resourceProvider])}.call(this),function(){var module,resourceProvider,sizeFormat,taiga;taiga=this.taiga,sizeFormat=this.taiga.sizeFormat,resourceProvider=function($http,$urls){var service;return service={},service.contacts=function(userId,options){var httpOptions,url;return null==options&&(options={}),url=$urls.resolve("user-contacts",userId),httpOptions={headers:{}},options.enablePagination||(httpOptions.headers["x-disable-pagination"]="1"),$http.get(url,{},httpOptions).then(function(result){return result.data})},function(instance){return instance.users=service}},module=angular.module("taigaResources"),module.factory("$tgUsersResourcesProvider",["$tgHttp","$tgUrls","$q",resourceProvider])}.call(this),function(){var generateHash,module,resourceProvider,taiga;taiga=this.taiga,generateHash=taiga.generateHash,resourceProvider=function($repo,$http,$urls,$storage){var hashSuffix,service;return service={},hashSuffix="userstories-queryparams",service.get=function(projectId,usId){var params;return params=service.getQueryParams(projectId),params.project=projectId,$repo.queryOne("userstories",usId,params)},service.getByRef=function(projectId,ref){var params;return params=service.getQueryParams(projectId),params.project=projectId,params.ref=ref,$repo.queryOne("userstories","by_ref",params)},service.listInAllProjects=function(filters){return $repo.queryMany("userstories",filters)},service.filtersData=function(params){return $repo.queryOneRaw("userstories-filters",null,params)},service.listUnassigned=function(projectId,filters){var params;return params={project:projectId,milestone:"null"},params=_.extend({},params,filters||{}),service.storeQueryParams(projectId,params),$repo.queryMany("userstories",params)},service.listAll=function(projectId,filters){var params;return params={project:projectId},params=_.extend({},params,filters||{}),service.storeQueryParams(projectId,params),$repo.queryMany("userstories",params)},service.bulkCreate=function(projectId,status,bulk){var data,url;return data={project_id:projectId,status_id:status,bulk_stories:bulk},url=$urls.resolve("bulk-create-us"),$http.post(url,data)},service.upvote=function(userStoryId){var url;return url=$urls.resolve("userstory-upvote",userStoryId),$http.post(url)},service.downvote=function(userStoryId){var url;return url=$urls.resolve("userstory-downvote",userStoryId),$http.post(url)},service.watch=function(userStoryId){var url;return url=$urls.resolve("userstory-watch",userStoryId),$http.post(url)},service.unwatch=function(userStoryId){var url;return url=$urls.resolve("userstory-unwatch",userStoryId),$http.post(url)},service.bulkUpdateBacklogOrder=function(projectId,data){var params,url;return url=$urls.resolve("bulk-update-us-backlog-order"),params={project_id:projectId,bulk_stories:data},$http.post(url,params)},service.bulkUpdateSprintOrder=function(projectId,data){var params,url;return url=$urls.resolve("bulk-update-us-sprint-order"),params={project_id:projectId,bulk_stories:data},$http.post(url,params)},service.bulkUpdateKanbanOrder=function(projectId,data){var params,url;return url=$urls.resolve("bulk-update-us-kanban-order"),params={project_id:projectId,bulk_stories:data},$http.post(url,params)},service.listValues=function(projectId,type){var params;return params={project:projectId},service.storeQueryParams(projectId,params),$repo.queryMany(type,params)},service.storeQueryParams=function(projectId,params){var hash,ns;return ns=projectId+":"+hashSuffix,hash=generateHash([projectId,ns]),$storage.set(hash,params)},service.getQueryParams=function(projectId){var hash,ns;return ns=projectId+":"+hashSuffix,hash=generateHash([projectId,ns]),$storage.get(hash)||{}},service.storeShowTags=function(projectId,showTags){var hash;return hash=generateHash([projectId,"showTags"]),$storage.set(hash,showTags)},service.getShowTags=function(projectId){var hash;return hash=generateHash([projectId,"showTags"]),$storage.get(hash)||null},function(instance){return instance.userstories=service}},module=angular.module("taigaResources"),module.factory("$tgUserstoriesResourcesProvider",["$tgRepo","$tgHttp","$tgUrls","$tgStorage",resourceProvider])}.call(this),function(){var module,resourceProvider;resourceProvider=function($repo,$urls,$http){var service;return service={},service.list=function(webhookId){var params;return params={webhook:webhookId},$repo.queryMany("webhooklogs",params)},service.resend=function(webhooklogId){var url;return url=$urls.resolve("webhooklogs-resend",webhooklogId),$http.post(url)},function(instance){return instance.webhooklogs=service}},module=angular.module("taigaResources"),module.factory("$tgWebhookLogsResourcesProvider",["$tgRepo","$tgUrls","$tgHttp",resourceProvider])}.call(this),function(){var module,resourceProvider;resourceProvider=function($repo,$urls,$http){var service;return service={},service.list=function(projectId){var params;return params={project:projectId},$repo.queryMany("webhooks",params)},service.test=function(webhookId){var url;return url=$urls.resolve("webhooks-test",webhookId),$http.post(url)},function(instance){return instance.webhooks=service}},module=angular.module("taigaResources"),module.factory("$tgWebhooksResourcesProvider",["$tgRepo","$tgUrls","$tgHttp",resourceProvider])}.call(this),function(){var module,resourceProvider,taiga;taiga=this.taiga,resourceProvider=function($repo,$http,$urls){var service;return service={},service.get=function(wikiId){return $repo.queryOne("wiki",wikiId)},service.getBySlug=function(projectId,slug){return $repo.queryOne("wiki","by_slug?project="+projectId+"&slug="+slug)},service.listLinks=function(projectId){return $repo.queryMany("wiki-links",{project:projectId})},function(instance){return instance.wiki=service}},module=angular.module("taigaResources"),module.factory("$tgWikiResourcesProvider",["$tgRepo","$tgHttp","$tgUrls",resourceProvider])}.call(this),function(){var UserChangePasswordController,UserChangePasswordDirective,debounce,mixOf,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,debounce=this.taiga.debounce,module=angular.module("taigaUserSettings"),UserChangePasswordController=function(superClass){function UserChangePasswordController(scope,rootscope,repo,confirm,rs,params,q,location,navUrls,auth,translate){this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.navUrls=navUrls,this.auth=auth,this.translate=translate,this.scope.sectionName=this.translate.instant("CHANGE_PASSWORD.SECTION_NAME"),this.scope.user=this.auth.getUser()}return extend(UserChangePasswordController,superClass),UserChangePasswordController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth","$translate"],UserChangePasswordController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("UserChangePasswordController",UserChangePasswordController),UserChangePasswordDirective=function($rs,$confirm,$loading,$translate){var link;return link=function($scope,$el,$attrs,ctrl){var submit,submitButton;return submit=debounce(2e3,function(_this){return function(event){var currentLoading,promise;return event.preventDefault(),$scope.newPassword1!==$scope.newPassword2?void $confirm.notify("error",$translate.instant("CHANGE_PASSWORD.ERROR_PASSWORD_MATCH")):(currentLoading=$loading().target(submitButton).start(),promise=$rs.userSettings.changePassword($scope.currentPassword,$scope.newPassword1),promise.then(function(){return currentLoading.finish(),$confirm.notify("success")}),promise.then(null,function(response){return currentLoading.finish(),$confirm.notify("error",response.data._error_message)}))}}(this)),submitButton=$el.find(".submit-button"),$el.on("submit","form",submit),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgUserChangePassword",["$tgResources","$tgConfirm","$tgLoading","$translate",UserChangePasswordDirective])}.call(this),function(){var DeleteUserDirective,bindOnce,debounce,module,taiga;taiga=this.taiga,bindOnce=this.taiga.bindOnce,debounce=this.taiga.debounce,module=angular.module("taigaUserSettings"),DeleteUserDirective=function($repo,$rootscope,$auth,$location,$navUrls,lightboxService){var link;return link=function($scope,$el,$attrs){var submit;return $scope.$on("deletelightbox:new",function(ctx,user){return lightboxService.open($el)}),$scope.$on("$destroy",function(){return $el.off()}),submit=function(){var promise;return promise=$repo.remove($scope.user),promise.then(function(data){return lightboxService.close($el),$auth.logout(),$location.path($navUrls.resolve("login"))}),promise.then(null,function(){return console.log("FAIL")})},$el.on("click",".button-red",function(event){return event.preventDefault(),lightboxService.close($el)}),$el.on("click",".button-green",debounce(2e3,function(event){return event.preventDefault(),submit()}))},{link:link,templateUrl:"user/lightbox/lightbox-delete-account.html"}},module.directive("tgLbDeleteUser",["$tgRepo","$rootScope","$tgAuth","$tgLocation","$tgNavUrls","lightboxService",DeleteUserDirective])}.call(this),function(){var TaigaAvatarModelDirective,UserAvatarDirective,UserProfileDirective,UserSettingsController,debounce,mixOf,module,sizeFormat,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,sizeFormat=this.taiga.sizeFormat,module=angular.module("taigaUserSettings"),debounce=this.taiga.debounce,UserSettingsController=function(superClass){function UserSettingsController(scope,rootscope,config,repo,confirm,rs,params,q,location,navUrls,auth,translate){var maxFileSize,promise,text;this.scope=scope,this.rootscope=rootscope,this.config=config,this.repo=repo,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.navUrls=navUrls,this.auth=auth,this.translate=translate,this.scope.sectionName="USER_SETTINGS.MENU.SECTION_TITLE",this.scope.project={},this.scope.user=this.auth.getUser(),this.scope.user||(this.location.path(this.navUrls.resolve("permission-denied")),this.location.replace()),this.scope.lang=this.getLan(),this.scope.theme=this.getTheme(),maxFileSize=this.config.get("maxUploadFileSize",null),maxFileSize&&(text=this.translate.instant("USER_SETTINGS.AVATAR_MAX_SIZE",{maxFileSize:sizeFormat(maxFileSize)}),this.scope.maxFileSizeMsg=text),promise=this.loadInitialData(),promise.then(null,this.onInitialDataError.bind(this))}return extend(UserSettingsController,superClass),UserSettingsController.$inject=["$scope","$rootScope","$tgConfig","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth","$translate"],UserSettingsController.prototype.loadInitialData=function(){return this.scope.availableThemes=this.config.get("themes",[]),this.rs.locales.list().then(function(_this){return function(locales){return _this.scope.locales=locales,locales}}(this))},UserSettingsController.prototype.openDeleteLightbox=function(){return this.rootscope.$broadcast("deletelightbox:new",this.scope.user)},UserSettingsController.prototype.getLan=function(){return this.scope.user.lang||this.translate.preferredLanguage()},UserSettingsController.prototype.getTheme=function(){return this.scope.user.theme||this.config.get("defaultTheme")||"taiga"},UserSettingsController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("UserSettingsController",UserSettingsController),UserProfileDirective=function($confirm,$auth,$repo,$translate){var link;return link=function($scope,$el,$attrs){var submit;return submit=debounce(2e3,function(_this){return function(event){var changeEmail,form,onError,onSuccess;return event.preventDefault(),form=$el.find("form").checksley(),form.validate()?(changeEmail=$scope.user.isAttributeModified("email"),$scope.user.lang=$scope.lang,$scope.user.theme=$scope.theme,onSuccess=function(data){var text;return $auth.setUser(data),changeEmail?(text=$translate.instant("USER_PROFILE.CHANGE_EMAIL_SUCCESS"),$confirm.success(text)):$confirm.notify("success")},onError=function(data){return form.setErrors(data),$confirm.notify("error",data._error_message)},$repo.save($scope.user).then(onSuccess,onError)):void 0}}(this)),$el.on("submit","form",submit),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgUserProfile",["$tgConfirm","$tgAuth","$tgRepo","$translate",UserProfileDirective]),UserAvatarDirective=function($auth,$model,$rs,$confirm){var link;return link=function($scope,$el,$attrs){var onError,onSuccess,showSizeInfo;return showSizeInfo=function(){return $el.find(".size-info").removeClass("hidden")},onSuccess=function(response){var user;return user=$model.make_model("users",response.data),$auth.setUser(user),$scope.user=user,$el.find(".loading-overlay").removeClass("active"),$confirm.notify("success")},onError=function(response){return 413===response.status&&showSizeInfo(),$el.find(".loading-overlay").removeClass("active"),$confirm.notify("error",response.data._error_message)},$el.on("click",".js-change-avatar",function(){return $el.find("#avatar-field").click()}),$el.on("change","#avatar-field",function(event){return $scope.avatarAttachment?($el.find(".loading-overlay").addClass("active"),$rs.userSettings.changeAvatar($scope.avatarAttachment).then(onSuccess,onError)):void 0}),$el.on("click","a.js-use-gravatar",function(event){return $el.find(".loading-overlay").addClass("active"),$rs.userSettings.removeAvatar().then(onSuccess,onError)}),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgUserAvatar",["$tgAuth","$tgModel","$tgResources","$tgConfirm",UserAvatarDirective]),TaigaAvatarModelDirective=function($parse){var link;return link=function($scope,$el,$attrs){var model,modelSetter;return model=$parse($attrs.tgAvatarModel),modelSetter=model.assign,$el.bind("change",function(){return $scope.$apply(function(){return modelSetter($scope,$el[0].files[0])})})},{link:link}},module.directive("tgAvatarModel",["$parse",TaigaAvatarModelDirective])}.call(this),function(){var UserSettingsNavigationDirective,module;UserSettingsNavigationDirective=function(){var link;return link=function($scope,$el,$attrs){var section;return section=$attrs.tgUserSettingsNavigation,$el.find(".active").removeClass("active"),$el.find("#usersettingsmenu-"+section+" a").addClass("active"),$scope.$on("$destroy",function(){return $el.off()})},{link:link}},module=angular.module("taigaUserSettings"),module.directive("tgUserSettingsNavigation",UserSettingsNavigationDirective)}.call(this),function(){var UserNotificationsController,UserNotificationsDirective,UserNotificationsListDirective,bindOnce,mixOf,module,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,mixOf=this.taiga.mixOf,bindOnce=this.taiga.bindOnce,module=angular.module("taigaUserSettings"),UserNotificationsController=function(superClass){ +function UserNotificationsController(scope,rootscope,repo,confirm,rs,params,q,location,navUrls,auth){var promise;this.scope=scope,this.rootscope=rootscope,this.repo=repo,this.confirm=confirm,this.rs=rs,this.params=params,this.q=q,this.location=location,this.navUrls=navUrls,this.auth=auth,this.scope.sectionName="USER_SETTINGS.NOTIFICATIONS.SECTION_NAME",this.scope.user=this.auth.getUser(),promise=this.loadInitialData(),promise.then(null,this.onInitialDataError.bind(this))}return extend(UserNotificationsController,superClass),UserNotificationsController.$inject=["$scope","$rootScope","$tgRepo","$tgConfirm","$tgResources","$routeParams","$q","$tgLocation","$tgNavUrls","$tgAuth"],UserNotificationsController.prototype.loadInitialData=function(){return this.rs.notifyPolicies.list().then(function(_this){return function(notifyPolicies){return _this.scope.notifyPolicies=notifyPolicies,notifyPolicies}}(this))},UserNotificationsController}(mixOf(taiga.Controller,taiga.PageMixin)),module.controller("UserNotificationsController",UserNotificationsController),UserNotificationsDirective=function(){var link;return link=function($scope,$el,$attrs){return $scope.$on("$destroy",function(){return $el.off()})},{link:link}},module.directive("tgUserNotifications",UserNotificationsDirective),UserNotificationsListDirective=function($repo,$confirm,$compile){var link,template;return template=_.template('<% _.each(notifyPolicies, function (notifyPolicy, index) { %>\n
\n
<%- notifyPolicy.project_name %>
\n
\n
\n checked="checked"<% } %>/>\n \n
\n
\n
\n
\n checked="checked"<% } %> />\n \n
\n
\n
\n
\n checked="checked"<% } %> />\n \n
\n
\n
\n<% }) %>'),link=function($scope,$el,$attrs){var render;return render=function(){var ctx,html;return $el.off(),ctx={notifyPolicies:$scope.notifyPolicies},html=template(ctx),$el.html($compile(html)($scope)),$el.on("change","input[type=radio]",function(event){var onError,onSuccess,policy,policyIndex,prev_level,target;return target=angular.element(event.currentTarget),policyIndex=target.parents(".policy-table-row").data("index"),policy=$scope.notifyPolicies[policyIndex],prev_level=policy.notify_level,policy.notify_level=parseInt(target.val(),10),onSuccess=function(){return $confirm.notify("success")},onError=function(){return $confirm.notify("error"),target.parents(".policy-table-row").find("input[value="+prev_level+"]").prop("checked",!0)},$repo.save(policy).then(onSuccess,onError)})},$scope.$on("$destroy",function(){return $el.off()}),bindOnce($scope,$attrs.ngModel,render)},{link:link}},module.directive("tgUserNotificationsList",["$tgRepo","$tgConfirm","$compile",UserNotificationsListDirective])}.call(this),function(){angular.module("taigaComponents",[])}.call(this),function(){var module;module=angular.module("taigaDiscover",[])}.call(this),function(){var module;module=angular.module("taigaExternalApps",[])}.call(this),function(){var module;module=angular.module("taigaHome",[])}.call(this),function(){angular.module("taigaNavigationBar",[])}.call(this),function(){var module;module=angular.module("taigaProfile",[])}.call(this),function(){angular.module("taigaProjects",[])}.call(this),function(){angular.module("taigaResources2",[])}.call(this),function(){angular.module("taigaUserTimeline",[])}.call(this),function(){var AttachmentLinkDirective;AttachmentLinkDirective=function($parse,lightboxFactory){var link;return link=function(scope,el,attrs){var attachment;return attachment=$parse(attrs.tgAttachmentLink)(scope),el.on("click",function(event){return taiga.isImage(attachment.getIn(["file","name"]))?(event.preventDefault(),scope.$apply(function(){return lightboxFactory.create("tg-lb-attachment-preview",{"class":"lightbox lightbox-block"},{file:attachment.get("file")})})):void 0}),scope.$on("$destroy",function(){return el.off()})},{link:link}},AttachmentLinkDirective.$inject=["$parse","tgLightboxFactory"],angular.module("taigaComponents").directive("tgAttachmentLink",AttachmentLinkDirective)}.call(this),function(){var AttachmentGalleryDirective;AttachmentGalleryDirective=function(){var link;return link=function(scope,el,attrs,ctrl){},{scope:{},bindToController:{attachment:"=",onDelete:"&",onUpdate:"&",type:"="},controller:"Attachment",controllerAs:"vm",templateUrl:"components/attachment/attachment-gallery.html",link:link}},AttachmentGalleryDirective.$inject=[],angular.module("taigaComponents").directive("tgAttachmentGallery",AttachmentGalleryDirective)}.call(this),function(){var AttachmentController;AttachmentController=function(){function AttachmentController(attachmentsService,translate){this.attachmentsService=attachmentsService,this.translate=translate,this.form={},this.form.description=this.attachment.getIn(["file","description"]),this.form.is_deprecated=this.attachment.get(["file","is_deprecated"]),this.title=this.translate.instant("ATTACHMENT.TITLE",{fileName:this.attachment.get("name"),date:moment(this.attachment.get("created_date")).format(this.translate.instant("ATTACHMENT.DATE"))})}return AttachmentController.$inject=["tgAttachmentsService","$translate"],AttachmentController.prototype.editMode=function(mode){var attachment;return attachment=this.attachment.set("editable",mode),this.onUpdate({attachment:attachment})},AttachmentController.prototype["delete"]=function(){return this.onDelete({attachment:this.attachment})},AttachmentController.prototype.save=function(){var attachment;return attachment=this.attachment.set("loading",!0),this.onUpdate({attachment:attachment}),attachment=this.attachment.merge({editable:!1,loading:!1}),attachment=attachment.mergeIn(["file"],{description:this.form.description,is_deprecated:!!this.form.is_deprecated}),this.onUpdate({attachment:attachment})},AttachmentController}(),angular.module("taigaComponents").controller("Attachment",AttachmentController)}.call(this),function(){var AttachmentDirective;AttachmentDirective=function(){var link;return link=function(scope,el,attrs,ctrl){},{scope:{},bindToController:{attachment:"=",onDelete:"&",onUpdate:"&",type:"="},controller:"Attachment",controllerAs:"vm",templateUrl:"components/attachment/attachment.html",link:link}},AttachmentDirective.$inject=[],angular.module("taigaComponents").directive("tgAttachment",AttachmentDirective)}.call(this),function(){var AttachmentsDropDirective;AttachmentsDropDirective=function($parse){var link;return link=function(scope,el,attrs){var eventAttr;return eventAttr=$parse(attrs.tgAttachmentsDrop),el.on("dragover",function(e){return e.preventDefault(),!1}),el.on("drop",function(e){var dataTransfer;return e.stopPropagation(),e.preventDefault(),dataTransfer=e.dataTransfer||e.originalEvent&&e.originalEvent.dataTransfer,scope.$apply(function(){return eventAttr(scope,{files:dataTransfer.files})})}),scope.$on("$destroy",function(){return el.off()})},{link:link}},AttachmentsDropDirective.$inject=["$parse"],angular.module("taigaComponents").directive("tgAttachmentsDrop",AttachmentsDropDirective)}.call(this),function(){var AttachmentsFullController,sizeFormat;sizeFormat=this.taiga.sizeFormat,AttachmentsFullController=function(){function AttachmentsFullController(translate,confirm,config,storage,attachmentsFullService){this.translate=translate,this.confirm=confirm,this.config=config,this.storage=storage,this.attachmentsFullService=attachmentsFullService,this.mode=this.storage.get("attachment-mode","list"),this.maxFileSize=this.config.get("maxUploadFileSize",null),this.maxFileSize&&(this.maxFileSize=sizeFormat(this.maxFileSize)),this.maxFileSizeMsg=this.maxFileSize?this.translate.instant("ATTACHMENT.MAX_UPLOAD_SIZE",{maxFileSize:this.maxFileSize}):"",taiga.defineImmutableProperty(this,"attachments",function(_this){return function(){return _this.attachmentsFullService.attachments}}(this)),taiga.defineImmutableProperty(this,"deprecatedsCount",function(_this){return function(){return _this.attachmentsFullService.deprecatedsCount}}(this)),taiga.defineImmutableProperty(this,"attachmentsVisible",function(_this){return function(){return _this.attachmentsFullService.attachmentsVisible}}(this)),taiga.defineImmutableProperty(this,"deprecatedsVisible",function(_this){return function(){return _this.attachmentsFullService.deprecatedsVisible}}(this))}return AttachmentsFullController.$inject=["$translate","$tgConfirm","$tgConfig","$tgStorage","tgAttachmentsFullService"],AttachmentsFullController.prototype.uploadingAttachments=function(){return this.attachmentsFullService.uploadingAttachments},AttachmentsFullController.prototype.addAttachment=function(file){var editable;return editable="list"===this.mode,this.attachmentsFullService.addAttachment(this.projectId,this.objId,this.type,file,editable)},AttachmentsFullController.prototype.setMode=function(mode){return this.mode=mode,this.storage.set("attachment-mode",mode)},AttachmentsFullController.prototype.toggleDeprecatedsVisible=function(){return this.attachmentsFullService.toggleDeprecatedsVisible()},AttachmentsFullController.prototype.addAttachments=function(files){return _.forEach(files,function(_this){return function(file){return _this.addAttachment(file)}}(this))},AttachmentsFullController.prototype.loadAttachments=function(){return this.attachmentsFullService.loadAttachments(this.type,this.objId,this.projectId)},AttachmentsFullController.prototype.deleteAttachment=function(toDeleteAttachment){var message,title;return title=this.translate.instant("ATTACHMENT.TITLE_LIGHTBOX_DELETE_ATTACHMENT"),message=this.translate.instant("ATTACHMENT.MSG_LIGHTBOX_DELETE_ATTACHMENT",{fileName:toDeleteAttachment.getIn(["file","name"])}),this.confirm.askOnDelete(title,message).then(function(_this){return function(askResponse){var onError,onSuccess;return onError=function(){return message=_this.translate.instant("ATTACHMENT.ERROR_DELETE_ATTACHMENT",{errorMessage:message}),_this.confirm.notify("error",null,message),askResponse.finish(!1)},onSuccess=function(){return askResponse.finish()},_this.attachmentsFullService.deleteAttachment(toDeleteAttachment,_this.type).then(onSuccess,onError)}}(this))},AttachmentsFullController.prototype.reorderAttachment=function(attachment,newIndex){return this.attachmentsFullService.reorderAttachment(this.type,attachment,newIndex)},AttachmentsFullController.prototype.updateAttachment=function(toUpdateAttachment){return this.attachmentsFullService.updateAttachment(toUpdateAttachment,this.type)},AttachmentsFullController}(),angular.module("taigaComponents").controller("AttachmentsFull",AttachmentsFullController)}.call(this),function(){var AttachmentsFullDirective,bindOnce;bindOnce=this.taiga.bindOnce,AttachmentsFullDirective=function(){var link;return link=function(scope,el,attrs,ctrl){return bindOnce(scope,"vm.objId",function(value){return ctrl.loadAttachments()})},{scope:{},bindToController:{type:"@",objId:"=",projectId:"="},controller:"AttachmentsFull",controllerAs:"vm",templateUrl:"components/attachments-full/attachments-full.html",link:link}},AttachmentsFullDirective.$inject=[],angular.module("taigaComponents").directive("tgAttachmentsFull",AttachmentsFullDirective)}.call(this),function(){var AttachmentsFullService,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;AttachmentsFullService=function(superClass){function AttachmentsFullService(attachmentsService,rootScope){this.attachmentsService=attachmentsService,this.rootScope=rootScope,this._attachments=Immutable.List(),this._deprecatedsCount=0,this._attachmentsVisible=Immutable.List(),this._deprecatedsVisible=!1,this.uploadingAttachments=[],taiga.defineImmutableProperty(this,"attachments",function(_this){return function(){return _this._attachments}}(this)),taiga.defineImmutableProperty(this,"deprecatedsCount",function(_this){return function(){return _this._deprecatedsCount}}(this)),taiga.defineImmutableProperty(this,"attachmentsVisible",function(_this){return function(){return _this._attachmentsVisible}}(this)),taiga.defineImmutableProperty(this,"deprecatedsVisible",function(_this){return function(){return _this._deprecatedsVisible}}(this))}return extend(AttachmentsFullService,superClass),AttachmentsFullService.$inject=["tgAttachmentsService","$rootScope"],AttachmentsFullService.prototype.toggleDeprecatedsVisible=function(){return this._deprecatedsVisible=!this._deprecatedsVisible,this.regenerate()},AttachmentsFullService.prototype.regenerate=function(){return this._deprecatedsCount=this._attachments.count(function(it){return it.getIn(["file","is_deprecated"])}),this._deprecatedsVisible?this._attachmentsVisible=this._attachments:this._attachmentsVisible=this._attachments.filter(function(it){return!it.getIn(["file","is_deprecated"])})},AttachmentsFullService.prototype.addAttachment=function(projectId,objId,type,file,editable){return null==editable&&(editable=!0),new Promise(function(_this){return function(resolve,reject){var promise;return _this.attachmentsService.validate(file)?(_this.uploadingAttachments.push(file),promise=_this.attachmentsService.upload(file,objId,projectId,type),promise.then(function(file){var attachment;return _this.uploadingAttachments=_this.uploadingAttachments.filter(function(uploading){return uploading.name!==file.get("name")}),attachment=Immutable.Map(),attachment=attachment.merge({file:file,editable:editable,loading:!1}),_this._attachments=_this._attachments.push(attachment),_this.regenerate(),_this.rootScope.$broadcast("attachment:create"),resolve(attachment)})):reject(file)}}(this))},AttachmentsFullService.prototype.loadAttachments=function(type,objId,projectId){return this.attachmentsService.list(type,objId,projectId).then(function(_this){return function(files){return _this._attachments=files.map(function(file){var attachment;return attachment=Immutable.Map(),attachment.merge({loading:!1,editable:!1,file:file})}),_this.regenerate()}}(this))},AttachmentsFullService.prototype.deleteAttachment=function(toDeleteAttachment,type){var onSuccess;return onSuccess=function(_this){return function(){return _this._attachments=_this._attachments.filter(function(attachment){return attachment!==toDeleteAttachment}),_this.regenerate()}}(this),this.attachmentsService["delete"](type,toDeleteAttachment.getIn(["file","id"])).then(onSuccess)},AttachmentsFullService.prototype.reorderAttachment=function(type,attachment,newIndex){var attachments,oldIndex,promises;return oldIndex=this.attachments.findIndex(function(it){return it===attachment}),oldIndex!==newIndex?(attachments=this.attachments.remove(oldIndex),attachments=attachments.splice(newIndex,0,attachment),attachments=attachments.map(function(x,i){return x.setIn(["file","order"],i+1)}),promises=[],attachments.forEach(function(_this){return function(attachment){var patch;return patch={order:attachment.getIn(["file","order"])},promises.push(_this.attachmentsService.patch(attachment.getIn(["file","id"]),type,patch))}}(this)),Promise.all(promises).then(function(_this){return function(){return _this._attachments=attachments,_this.regenerate()}}(this))):void 0},AttachmentsFullService.prototype.updateAttachment=function(toUpdateAttachment,type){var index,oldAttachment,patch;return index=this._attachments.findIndex(function(attachment){return attachment.getIn(["file","id"])===toUpdateAttachment.getIn(["file","id"])}),oldAttachment=this._attachments.get(index),patch=taiga.patch(oldAttachment.get("file"),toUpdateAttachment.get("file")),toUpdateAttachment.get("loading")?(this._attachments=this._attachments.set(index,toUpdateAttachment),this.regenerate()):this.attachmentsService.patch(toUpdateAttachment.getIn(["file","id"]),type,patch).then(function(_this){return function(){return _this._attachments=_this._attachments.set(index,toUpdateAttachment),_this.regenerate()}}(this))},AttachmentsFullService}(taiga.Service),angular.module("taigaComponents").service("tgAttachmentsFullService",AttachmentsFullService)}.call(this),function(){var AttachmentsSimpleController;AttachmentsSimpleController=function(){function AttachmentsSimpleController(attachmentsService){this.attachmentsService=attachmentsService}return AttachmentsSimpleController.$inject=["tgAttachmentsService"],AttachmentsSimpleController.prototype.addAttachment=function(file){var attachment;return attachment=Immutable.fromJS({file:file,name:file.name,size:file.size}),this.attachmentsService.validate(file)&&(this.attachments=this.attachments.push(attachment),this.onAdd)?this.onAdd({attachment:attachment}):void 0},AttachmentsSimpleController.prototype.addAttachments=function(files){return _.forEach(files,this.addAttachment.bind(this))},AttachmentsSimpleController.prototype.deleteAttachment=function(toDeleteAttachment){return this.attachments=this.attachments.filter(function(attachment){return attachment!==toDeleteAttachment}),this.onDelete?this.onDelete({attachment:toDeleteAttachment}):void 0},AttachmentsSimpleController}(),angular.module("taigaComponents").controller("AttachmentsSimple",AttachmentsSimpleController)}.call(this),function(){var AttachmentsSimpleDirective;AttachmentsSimpleDirective=function(){var link;return link=function(scope,el,attrs,ctrl){},{scope:{},bindToController:{attachments:"=",onAdd:"&",onDelete:"&"},controller:"AttachmentsSimple",controllerAs:"vm",templateUrl:"components/attachments-simple/attachments-simple.html",link:link}},AttachmentsSimpleDirective.$inject=[],angular.module("taigaComponents").directive("tgAttachmentsSimple",AttachmentsSimpleDirective)}.call(this),function(){var AttachmentSortableDirective;AttachmentSortableDirective=function($parse){var link;return link=function(scope,el,attrs){var callback;return callback=$parse(attrs.tgAttachmentsSortable),el.sortable({items:"div[tg-bind-scope]",handle:"a.settings.icon.icon-drag-v",containment:".attachments",dropOnEmpty:!0,helper:"clone",scroll:!1,tolerance:"pointer",placeholder:"sortable-placeholder single-attachment"}),el.on("sortstop",function(event,ui){var attachment,newIndex;return attachment=ui.item.scope().attachment,newIndex=ui.item.index(),scope.$apply(function(){return callback(scope,{attachment:attachment,index:newIndex})})}),scope.$on("$destroy",function(){return el.off()})},{link:link}},AttachmentSortableDirective.$inject=["$parse"],angular.module("taigaComponents").directive("tgAttachmentsSortable",AttachmentSortableDirective)}.call(this),function(){var AutoSelectDirective;AutoSelectDirective=function($timeout){return{link:function(scope,elm){return $timeout(function(){return elm[0].select()})}}},AutoSelectDirective.$inject=["$timeout"],angular.module("taigaComponents").directive("tgAutoSelect",AutoSelectDirective)}.call(this),function(){var FileChangeDirective;FileChangeDirective=function($parse){var link;return link=function(scope,el,attrs,ctrl){var eventAttr;return eventAttr=$parse(attrs.tgFileChange),el.on("change",function(event){return scope.$apply(function(){return eventAttr(scope,{files:event.currentTarget.files})})}),scope.$on("$destroy",function(){return el.off()})},{require:"ngModel",restrict:"A",link:link}},FileChangeDirective.$inject=["$parse"],angular.module("taigaComponents").directive("tgFileChange",FileChangeDirective)}.call(this),function(){var JoyRideDirective,taiga;taiga=this.taiga,JoyRideDirective=function($rootScope,currentUserService,joyRideService,$location,$translate){var link;return link=function(scope,el,attrs,ctrl){var initJoyrRide,intro,unsuscribe;return unsuscribe=null,intro=introJs(),intro.oncomplete(function(){return $("html,body").scrollTop(0)}),intro.onexit(function(){return currentUserService.disableJoyRide()}),initJoyrRide=function(next,config){return config[next.joyride]?(intro.setOptions({exitOnEsc:!1,exitOnOverlayClick:!1,showStepNumbers:!1,nextLabel:$translate.instant("JOYRIDE.NAV.NEXT")+" →",prevLabel:"← "+$translate.instant("JOYRIDE.NAV.BACK"),skipLabel:$translate.instant("JOYRIDE.NAV.SKIP"),doneLabel:$translate.instant("JOYRIDE.NAV.DONE"),disableInteraction:!0}),intro.setOption("steps",joyRideService.get(next.joyride)),intro.start()):void 0},$rootScope.$on("$routeChangeSuccess",function(event,next){return next.joyride&¤tUserService.isAuthenticated()?(intro.oncomplete(function(){return currentUserService.disableJoyRide(next.joyride)}),next.loader?unsuscribe=$rootScope.$on("loader:end",function(){return currentUserService.loadJoyRideConfig().then(function(config){return initJoyrRide(next,config)}),unsuscribe()}):currentUserService.loadJoyRideConfig().then(function(config){return initJoyrRide(next,config)})):(intro.exit(),void(unsuscribe&&unsuscribe()))})},{scope:{},link:link}},JoyRideDirective.$inject=["$rootScope","tgCurrentUserService","tgJoyRideService","$location","$translate"],angular.module("taigaComponents").directive("tgJoyRide",JoyRideDirective)}.call(this),function(){var JoyRideService,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;JoyRideService=function(superClass){function JoyRideService(translate,checkPermissionsService){this.translate=translate,this.checkPermissionsService=checkPermissionsService}return extend(JoyRideService,superClass),JoyRideService.$inject=["$translate","tgCheckPermissionsService"],JoyRideService.prototype.getConfig=function(){return{dashboard:function(_this){return function(){var steps;return steps=[{element:".project-list > section:not(.ng-hide)",position:"left",joyride:{title:_this.translate.instant("JOYRIDE.DASHBOARD.STEP1.TITLE"),text:_this.translate.instant("JOYRIDE.DASHBOARD.STEP1.TEXT")}},{element:".working-on-container",position:"right",joyride:{title:_this.translate.instant("JOYRIDE.DASHBOARD.STEP2.TITLE"),text:_this.translate.instant("JOYRIDE.DASHBOARD.STEP2.TEXT")}},{element:".watching-container",position:"right",joyride:{title:_this.translate.instant("JOYRIDE.DASHBOARD.STEP3.TITLE"),text:[_this.translate.instant("JOYRIDE.DASHBOARD.STEP3.TEXT1"),_this.translate.instant("JOYRIDE.DASHBOARD.STEP3.TEXT2")]}}],$(".project-list .create-project-button").is(":hidden")||steps.push({element:".project-list .create-project-button",position:"bottom",joyride:{title:_this.translate.instant("JOYRIDE.DASHBOARD.STEP4.TITLE"),text:[_this.translate.instant("JOYRIDE.DASHBOARD.STEP4.TEXT1"),_this.translate.instant("JOYRIDE.DASHBOARD.STEP4.TEXT2")]}}),steps}}(this),backlog:function(_this){return function(){var steps;return steps=[{element:".summary",position:"bottom",joyride:{title:_this.translate.instant("JOYRIDE.BACKLOG.STEP1.TITLE"),text:[_this.translate.instant("JOYRIDE.BACKLOG.STEP1.TEXT1"),_this.translate.instant("JOYRIDE.BACKLOG.STEP1.TEXT2")]}},{element:".backlog-table-empty",position:"bottom",joyride:{title:_this.translate.instant("JOYRIDE.BACKLOG.STEP2.TITLE"),text:_this.translate.instant("JOYRIDE.BACKLOG.STEP2.TEXT")}},{element:".sprints",position:"left",joyride:{title:_this.translate.instant("JOYRIDE.BACKLOG.STEP3.TITLE"),text:_this.translate.instant("JOYRIDE.BACKLOG.STEP3.TEXT")}}],_this.checkPermissionsService.check("add_us")&&steps.push({element:".new-us",position:"rigth",joyride:{title:_this.translate.instant("JOYRIDE.BACKLOG.STEP4.TITLE"),text:_this.translate.instant("JOYRIDE.BACKLOG.STEP4.TEXT")}}),steps}}(this),kanban:function(_this){return function(){var steps;return steps=[{element:".kanban-table-inner",position:"bottom",joyride:{title:_this.translate.instant("JOYRIDE.KANBAN.STEP1.TITLE"),text:_this.translate.instant("JOYRIDE.KANBAN.STEP1.TEXT")}},{element:".card-placeholder",position:"right",joyride:{title:_this.translate.instant("JOYRIDE.KANBAN.STEP2.TITLE"),text:_this.translate.instant("JOYRIDE.KANBAN.STEP2.TEXT")}}],_this.checkPermissionsService.check("add_us")&&steps.push({element:".icon-plus",position:"bottom",joyride:{title:_this.translate.instant("JOYRIDE.KANBAN.STEP3.TITLE"),text:[_this.translate.instant("JOYRIDE.KANBAN.STEP3.TEXT1"),_this.translate.instant("JOYRIDE.KANBAN.STEP3.TEXT2")]}}),steps}}(this)}},JoyRideService.prototype.get=function(name){var joyRide,joyRides;return joyRides=this.getConfig(),joyRide=joyRides[name].call(this),_.map(joyRide,function(item){var html;return html="",item.joyride.title&&(html+="

"+item.joyride.title+"

"),_.isArray(item.joyride.text)?_.forEach(item.joyride.text,function(text){return html+="

"+text+"

"}):html+="

"+item.joyride.text+"

",item.intro=html,item})},JoyRideService}(taiga.Service),angular.module("taigaComponents").service("tgJoyRideService",JoyRideService)}.call(this),function(){var LiveAnnouncementDirective;LiveAnnouncementDirective=function(liveAnnouncementService){var link;return link=function(scope,el,attrs){},{restrict:"AE",scope:{},controllerAs:"vm",controller:function(){return this.close=function(){return liveAnnouncementService.open=!1},Object.defineProperties(this,{open:{get:function(){return liveAnnouncementService.open}},title:{get:function(){return liveAnnouncementService.title}},desc:{get:function(){return liveAnnouncementService.desc}}})},link:link,templateUrl:"components/live-announcement/live-announcement.html"}},LiveAnnouncementDirective.$inject=["tgLiveAnnouncementService"],angular.module("taigaComponents").directive("tgLiveAnnouncement",LiveAnnouncementDirective)}.call(this),function(){var LiveAnnouncementService,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;LiveAnnouncementService=function(superClass){function LiveAnnouncementService(){this.open=!1,this.title="",this.desc=""}return extend(LiveAnnouncementService,superClass),LiveAnnouncementService.prototype.show=function(title,desc){return this.open=!0,this.title=title,this.desc=desc},LiveAnnouncementService}(taiga.Service),angular.module("taigaComponents").service("tgLiveAnnouncementService",LiveAnnouncementService)}.call(this),function(){var COLORS,IMAGES,LOGOS,ProjectLogoSrcDirective,modulo=function(a,b){return(+a%(b=+b)+b)%b};IMAGES=["/"+window._version+"/images/project-logos/project-logo-01.png","/"+window._version+"/images/project-logos/project-logo-02.png","/"+window._version+"/images/project-logos/project-logo-03.png","/"+window._version+"/images/project-logos/project-logo-04.png","/"+window._version+"/images/project-logos/project-logo-05.png"],COLORS=["rgba( 153, 214, 220, 1 )","rgba( 213, 156, 156, 1 )","rgba( 214, 161, 212, 1 )","rgba( 164, 162, 219, 1 )","rgba( 152, 224, 168, 1 )"],LOGOS=_.cartesianProduct(IMAGES,COLORS),ProjectLogoSrcDirective=function($parse){var _getDefaultProjectLogo,link;return _getDefaultProjectLogo=function(project){var idx,key,logo;return key=project.get("slug")+"-"+project.get("id"),idx=modulo(murmurhash3_32_gc(key,42),LOGOS.length),logo=LOGOS[idx],{src:logo[0],color:logo[1]}},link=function(scope,el,attrs){return scope.$watch("project",function(project){var logo,projectLogo;return(project=Immutable.fromJS(project))?(projectLogo=project.get("logo_big_url"),projectLogo?(el.attr("src",projectLogo),el.css("background","")):(logo=_getDefaultProjectLogo(project),el.attr("src",logo.src),el.css("background",logo.color))):void 0}),scope.$on("$destroy",function(){return el.off()})},{link:link,scope:{project:"=tgProjectLogoSrc"}}},ProjectLogoSrcDirective.$inject=["$parse"],angular.module("taigaComponents").directive("tgProjectLogoSrc",ProjectLogoSrcDirective)}.call(this),function(){var ProjectMenuController;ProjectMenuController=function(){function ProjectMenuController(projectService,lightboxFactory){this.projectService=projectService,this.lightboxFactory=lightboxFactory,this.project=null,this.menu=Immutable.Map()}return ProjectMenuController.$inject=["tgProjectService","tgLightboxFactory"],ProjectMenuController.prototype.show=function(){return this.project=this.projectService.project,this.active=this._getActiveSection(),this._setVideoConference(),this._setMenuPermissions()},ProjectMenuController.prototype.hide=function(){return this.project=null,this.menu={}},ProjectMenuController.prototype.search=function(){return this.lightboxFactory.create("tg-search-box",{"class":"lightbox lightbox-search"})},ProjectMenuController.prototype._setVideoConference=function(){var videoconferenceUrl;return videoconferenceUrl=this._videoConferenceUrl(),videoconferenceUrl?this.project=this.project.set("videoconferenceUrl",videoconferenceUrl):void 0},ProjectMenuController.prototype._setMenuPermissions=function(){return this.menu=Immutable.Map({backlog:!1,kanban:!1,issues:!1,wiki:!1}),this.project.get("is_backlog_activated")&&-1!==this.project.get("my_permissions").indexOf("view_us")&&(this.menu=this.menu.set("backlog",!0)),this.project.get("is_kanban_activated")&&-1!==this.project.get("my_permissions").indexOf("view_us")&&(this.menu=this.menu.set("kanban",!0)),this.project.get("is_issues_activated")&&-1!==this.project.get("my_permissions").indexOf("view_issues")&&(this.menu=this.menu.set("issues",!0)),this.project.get("is_wiki_activated")&&-1!==this.project.get("my_permissions").indexOf("view_wiki_pages")?this.menu=this.menu.set("wiki",!0):void 0},ProjectMenuController.prototype._getActiveSection=function(){var indexBacklog,indexKanban,oldSectionName,sectionName,sectionsBreadcrumb;return sectionName=this.projectService.section,sectionsBreadcrumb=this.projectService.sectionsBreadcrumb,indexBacklog=sectionsBreadcrumb.lastIndexOf("backlog"),indexKanban=sectionsBreadcrumb.lastIndexOf("kanban"),(-1!==indexBacklog||-1!==indexKanban)&&(oldSectionName=-1===indexKanban||indexBacklog>indexKanban?"backlog":"kanban"),"backlog-kanban"===sectionName&&("backlog"===oldSectionName||"kanban"===oldSectionName?sectionName=oldSectionName:this.project.get("is_backlog_activated")&&!this.project.get("is_kanban_activated")?sectionName="backlog":!this.project.get("is_backlog_activated")&&this.project.get("is_kanban_activated")&&(sectionName="kanban")),sectionName},ProjectMenuController.prototype._videoConferenceUrl=function(){var baseUrl,url;if("appear-in"===this.project.get("videoconferences"))baseUrl="https://appear.in/";else{if("talky"!==this.project.get("videoconferences"))return"jitsi"===this.project.get("videoconferences")?(baseUrl="https://meet.jit.si/",url=this.project.get("slug")+"-"+taiga.slugify(this.project.get("videoconferences_extra_data")),url=url.replace(/-/g,""),baseUrl+url):"custom"===this.project.get("videoconferences")?this.project.get("videoconferences_extra_data"):"";baseUrl="https://talky.io/"}return url=this.project.get("videoconferences_extra_data")?this.project.get("slug")+"-"+this.project.get("videoconferences_extra_data"):this.project.get("slug"), +baseUrl+url},ProjectMenuController}(),angular.module("taigaComponents").controller("ProjectMenu",ProjectMenuController)}.call(this),function(){var ProjectMenuDirective,taiga;taiga=this.taiga,ProjectMenuDirective=function(projectService,lightboxFactory){var link;return link=function(scope,el,attrs,ctrl){var projectChange;return projectChange=function(){return projectService.project?ctrl.show():ctrl.hide()},scope.$watch(function(){return projectService.project},projectChange),scope.vm.fixed=!1,$(window).on("scroll",function(){var position;return position=$(window).scrollTop(),position>100&&scope.vm.fixed===!1?(scope.vm.fixed=!0,scope.$digest()):100>position&&scope.vm.fixed===!0?(scope.vm.fixed=!1,scope.$digest()):void 0})},{scope:{},controller:"ProjectMenu",controllerAs:"vm",templateUrl:"components/project-menu/project-menu.html",link:link}},ProjectMenuDirective.$inject=["tgProjectService","tgLightboxFactory"],angular.module("taigaComponents").directive("tgProjectMenu",ProjectMenuDirective)}.call(this),function(){var TermsOfServiceAndPrivacyPolicyNoticeDirective;TermsOfServiceAndPrivacyPolicyNoticeDirective=function($config){var link;return link=function(scope,el,attrs){return scope.privacyPolicyUrl=$config.get("privacyPolicyUrl"),scope.termsOfServiceUrl=$config.get("termsOfServiceUrl")},{restrict:"AE",scope:{},link:link,templateUrl:"components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.html"}},angular.module("taigaComponents").directive("tgTermsOfServiceAndPrivacyPolicyNotice",["$tgConfig",TermsOfServiceAndPrivacyPolicyNoticeDirective])}.call(this),function(){var VoteButtonController;VoteButtonController=function(){function VoteButtonController(currentUserService){this.currentUserService=currentUserService,this.user=this.currentUserService.getUser(),this.isMouseOver=!1,this.loading=!1}return VoteButtonController.$inject=["tgCurrentUserService"],VoteButtonController.prototype.showTextWhenMouseIsOver=function(){return this.isMouseOver=!0},VoteButtonController.prototype.showTextWhenMouseIsLeave=function(){return this.isMouseOver=!1},VoteButtonController.prototype.toggleVote=function(){var promise;return this.loading=!0,promise=this.item.is_voter?this._downvote():this._upvote(),promise["finally"](function(_this){return function(){return _this.loading=!1}}(this)),promise},VoteButtonController.prototype._upvote=function(){return this.onUpvote().then(function(_this){return function(){return _this.showTextWhenMouseIsLeave()}}(this))},VoteButtonController.prototype._downvote=function(){return this.onDownvote()},VoteButtonController}(),angular.module("taigaComponents").controller("VoteButton",VoteButtonController)}.call(this),function(){var VoteButtonDirective;VoteButtonDirective=function(){return{scope:{},controller:"VoteButton",bindToController:{item:"=",onUpvote:"=",onDownvote:"="},controllerAs:"vm",templateUrl:"components/vote-button/vote-button.html"}},angular.module("taigaComponents").directive("tgVoteButton",VoteButtonDirective)}.call(this),function(){var WatchButtonController;WatchButtonController=function(){function WatchButtonController(currentUserService,rootScope){this.currentUserService=currentUserService,this.rootScope=rootScope,this.user=this.currentUserService.getUser(),this.isMouseOver=!1,this.loading=!1}return WatchButtonController.$inject=["tgCurrentUserService","$rootScope"],WatchButtonController.prototype.showTextWhenMouseIsOver=function(){return this.isMouseOver=!0},WatchButtonController.prototype.showTextWhenMouseIsLeave=function(){return this.isMouseOver=!1},WatchButtonController.prototype.openWatchers=function(){return this.rootScope.$broadcast("watcher:add",this.item)},WatchButtonController.prototype.getPerms=function(){var name,perms;return this.item?(name=this.item._name,perms={userstories:"modify_us",issues:"modify_issue",tasks:"modify_task"},perms[name]):""},WatchButtonController.prototype.toggleWatch=function(){var promise;return this.loading=!0,promise=this.item.is_watcher?this._unwatch():this._watch(),promise["finally"](function(_this){return function(){return _this.loading=!1}}(this)),promise},WatchButtonController.prototype._watch=function(){return this.onWatch().then(function(_this){return function(){return _this.showTextWhenMouseIsLeave()}}(this))},WatchButtonController.prototype._unwatch=function(){return this.onUnwatch()},WatchButtonController}(),angular.module("taigaComponents").controller("WatchButton",WatchButtonController)}.call(this),function(){var WatchButtonDirective;WatchButtonDirective=function(){return{scope:{},controller:"WatchButton",bindToController:{item:"=",onWatch:"=",onUnwatch:"="},controllerAs:"vm",templateUrl:function(item,attributes){return"components/watch-button/watch-button-"+attributes.environment+".html"}}},angular.module("taigaComponents").directive("tgWatchButton",WatchButtonDirective)}.call(this),function(){var DiscoverHomeOrderByController;DiscoverHomeOrderByController=function(){function DiscoverHomeOrderByController(translate){this.translate=translate,this.is_open=!1,this.texts={week:this.translate.instant("DISCOVER.FILTERS.WEEK"),month:this.translate.instant("DISCOVER.FILTERS.MONTH"),year:this.translate.instant("DISCOVER.FILTERS.YEAR"),all:this.translate.instant("DISCOVER.FILTERS.ALL_TIME")}}return DiscoverHomeOrderByController.$inject=["$translate"],DiscoverHomeOrderByController.prototype.currentText=function(){return this.texts[this.currentOrderBy]},DiscoverHomeOrderByController.prototype.open=function(){return this.is_open=!0},DiscoverHomeOrderByController.prototype.close=function(){return this.is_open=!1},DiscoverHomeOrderByController.prototype.orderBy=function(type){return this.currentOrderBy=type,this.is_open=!1,this.onChange({orderBy:this.currentOrderBy})},DiscoverHomeOrderByController}(),angular.module("taigaDiscover").controller("DiscoverHomeOrderBy",DiscoverHomeOrderByController)}.call(this),function(){var DiscoverHomeOrderByDirective;DiscoverHomeOrderByDirective=function(){var link;return link=function(scope,el,attrs){},{controller:"DiscoverHomeOrderBy",controllerAs:"vm",bindToController:!0,templateUrl:"discover/components/discover-home-order-by/discover-home-order-by.html",scope:{currentOrderBy:"=orderBy",onChange:"&"},link:link}},DiscoverHomeOrderByDirective.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverHomeOrderBy",DiscoverHomeOrderByDirective)}.call(this),function(){var DiscoverSearchBarController;DiscoverSearchBarController=function(){function DiscoverSearchBarController(discoverProjectsService){this.discoverProjectsService=discoverProjectsService,taiga.defineImmutableProperty(this,"projects",function(_this){return function(){return _this.discoverProjectsService.projectsCount}}(this)),this.discoverProjectsService.fetchStats()}return DiscoverSearchBarController.$inject=["tgDiscoverProjectsService"],DiscoverSearchBarController.prototype.selectFilter=function(filter){return this.onChange({filter:filter,q:this.q})},DiscoverSearchBarController.prototype.submitFilter=function(){return this.onChange({filter:this.filter,q:this.q})},DiscoverSearchBarController}(),angular.module("taigaDiscover").controller("DiscoverSearchBar",DiscoverSearchBarController)}.call(this),function(){var DiscoverSearchBarDirective;DiscoverSearchBarDirective=function(){var link;return link=function(scope,el,attrs,ctrl){},{controller:"DiscoverSearchBar",controllerAs:"vm",templateUrl:"discover/components/discover-search-bar/discover-search-bar.html",bindToController:!0,scope:{q:"=",filter:"=",onChange:"&"},link:link}},DiscoverSearchBarDirective.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverSearchBar",DiscoverSearchBarDirective)}.call(this),function(){var DiscoverSearchListHeaderController;DiscoverSearchListHeaderController=function(){function DiscoverSearchListHeaderController(){this.like_is_open=0===this.orderBy.indexOf("-total_fans"),this.activity_is_open=0===this.orderBy.indexOf("-total_activity")}return DiscoverSearchListHeaderController.$inject=[],DiscoverSearchListHeaderController.prototype.openLike=function(){return this.like_is_open=!0,this.activity_is_open=!1,this.setOrderBy("-total_fans_last_week")},DiscoverSearchListHeaderController.prototype.openActivity=function(){return this.activity_is_open=!0,this.like_is_open=!1,this.setOrderBy("-total_activity_last_week")},DiscoverSearchListHeaderController.prototype.setOrderBy=function(type){return null==type&&(type=""),type||(this.like_is_open=!1,this.activity_is_open=!1),this.onChange({orderBy:type})},DiscoverSearchListHeaderController}(),angular.module("taigaDiscover").controller("DiscoverSearchListHeader",DiscoverSearchListHeaderController)}.call(this),function(){var DiscoverSearchListHeaderDirective;DiscoverSearchListHeaderDirective=function(){var link;return link=function(scope,el,attrs){},{controller:"DiscoverSearchListHeader",controllerAs:"vm",bindToController:!0,templateUrl:"discover/components/discover-search-list-header/discover-search-list-header.html",scope:{onChange:"&",orderBy:"="},link:link}},DiscoverSearchListHeaderDirective.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverSearchListHeader",DiscoverSearchListHeaderDirective)}.call(this),function(){var FeaturedProjectsController;FeaturedProjectsController=function(){function FeaturedProjectsController(discoverProjectsService){this.discoverProjectsService=discoverProjectsService,taiga.defineImmutableProperty(this,"featured",function(_this){return function(){return _this.discoverProjectsService.featured}}(this)),this.discoverProjectsService.fetchFeatured()}return FeaturedProjectsController.$inject=["tgDiscoverProjectsService"],FeaturedProjectsController}(),angular.module("taigaDiscover").controller("FeaturedProjects",FeaturedProjectsController)}.call(this),function(){var FeaturedProjectsDirective;FeaturedProjectsDirective=function(){var link;return link=function(scope,el,attrs){},{controller:"FeaturedProjects",controllerAs:"vm",templateUrl:"discover/components/featured-projects/featured-projects.html",scope:{},link:link}},FeaturedProjectsDirective.$inject=[],angular.module("taigaDiscover").directive("tgFeaturedProjects",FeaturedProjectsDirective)}.call(this),function(){var HighlightedDirective;HighlightedDirective=function(){return{templateUrl:"discover/components/highlighted/highlighted.html",scope:{loading:"=",highlighted:"=",orderBy:"="}}},HighlightedDirective.$inject=[],angular.module("taigaDiscover").directive("tgHighlighted",HighlightedDirective)}.call(this),function(){var MostActiveController;MostActiveController=function(){function MostActiveController(discoverProjectsService){this.discoverProjectsService=discoverProjectsService,taiga.defineImmutableProperty(this,"highlighted",function(_this){return function(){return _this.discoverProjectsService.mostActive}}(this)),this.currentOrderBy="week",this.order_by=this.getOrderBy()}return MostActiveController.$inject=["tgDiscoverProjectsService"],MostActiveController.prototype.fetch=function(){return this.loading=!0,this.order_by=this.getOrderBy(),this.discoverProjectsService.fetchMostActive({order_by:this.order_by}).then(function(_this){return function(){return _this.loading=!1}}(this))},MostActiveController.prototype.orderBy=function(type){return this.currentOrderBy=type,this.fetch()},MostActiveController.prototype.getOrderBy=function(type){return"all"===this.currentOrderBy?"-total_activity":"-total_activity_last_"+this.currentOrderBy},MostActiveController}(),angular.module("taigaDiscover").controller("MostActive",MostActiveController)}.call(this),function(){var MostActiveDirective;MostActiveDirective=function(){var link;return link=function(scope,el,attrs,ctrl){return ctrl.fetch()},{controller:"MostActive",controllerAs:"vm",templateUrl:"discover/components/most-active/most-active.html",scope:{},link:link}},MostActiveDirective.$inject=[],angular.module("taigaDiscover").directive("tgMostActive",MostActiveDirective)}.call(this),function(){var MostLikedController;MostLikedController=function(){function MostLikedController(discoverProjectsService){this.discoverProjectsService=discoverProjectsService,taiga.defineImmutableProperty(this,"highlighted",function(_this){return function(){return _this.discoverProjectsService.mostLiked}}(this)),this.currentOrderBy="week",this.order_by=this.getOrderBy()}return MostLikedController.$inject=["tgDiscoverProjectsService"],MostLikedController.prototype.fetch=function(){return this.loading=!0,this.order_by=this.getOrderBy(),this.discoverProjectsService.fetchMostLiked({order_by:this.order_by}).then(function(_this){return function(){return _this.loading=!1}}(this))},MostLikedController.prototype.orderBy=function(type){return this.currentOrderBy=type,this.fetch()},MostLikedController.prototype.getOrderBy=function(){return"all"===this.currentOrderBy?"-total_fans":"-total_fans_last_"+this.currentOrderBy},MostLikedController}(),angular.module("taigaDiscover").controller("MostLiked",MostLikedController)}.call(this),function(){var MostLikedDirective;MostLikedDirective=function(){var link;return link=function(scope,el,attrs,ctrl){return ctrl.fetch()},{controller:"MostLiked",controllerAs:"vm",templateUrl:"discover/components/most-liked/most-liked.html",scope:{},link:link}},MostLikedDirective.$inject=[],angular.module("taigaDiscover").directive("tgMostLiked",MostLikedDirective)}.call(this),function(){var DiscoverHomeController;DiscoverHomeController=function(){function DiscoverHomeController(location,navUrls,appMetaService,translate){var description,title;this.location=location,this.navUrls=navUrls,this.appMetaService=appMetaService,this.translate=translate,title=this.translate.instant("DISCOVER.PAGE_TITLE"),description=this.translate.instant("DISCOVER.PAGE_DESCRIPTION"),this.appMetaService.setAll(title,description)}return DiscoverHomeController.$inject=["$tgLocation","$tgNavUrls","tgAppMetaService","$translate"],DiscoverHomeController.prototype.onSubmit=function(q){var url;return url=this.navUrls.resolve("discover-search"),this.location.search("text",q).path(url)},DiscoverHomeController}(),angular.module("taigaDiscover").controller("DiscoverHome",DiscoverHomeController)}.call(this),function(){var DiscoverSearchController;DiscoverSearchController=function(){function DiscoverSearchController(routeParams,discoverProjectsService,route,appMetaService,translate){var description,title;this.routeParams=routeParams,this.discoverProjectsService=discoverProjectsService,this.route=route,this.appMetaService=appMetaService,this.translate=translate,this.page=1,taiga.defineImmutableProperty(this,"searchResult",function(_this){return function(){return _this.discoverProjectsService.searchResult}}(this)),taiga.defineImmutableProperty(this,"nextSearchPage",function(_this){return function(){return _this.discoverProjectsService.nextSearchPage}}(this)),this.q=this.routeParams.text,this.filter=this.routeParams.filter||"all",this.orderBy=this.routeParams.order_by||"",this.loadingGlobal=!1,this.loadingList=!1,this.loadingPagination=!1,title=this.translate.instant("DISCOVER.SEARCH.PAGE_TITLE"),description=this.translate.instant("DISCOVER.SEARCH.PAGE_DESCRIPTION"),this.appMetaService.setAll(title,description)}return DiscoverSearchController.$inject=["$routeParams","tgDiscoverProjectsService","$route","tgAppMetaService","$translate"],DiscoverSearchController.prototype.fetch=function(){return this.page=1,this.discoverProjectsService.resetSearchList(),this.search()},DiscoverSearchController.prototype.fetchByGlobalSearch=function(){return this.loadingGlobal?void 0:(this.loadingGlobal=!0,this.fetch().then(function(_this){return function(){return _this.loadingGlobal=!1}}(this)))},DiscoverSearchController.prototype.fetchByOrderBy=function(){return this.loadingList?void 0:(this.loadingList=!0,this.fetch().then(function(_this){return function(){return _this.loadingList=!1}}(this)))},DiscoverSearchController.prototype.showMore=function(){return this.loadingPagination?void 0:(this.loadingPagination=!0,this.page++,this.search().then(function(_this){return function(){return _this.loadingPagination=!1}}(this)))},DiscoverSearchController.prototype.search=function(){var filter,params;return filter=this.getFilter(),params={page:this.page,q:this.q,order_by:this.orderBy},_.assign(params,filter),this.discoverProjectsService.fetchSearch(params)},DiscoverSearchController.prototype.getFilter=function(){return"people"===this.filter?{is_looking_for_people:!0}:"scrum"===this.filter?{is_backlog_activated:!0}:"kanban"===this.filter?{is_kanban_activated:!0}:{}},DiscoverSearchController.prototype.onChangeFilter=function(filter,q){return this.filter=filter,this.q=q,this.route.updateParams({filter:this.filter,text:this.q}),this.fetchByGlobalSearch()},DiscoverSearchController.prototype.onChangeOrder=function(orderBy){return this.orderBy=orderBy,this.route.updateParams({order_by:orderBy}),this.fetchByOrderBy()},DiscoverSearchController}(),angular.module("taigaDiscover").controller("DiscoverSearch",DiscoverSearchController)}.call(this),function(){var DiscoverSearchDirective;DiscoverSearchDirective=function(){var link;return link=function(scope,element,attrs,ctrl){return ctrl.fetch()},{controller:"DiscoverSearch",controllerAs:"vm",link:link}},DiscoverSearchDirective.$inject=[],angular.module("taigaDiscover").directive("tgDiscoverSearch",DiscoverSearchDirective)}.call(this),function(){var DiscoverProjectsService,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,DiscoverProjectsService=function(superClass){function DiscoverProjectsService(rs,projectsService){this.rs=rs,this.projectsService=projectsService,this._mostLiked=Immutable.List(),this._mostActive=Immutable.List(),this._featured=Immutable.List(),this._searchResult=Immutable.List(),this._projectsCount=0,this.decorate=this.projectsService._decorate.bind(this.projectsService),taiga.defineImmutableProperty(this,"mostLiked",function(_this){return function(){return _this._mostLiked}}(this)),taiga.defineImmutableProperty(this,"mostActive",function(_this){return function(){return _this._mostActive}}(this)),taiga.defineImmutableProperty(this,"featured",function(_this){return function(){return _this._featured}}(this)),taiga.defineImmutableProperty(this,"searchResult",function(_this){return function(){return _this._searchResult}}(this)),taiga.defineImmutableProperty(this,"nextSearchPage",function(_this){return function(){return _this._nextSearchPage}}(this)),taiga.defineImmutableProperty(this,"projectsCount",function(_this){return function(){return _this._projectsCount}}(this))}return extend(DiscoverProjectsService,superClass),DiscoverProjectsService.$inject=["tgResources","tgProjectsService"],DiscoverProjectsService.prototype.fetchMostLiked=function(params){return this.rs.projects.getProjects(params,!1).then(function(_this){return function(result){var data,projects;return data=result.data.slice(0,5),projects=Immutable.fromJS(data),projects=projects.map(_this.decorate),_this._mostLiked=projects}}(this))},DiscoverProjectsService.prototype.fetchMostActive=function(params){return this.rs.projects.getProjects(params,!1).then(function(_this){return function(result){var data,projects;return data=result.data.slice(0,5),projects=Immutable.fromJS(data),projects=projects.map(_this.decorate),_this._mostActive=projects}}(this))},DiscoverProjectsService.prototype.fetchFeatured=function(){var params;return params={is_featured:!0},this.rs.projects.getProjects(params,!1).then(function(_this){return function(result){var data,projects;return data=result.data.slice(0,4),projects=Immutable.fromJS(data),projects=projects.map(_this.decorate),_this._featured=projects}}(this))},DiscoverProjectsService.prototype.resetSearchList=function(){return this._searchResult=Immutable.List()},DiscoverProjectsService.prototype.fetchStats=function(){return this.rs.stats.discover().then(function(_this){return function(discover){return _this._projectsCount=discover.getIn(["projects","total"])}}(this))},DiscoverProjectsService.prototype.fetchSearch=function(params){return this.rs.projects.getProjects(params).then(function(_this){return function(result){var projects;return _this._nextSearchPage=!!result.headers("X-Pagination-Next"),projects=Immutable.fromJS(result.data),projects=projects.map(_this.decorate),_this._searchResult=_this._searchResult.concat(projects)}}(this))},DiscoverProjectsService}(taiga.Service),angular.module("taigaDiscover").service("tgDiscoverProjectsService",DiscoverProjectsService)}.call(this),function(){var ExternalAppController,taiga,bind=function(fn,me){return function(){return fn.apply(me,arguments)}},extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,ExternalAppController=function(superClass){function ExternalAppController(routeParams,externalAppsService,window,currentUserService,location,navUrls,xhrError,loader){var loginUrl,nextUrl;this.routeParams=routeParams,this.externalAppsService=externalAppsService,this.window=window,this.currentUserService=currentUserService,this.location=location,this.navUrls=navUrls,this.xhrError=xhrError,this.loader=loader,this.createApplicationToken=bind(this.createApplicationToken,this),this._getApplicationToken=bind(this._getApplicationToken,this),this._redirect=bind(this._redirect,this),this.loader.start(!1),this._applicationId=this.routeParams.application,this._state=this.routeParams.state,this._getApplicationToken(),this._user=this.currentUserService.getUser(),this._application=null,nextUrl=encodeURIComponent(this.location.url()),loginUrl=this.navUrls.resolve("login"),this.loginWithAnotherUserUrl=loginUrl+"?next="+nextUrl,taiga.defineImmutableProperty(this,"user",function(_this){return function(){return _this._user}}(this)),taiga.defineImmutableProperty(this,"application",function(_this){return function(){return _this._application}}(this))}return extend(ExternalAppController,superClass),ExternalAppController.$inject=["$routeParams","tgExternalAppsService","$window","tgCurrentUserService","$location","$tgNavUrls","tgXhrErrorService","tgLoader"],ExternalAppController.prototype._redirect=function(applicationToken){var nextUrl;return nextUrl=applicationToken.get("next_url"),this.window.open(nextUrl,"_self")},ExternalAppController.prototype._getApplicationToken=function(){return this.externalAppsService.getApplicationToken(this._applicationId,this._state).then(function(_this){return function(data){return _this._application=data.get("application"),data.get("auth_code")?_this._redirect(data):_this.loader.pageLoaded()}}(this))["catch"](function(_this){return function(xhr){return _this.loader.pageLoaded(),_this.xhrError.response(xhr)}}(this))},ExternalAppController.prototype.cancel=function(){return this.window.history.back()},ExternalAppController.prototype.createApplicationToken=function(){return this.externalAppsService.authorizeApplicationToken(this._applicationId,this._state).then(function(_this){return function(data){return _this._redirect(data)}}(this))["catch"](function(_this){return function(xhr){return _this.xhrError.response(xhr)}}(this))},ExternalAppController}(taiga.Controller),angular.module("taigaExternalApps").controller("ExternalApp",ExternalAppController)}.call(this),function(){var ExternalAppsService,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;ExternalAppsService=function(superClass){function ExternalAppsService(rs){this.rs=rs}return extend(ExternalAppsService,superClass),ExternalAppsService.$inject=["tgResources"],ExternalAppsService.prototype.getApplicationToken=function(applicationId,state){return this.rs.externalapps.getApplicationToken(applicationId,state)},ExternalAppsService.prototype.authorizeApplicationToken=function(applicationId,state){return this.rs.externalapps.authorizeApplicationToken(applicationId,state)},ExternalAppsService}(taiga.Service),angular.module("taigaExternalApps").service("tgExternalAppsService",ExternalAppsService)}.call(this),function(){var FeedbackService,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;FeedbackService=function(superClass){function FeedbackService(lightboxFactory){this.lightboxFactory=lightboxFactory}return extend(FeedbackService,superClass),FeedbackService.$inject=["tgLightboxFactory"],FeedbackService.prototype.sendFeedback=function(){return this.lightboxFactory.create("tg-lb-feedback",{"class":"lightbox lightbox-feedback lightbox-generic-form"})},FeedbackService}(taiga.Service),angular.module("taigaFeedback").service("tgFeedbackService",FeedbackService)}.call(this),function(){var DutyDirective;DutyDirective=function(navurls,$translate){var link;return link=function(scope,el,attrs,ctrl){return scope.vm={},scope.vm.duty=scope.duty,scope.vm.getDutyType=function(){if(scope.vm.duty){if("userstories"===scope.vm.duty.get("_name"))return $translate.instant("COMMON.USER_STORY");if("tasks"===scope.vm.duty.get("_name"))return $translate.instant("COMMON.TASK");if("issues"===scope.vm.duty.get("_name"))return $translate.instant("COMMON.ISSUE")}}},{templateUrl:"home/duties/duty.html",scope:{duty:"=tgDuty"},link:link}},DutyDirective.$inject=["$tgNavUrls","$translate"],angular.module("taigaHome").directive("tgDuty",DutyDirective)}.call(this),function(){var HomeController;HomeController=function(){function HomeController(currentUserService,location,navUrls){this.currentUserService=currentUserService,this.location=location,this.navUrls=navUrls,this.currentUserService.getUser()||this.location.path(this.navUrls.resolve("discover"))}return HomeController.$inject=["tgCurrentUserService","$location","$tgNavUrls"],HomeController}(),angular.module("taigaHome").controller("Home",HomeController)}.call(this),function(){var HomeService,groupBy,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;groupBy=this.taiga.groupBy,HomeService=function(superClass){function HomeService(navurls,rs,projectsService){this.navurls=navurls,this.rs=rs,this.projectsService=projectsService}return extend(HomeService,superClass),HomeService.$inject=["$tgNavUrls","tgResources","tgProjectsService"],HomeService.prototype._attachProjectInfoToWorkInProgress=function(workInProgress,projectsById){var _attachProjectInfoToDuty,_duties,assignedTo,watching;return _attachProjectInfoToDuty=function(_this){return function(duty,objType){var ctx,project,url;return project=projectsById.get(String(duty.get("project"))),ctx={project:project.get("slug"),ref:duty.get("ref")},url=_this.navurls.resolve("project-"+objType+"-detail",ctx),duty=duty.set("url",url),duty=duty.set("projectName",project.get("name")),duty=duty.set("_name",objType)}}(this),assignedTo=workInProgress.get("assignedTo"),assignedTo.get("userStories")&&(_duties=assignedTo.get("userStories").map(function(duty){return _attachProjectInfoToDuty(duty,"userstories")}),assignedTo=assignedTo.set("userStories",_duties)),assignedTo.get("tasks")&&(_duties=assignedTo.get("tasks").map(function(duty){return _attachProjectInfoToDuty(duty,"tasks")}),assignedTo=assignedTo.set("tasks",_duties)),assignedTo.get("issues")&&(_duties=assignedTo.get("issues").map(function(duty){return _attachProjectInfoToDuty(duty,"issues")}),assignedTo=assignedTo.set("issues",_duties)),watching=workInProgress.get("watching"),watching.get("userStories")&&(_duties=watching.get("userStories").filter(function(duty){return!!projectsById.get(String(duty.get("project")))}),_duties=_duties.map(function(duty){return _attachProjectInfoToDuty(duty,"userstories")}),watching=watching.set("userStories",_duties)),watching.get("tasks")&&(_duties=watching.get("tasks").filter(function(duty){return!!projectsById.get(String(duty.get("project")))}),_duties=_duties.map(function(duty){return _attachProjectInfoToDuty(duty,"tasks")}),watching=watching.set("tasks",_duties)),watching.get("issues")&&(_duties=watching.get("issues").filter(function(duty){return!!projectsById.get(String(duty.get("project")))}),_duties=_duties.map(function(duty){return _attachProjectInfoToDuty(duty,"issues")}),watching=watching.set("issues",_duties)),workInProgress=workInProgress.set("assignedTo",assignedTo),workInProgress=workInProgress.set("watching",watching)},HomeService.prototype.getWorkInProgress=function(userId){var assignedIssuesPromise,assignedTasksPromise,assignedTo,assignedUserStoriesPromise,params,params_us,projectsById,projectsPromise,watching,watchingIssuesPromise,watchingTasksPromise,watchingUserStoriesPromise,workInProgress;return projectsById=Immutable.Map(),projectsPromise=this.projectsService.getProjectsByUserId(userId).then(function(projects){return projectsById=Immutable.fromJS(groupBy(projects.toJS(),function(p){return p.id}))}),assignedTo=Immutable.Map(),params={status__is_closed:!1,assigned_to:userId},params_us={is_closed:!1,assigned_to:userId},assignedUserStoriesPromise=this.rs.userstories.listInAllProjects(params_us).then(function(userstories){return assignedTo=assignedTo.set("userStories",userstories)}),assignedTasksPromise=this.rs.tasks.listInAllProjects(params).then(function(tasks){return assignedTo=assignedTo.set("tasks",tasks)}),assignedIssuesPromise=this.rs.issues.listInAllProjects(params).then(function(issues){return assignedTo=assignedTo.set("issues",issues)}),params={status__is_closed:!1,watchers:userId},params_us={is_closed:!1,watchers:userId},watching=Immutable.Map(),watchingUserStoriesPromise=this.rs.userstories.listInAllProjects(params_us).then(function(userstories){return watching=watching.set("userStories",userstories)}),watchingTasksPromise=this.rs.tasks.listInAllProjects(params).then(function(tasks){return watching=watching.set("tasks",tasks)}),watchingIssuesPromise=this.rs.issues.listInAllProjects(params).then(function(issues){return watching=watching.set("issues",issues)}),workInProgress=Immutable.Map(),Promise.all([projectsPromise,assignedUserStoriesPromise,assignedTasksPromise,assignedIssuesPromise,watchingUserStoriesPromise,watchingTasksPromise,watchingIssuesPromise]).then(function(_this){return function(){return workInProgress=workInProgress.set("assignedTo",assignedTo),workInProgress=workInProgress.set("watching",watching),workInProgress=_this._attachProjectInfoToWorkInProgress(workInProgress,projectsById)}}(this))},HomeService}(taiga.Service),angular.module("taigaHome").service("tgHomeService",HomeService)}.call(this),function(){var HomeProjectListDirective;HomeProjectListDirective=function(currentUserService,projectsService){var directive,link;return link=function(scope,el,attrs,ctrl){return scope.vm={},taiga.defineImmutableProperty(scope.vm,"projects",function(){return currentUserService.projects.get("recents")}),scope.vm.newProject=function(){return projectsService.newProject()}},directive={templateUrl:"home/projects/home-project-list.html",scope:{},link:link}},HomeProjectListDirective.$inject=["tgCurrentUserService","tgProjectsService"],angular.module("taigaHome").directive("tgHomeProjectList",HomeProjectListDirective)}.call(this),function(){var WorkingOnController;WorkingOnController=function(){function WorkingOnController(homeService){ +this.homeService=homeService,this.assignedTo=Immutable.Map(),this.watching=Immutable.Map()}return WorkingOnController.$inject=["tgHomeService"],WorkingOnController.prototype._setAssignedTo=function(workInProgress){var issues,tasks,userStories;return userStories=workInProgress.get("assignedTo").get("userStories"),tasks=workInProgress.get("assignedTo").get("tasks"),issues=workInProgress.get("assignedTo").get("issues"),this.assignedTo=userStories.concat(tasks).concat(issues),this.assignedTo.size>0?this.assignedTo=this.assignedTo.sortBy(function(elem){return elem.get("modified_date")}).reverse():void 0},WorkingOnController.prototype._setWatching=function(workInProgress){var issues,tasks,userStories;return userStories=workInProgress.get("watching").get("userStories"),tasks=workInProgress.get("watching").get("tasks"),issues=workInProgress.get("watching").get("issues"),this.watching=userStories.concat(tasks).concat(issues),this.watching.size>0?this.watching=this.watching.sortBy(function(elem){return elem.get("modified_date")}).reverse():void 0},WorkingOnController.prototype.getWorkInProgress=function(userId){return this.homeService.getWorkInProgress(userId).then(function(_this){return function(workInProgress){return _this._setAssignedTo(workInProgress),_this._setWatching(workInProgress)}}(this))},WorkingOnController}(),angular.module("taigaHome").controller("WorkingOn",WorkingOnController)}.call(this),function(){var WorkingOnDirective;WorkingOnDirective=function(homeService,currentUserService){var link;return link=function(scope,el,attrs,ctrl){var user,userId;return user=currentUserService.getUser(),user?(userId=user.get("id"),ctrl.getWorkInProgress(userId)):void 0},{controller:"WorkingOn",controllerAs:"vm",templateUrl:"home/working-on/working-on.html",scope:{},link:link}},WorkingOnDirective.$inject=["tgHomeService","tgCurrentUserService"],angular.module("taigaHome").directive("tgWorkingOn",WorkingOnDirective)}.call(this),function(){var DropdownProjectListDirective;DropdownProjectListDirective=function(currentUserService,projectsService){var directive,link;return link=function(scope,el,attrs,ctrl){return scope.vm={},taiga.defineImmutableProperty(scope.vm,"projects",function(){return currentUserService.projects.get("recents")}),scope.vm.newProject=function(){return projectsService.newProject()}},directive={templateUrl:"navigation-bar/dropdown-project-list/dropdown-project-list.html",scope:{},link:link}},DropdownProjectListDirective.$inject=["tgCurrentUserService","tgProjectsService"],angular.module("taigaNavigationBar").directive("tgDropdownProjectList",DropdownProjectListDirective)}.call(this),function(){var DropdownUserDirective;DropdownUserDirective=function(authService,configService,locationService,navUrlsService,feedbackService){var directive,link;return link=function(scope,el,attrs,ctrl){return scope.vm={},scope.vm.isFeedbackEnabled=configService.get("feedbackEnabled"),taiga.defineImmutableProperty(scope.vm,"user",function(){return authService.userData}),scope.vm.logout=function(){return authService.logout(),locationService.url(navUrlsService.resolve("discover")),locationService.search({})},scope.vm.sendFeedback=function(){return feedbackService.sendFeedback()}},directive={templateUrl:"navigation-bar/dropdown-user/dropdown-user.html",scope:{},link:link}},DropdownUserDirective.$inject=["$tgAuth","$tgConfig","$tgLocation","$tgNavUrls","tgFeedbackService"],angular.module("taigaNavigationBar").directive("tgDropdownUser",DropdownUserDirective)}.call(this),function(){var NavigationBarDirective;NavigationBarDirective=function(currentUserService,navigationBarService,locationService,navUrlsService){var directive,link;return link=function(scope,el,attrs,ctrl){return scope.vm={},scope.$on("$routeChangeSuccess",function(){return"/"===locationService.path()?scope.vm.active=!0:scope.vm.active=!1}),taiga.defineImmutableProperty(scope.vm,"projects",function(){return currentUserService.projects.get("recents")}),taiga.defineImmutableProperty(scope.vm,"isAuthenticated",function(){return currentUserService.isAuthenticated()}),taiga.defineImmutableProperty(scope.vm,"isEnabledHeader",function(){return navigationBarService.isEnabledHeader()}),scope.vm.login=function(){var nextUrl;return nextUrl=encodeURIComponent(locationService.url()),locationService.url(navUrlsService.resolve("login")),locationService.search({next:nextUrl})},scope.vm.register=function(){var nextUrl;return nextUrl=encodeURIComponent(locationService.url()),locationService.url(navUrlsService.resolve("register")),locationService.search({next:nextUrl})}},directive={templateUrl:"navigation-bar/navigation-bar.html",scope:{},link:link}},NavigationBarDirective.$inject=["tgCurrentUserService","tgNavigationBarService","$tgLocation","$tgNavUrls"],angular.module("taigaNavigationBar").directive("tgNavigationBar",NavigationBarDirective)}.call(this),function(){var NavigationBarService,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;NavigationBarService=function(superClass){function NavigationBarService(){this.disableHeader()}return extend(NavigationBarService,superClass),NavigationBarService.prototype.enableHeader=function(){return this.enabledHeader=!0},NavigationBarService.prototype.disableHeader=function(){return this.enabledHeader=!1},NavigationBarService.prototype.isEnabledHeader=function(){return this.enabledHeader},NavigationBarService}(taiga.Service),angular.module("taigaNavigationBar").service("tgNavigationBarService",NavigationBarService)}.call(this),function(){var ProfileBarController;ProfileBarController=function(){function ProfileBarController(userService){this.userService=userService,this.loadStats()}return ProfileBarController.$inject=["tgUserService"],ProfileBarController.prototype.loadStats=function(){return this.userService.getStats(this.user.get("id")).then(function(_this){return function(stats){return _this.stats=stats}}(this))},ProfileBarController}(),angular.module("taigaProfile").controller("ProfileBar",ProfileBarController)}.call(this),function(){var ProfileBarDirective;ProfileBarDirective=function(){return{templateUrl:"profile/profile-bar/profile-bar.html",controller:"ProfileBar",controllerAs:"vm",scope:{user:"=user",isCurrentUser:"=iscurrentuser"},bindToController:!0}},angular.module("taigaProfile").directive("tgProfileBar",ProfileBarDirective)}.call(this),function(){var ProfileContactsController;ProfileContactsController=function(){function ProfileContactsController(userService,currentUserService){this.userService=userService,this.currentUserService=currentUserService,this.currentUser=this.currentUserService.getUser(),this.isCurrentUser=!1,this.currentUser&&this.currentUser.get("id")===this.user.get("id")&&(this.isCurrentUser=!0)}return ProfileContactsController.$inject=["tgUserService","tgCurrentUserService"],ProfileContactsController.prototype.loadContacts=function(){return this.userService.getContacts(this.user.get("id")).then(function(_this){return function(contacts){return _this.contacts=contacts}}(this))},ProfileContactsController}(),angular.module("taigaProfile").controller("ProfileContacts",ProfileContactsController)}.call(this),function(){var ProfileContactsDirective;ProfileContactsDirective=function(){var link;return link=function(scope,elm,attrs,ctrl){return ctrl.loadContacts()},{templateUrl:"profile/profile-contacts/profile-contacts.html",scope:{user:"="},controllerAs:"vm",controller:"ProfileContacts",link:link,bindToController:!0}},angular.module("taigaProfile").directive("tgProfileContacts",ProfileContactsDirective)}.call(this),function(){var FavItemDirective;FavItemDirective=function(){var link,templateUrl;return link=function(scope,el,attrs,ctrl){return scope.vm={item:scope.item}},templateUrl=function(el,attrs){return"project"===attrs.itemType?"profile/profile-favs/items/project.html":"profile/profile-favs/items/ticket.html"},{scope:{item:"=tgFavItem"},link:link,templateUrl:templateUrl}},angular.module("taigaProfile").directive("tgFavItem",FavItemDirective)}.call(this),function(){var FavsBaseController,ProfileLikedController,ProfileVotedController,ProfileWatchedController,debounceLeading,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;debounceLeading=this.taiga.debounceLeading,FavsBaseController=function(){function FavsBaseController(){this._init()}return FavsBaseController.prototype._init=function(){return this.enableFilterByAll=!0,this.enableFilterByProjects=!0,this.enableFilterByUserStories=!0,this.enableFilterByTasks=!0,this.enableFilterByIssues=!0,this.enableFilterByTextQuery=!0,this._resetList(),this.q=null,this.type=null},FavsBaseController.prototype._resetList=function(){return this.items=Immutable.List(),this.scrollDisabled=!1,this._page=1},FavsBaseController.prototype._enableLoadingSpinner=function(){return this.isLoading=!0},FavsBaseController.prototype._disableLoadingSpinner=function(){return this.isLoading=!1},FavsBaseController.prototype._enableScroll=function(){return this.scrollDisabled=!1},FavsBaseController.prototype._disableScroll=function(){return this.scrollDisabled=!0},FavsBaseController.prototype._checkIfHasMorePages=function(hasNext){return hasNext?(this._page+=1,this._enableScroll()):this._disableScroll()},FavsBaseController.prototype._checkIfHasNoResults=function(){return this.hasNoResults=0===this.items.size},FavsBaseController.prototype.loadItems=function(){return this._enableLoadingSpinner(),this._disableScroll(),this._getItems(this.user.get("id"),this._page,this.type,this.q).then(function(_this){return function(response){return _this.items=_this.items.concat(response.get("data")),_this._checkIfHasMorePages(response.get("next")),_this._checkIfHasNoResults(),_this._disableLoadingSpinner(),_this.items}}(this))["catch"](function(_this){return function(){return _this._disableLoadingSpinner(),_this.items}}(this))},FavsBaseController.prototype.filterByTextQuery=debounceLeading(500,function(){return this._resetList(),this.loadItems()}),FavsBaseController.prototype.showAll=function(){return null!==this.type?(this.type=null,this._resetList(),this.loadItems()):void 0},FavsBaseController.prototype.showProjectsOnly=function(){return"project"!==this.type?(this.type="project",this._resetList(),this.loadItems()):void 0},FavsBaseController.prototype.showUserStoriesOnly=function(){return"userstory"!==this.type?(this.type="userstory",this._resetList(),this.loadItems()):void 0},FavsBaseController.prototype.showTasksOnly=function(){return"task"!==this.type?(this.type="task",this._resetList(),this.loadItems()):void 0},FavsBaseController.prototype.showIssuesOnly=function(){return"issue"!==this.type?(this.type="issue",this._resetList(),this.loadItems()):void 0},FavsBaseController}(),ProfileLikedController=function(superClass){function ProfileLikedController(userService){this.userService=userService,ProfileLikedController.__super__.constructor.call(this),this.enableFilterByAll=!1,this.enableFilterByProjects=!1,this.enableFilterByUserStories=!1,this.enableFilterByTasks=!1,this.enableFilterByIssues=!1,this.enableFilterByTextQuery=!0,this._getItems=this.userService.getLiked}return extend(ProfileLikedController,superClass),ProfileLikedController.$inject=["tgUserService"],ProfileLikedController}(FavsBaseController),angular.module("taigaProfile").controller("ProfileLiked",ProfileLikedController),ProfileVotedController=function(superClass){function ProfileVotedController(userService){this.userService=userService,ProfileVotedController.__super__.constructor.call(this),this.enableFilterByAll=!0,this.enableFilterByProjects=!1,this.enableFilterByUserStories=!0,this.enableFilterByTasks=!0,this.enableFilterByIssues=!0,this.enableFilterByTextQuery=!0,this._getItems=this.userService.getVoted}return extend(ProfileVotedController,superClass),ProfileVotedController.$inject=["tgUserService"],ProfileVotedController}(FavsBaseController),angular.module("taigaProfile").controller("ProfileVoted",ProfileVotedController),ProfileWatchedController=function(superClass){function ProfileWatchedController(userService){this.userService=userService,ProfileWatchedController.__super__.constructor.call(this),this._getItems=this.userService.getWatched}return extend(ProfileWatchedController,superClass),ProfileWatchedController.$inject=["tgUserService"],ProfileWatchedController}(FavsBaseController),angular.module("taigaProfile").controller("ProfileWatched",ProfileWatchedController)}.call(this),function(){var ProfileLikedDirective,ProfileVotedDirective,ProfileWatchedDirective,base;base={scope:{},bindToController:{user:"=",type:"@",q:"@",scrollDisabled:"@",isLoading:"@",hasNoResults:"@"},controller:null,controllerAs:"vm",templateUrl:"profile/profile-favs/profile-favs.html"},ProfileLikedDirective=function(){return _.extend({},base,{controller:"ProfileLiked"})},angular.module("taigaProfile").directive("tgProfileLiked",ProfileLikedDirective),ProfileVotedDirective=function(){return _.extend({},base,{controller:"ProfileVoted"})},angular.module("taigaProfile").directive("tgProfileVoted",ProfileVotedDirective),ProfileWatchedDirective=function(){return _.extend({},base,{controller:"ProfileWatched"})},angular.module("taigaProfile").directive("tgProfileWatched",ProfileWatchedDirective)}.call(this),function(){var ProfileHints;ProfileHints=function(){function ProfileHints(translate){var hintKey;this.translate=translate,hintKey=Math.floor(Math.random()*this.HINTS.length)+1,this.hint=this.HINTS[hintKey-1],this.hint.linkText=this.hint.linkText||"HINTS.LINK",this.hint.title=this.translate.instant("HINTS.HINT"+hintKey+"_TITLE"),this.hint.text=this.translate.instant("HINTS.HINT"+hintKey+"_TEXT")}return ProfileHints.prototype.HINTS=[{url:"https://taiga.io/support/import-export-projects/"},{url:"https://taiga.io/support/custom-fields/"},{},{}],ProfileHints}(),ProfileHints.$inject=["$translate"],angular.module("taigaProfile").controller("ProfileHints",ProfileHints)}.call(this),function(){var ProfileHints;ProfileHints=function($translate){return{scope:{},controller:"ProfileHints",controllerAs:"vm",templateUrl:"profile/profile-hints/profile-hints.html"}},ProfileHints.$inject=["$translate"],angular.module("taigaProfile").directive("tgProfileHints",ProfileHints)}.call(this),function(){var ProfileProjectsController;ProfileProjectsController=function(){function ProfileProjectsController(projectsService,userService){this.projectsService=projectsService,this.userService=userService}return ProfileProjectsController.$inject=["tgProjectsService","tgUserService"],ProfileProjectsController.prototype.loadProjects=function(){return this.projectsService.getProjectsByUserId(this.user.get("id")).then(function(_this){return function(projects){return _this.userService.attachUserContactsToProjects(_this.user.get("id"),projects)}}(this)).then(function(_this){return function(projects){return _this.projects=projects}}(this))},ProfileProjectsController}(),angular.module("taigaProfile").controller("ProfileProjects",ProfileProjectsController)}.call(this),function(){var ProfileProjectsDirective;ProfileProjectsDirective=function(){var link;return link=function(scope,elm,attr,ctrl){return ctrl.loadProjects()},{templateUrl:"profile/profile-projects/profile-projects.html",scope:{user:"="},link:link,bindToController:!0,controllerAs:"vm",controller:"ProfileProjects"}},angular.module("taigaProfile").directive("tgProfileProjects",ProfileProjectsDirective)}.call(this),function(){var ProfileTabDirective;ProfileTabDirective=function(){var link;return link=function(scope,element,attrs,ctrl,transclude){return scope.tab={},attrs.$observe("tgProfileTab",function(name){return scope.tab.name=name}),attrs.$observe("tabTitle",function(title){return scope.tab.title=title}),scope.tab.icon=attrs.tabIcon,scope.tab.active=!!attrs.tabActive,scope.$eval(attrs.tabDisabled)!==!0?ctrl.addTab(scope.tab):void 0},{templateUrl:"profile/profile-tab/profile-tab.html",scope:{},require:"^tgProfileTabs",link:link,transclude:!0}},angular.module("taigaProfile").directive("tgProfileTab",ProfileTabDirective)}.call(this),function(){var ProfileTabsController;ProfileTabsController=function(){function ProfileTabsController(){this.tabs=[]}return ProfileTabsController.prototype.addTab=function(tab){return this.tabs.push(tab)},ProfileTabsController.prototype.toggleTab=function(tab){return _.map(this.tabs,function(tab){return tab.active=!1}),tab.active=!0},ProfileTabsController}(),angular.module("taigaProfile").controller("ProfileTabs",ProfileTabsController)}.call(this),function(){var ProfileTabsDirective;ProfileTabsDirective=function(){return{scope:{},controller:"ProfileTabs",controllerAs:"vm",templateUrl:"profile/profile-tabs/profile-tabs.html",transclude:!0}},angular.module("taigaProfile").directive("tgProfileTabs",ProfileTabsDirective)}.call(this),function(){var ProfileController;ProfileController=function(){function ProfileController(appMetaService,currentUserService,routeParams,userService,xhrError,translate){this.appMetaService=appMetaService,this.currentUserService=currentUserService,this.routeParams=routeParams,this.userService=userService,this.xhrError=xhrError,this.translate=translate,this.isCurrentUser=!1,this.routeParams.slug?this.userService.getUserByUserName(this.routeParams.slug).then(function(_this){return function(user){return user.get("is_active")?(_this.user=user,_this.isCurrentUser=!1,_this._setMeta(_this.user),user):_this.xhrError.notFound()}}(this))["catch"](function(_this){return function(xhr){return _this.xhrError.response(xhr)}}(this)):(this.user=this.currentUserService.getUser(),this.isCurrentUser=!0,this._setMeta(this.user))}return ProfileController.$inject=["tgAppMetaService","tgCurrentUserService","$routeParams","tgUserService","tgXhrErrorService","$translate"],ProfileController.prototype._setMeta=function(user){var ctx,description,title;return ctx={userFullName:user.get("full_name_display"),userUsername:user.get("username")},title=this.translate.instant("USER.PROFILE.PAGE_TITLE",ctx),description=user.get("bio"),this.appMetaService.setAll(title,description)},ProfileController}(),angular.module("taigaProfile").controller("Profile",ProfileController)}.call(this),function(){var LikeProjectButtonController;LikeProjectButtonController=function(){function LikeProjectButtonController(confirm,likeButtonService){this.confirm=confirm,this.likeButtonService=likeButtonService,this.isMouseOver=!1,this.loading=!1}return LikeProjectButtonController.$inject=["$tgConfirm","tgLikeProjectButtonService"],LikeProjectButtonController.prototype.showTextWhenMouseIsOver=function(){return this.isMouseOver=!0},LikeProjectButtonController.prototype.showTextWhenMouseIsLeave=function(){return this.isMouseOver=!1},LikeProjectButtonController.prototype.toggleLike=function(){var promise;return this.loading=!0,promise=this.project.get("is_fan")?this._unlike():this._like(),promise["finally"](function(_this){return function(){return _this.loading=!1}}(this)),promise},LikeProjectButtonController.prototype._like=function(){return this.likeButtonService.like(this.project.get("id")).then(function(_this){return function(){return _this.showTextWhenMouseIsLeave()}}(this))["catch"](function(_this){return function(){return _this.confirm.notify("error")}}(this))},LikeProjectButtonController.prototype._unlike=function(){return this.likeButtonService.unlike(this.project.get("id"))["catch"](function(_this){return function(){return _this.confirm.notify("error")}}(this))},LikeProjectButtonController}(),angular.module("taigaProjects").controller("LikeProjectButton",LikeProjectButtonController)}.call(this),function(){var LikeProjectButtonDirective;LikeProjectButtonDirective=function(){return{scope:{},controller:"LikeProjectButton",bindToController:{project:"="},controllerAs:"vm",templateUrl:"projects/components/like-project-button/like-project-button.html"}},angular.module("taigaProjects").directive("tgLikeProjectButton",LikeProjectButtonDirective)}.call(this),function(){var LikeProjectButtonService,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,LikeProjectButtonService=function(superClass){function LikeProjectButtonService(rs,currentUserService,projectService){this.rs=rs,this.currentUserService=currentUserService,this.projectService=projectService}return extend(LikeProjectButtonService,superClass),LikeProjectButtonService.$inject=["tgResources","tgCurrentUserService","tgProjectService"],LikeProjectButtonService.prototype._getProjectIndex=function(projectId){return this.currentUserService.projects.get("all").findIndex(function(project){return project.get("id")===projectId})},LikeProjectButtonService.prototype._updateProjects=function(projectId,isFan){var projectIndex,projects;return projectIndex=this._getProjectIndex(projectId),-1!==projectIndex?(projects=this.currentUserService.projects.get("all").update(projectIndex,function(project){var totalFans;return totalFans=project.get("total_fans"),isFan?totalFans++:totalFans--,project.merge({is_fan:isFan,total_fans:totalFans})}),this.currentUserService.setProjects(projects)):void 0},LikeProjectButtonService.prototype._updateCurrentProject=function(isFan){var project,totalFans;return totalFans=this.projectService.project.get("total_fans"),isFan?totalFans++:totalFans--,project=this.projectService.project.merge({is_fan:isFan,total_fans:totalFans}),this.projectService.setProject(project)},LikeProjectButtonService.prototype.like=function(projectId){return this.rs.projects.likeProject(projectId).then(function(_this){return function(){return _this._updateProjects(projectId,!0),_this._updateCurrentProject(!0)}}(this))},LikeProjectButtonService.prototype.unlike=function(projectId){return this.rs.projects.unlikeProject(projectId).then(function(_this){return function(){return _this._updateProjects(projectId,!1),_this._updateCurrentProject(!1)}}(this))},LikeProjectButtonService}(taiga.Service),angular.module("taigaProjects").service("tgLikeProjectButtonService",LikeProjectButtonService)}.call(this),function(){var SortProjectsDirective;SortProjectsDirective=function(currentUserService){var directive,link;return link=function(scope,el,attrs,ctrl){var itemEl;return itemEl=null,el.sortable({dropOnEmpty:!0,revert:200,axis:"y",opacity:.95,placeholder:"placeholder",cancel:".project-name"}),el.on("sortstop",function(event,ui){var i,index,len,project,sortData,sorted_project_ids,value;for(itemEl=ui.item,project=itemEl.scope().project,index=itemEl.index(),sorted_project_ids=_.map(scope.projects.toJS(),function(p){return p.id}),sorted_project_ids=_.without(sorted_project_ids,project.get("id")),sorted_project_ids.splice(index,0,project.get("id")),sortData=[],index=i=0,len=sorted_project_ids.length;len>i;index=++i)value=sorted_project_ids[index],sortData.push({project_id:value,order:index});return currentUserService.bulkUpdateProjectsOrder(sortData)})},directive={scope:{projects:"=tgSortProjects"},link:link}},angular.module("taigaProjects").directive("tgSortProjects",["tgCurrentUserService",SortProjectsDirective])}.call(this),function(){var WatchProjectButtonController;WatchProjectButtonController=function(){function WatchProjectButtonController(confirm,watchButtonService){this.confirm=confirm,this.watchButtonService=watchButtonService,this.showWatchOptions=!1,this.loading=!1}return WatchProjectButtonController.$inject=["$tgConfirm","tgWatchProjectButtonService"],WatchProjectButtonController.prototype.toggleWatcherOptions=function(){return this.showWatchOptions=!this.showWatchOptions},WatchProjectButtonController.prototype.closeWatcherOptions=function(){return this.showWatchOptions=!1},WatchProjectButtonController.prototype.watch=function(notifyLevel){return notifyLevel!==this.project.get("notify_level")?(this.loading=!0,this.closeWatcherOptions(),this.watchButtonService.watch(this.project.get("id"),notifyLevel)["catch"](function(_this){return function(){return _this.confirm.notify("error")}}(this))["finally"](function(_this){return function(){return _this.loading=!1}}(this))):void 0},WatchProjectButtonController.prototype.unwatch=function(){return this.loading=!0,this.closeWatcherOptions(),this.watchButtonService.unwatch(this.project.get("id"))["catch"](function(_this){return function(){return _this.confirm.notify("error")}}(this))["finally"](function(_this){return function(){return _this.loading=!1}}(this))},WatchProjectButtonController}(),angular.module("taigaProjects").controller("WatchProjectButton",WatchProjectButtonController)}.call(this),function(){var WatchProjectButtonDirective;WatchProjectButtonDirective=function(){return{scope:{},controller:"WatchProjectButton",bindToController:{project:"="},controllerAs:"vm",templateUrl:"projects/components/watch-project-button/watch-project-button.html"}},angular.module("taigaProjects").directive("tgWatchProjectButton",WatchProjectButtonDirective)}.call(this),function(){var WatchProjectButtonService,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,WatchProjectButtonService=function(superClass){function WatchProjectButtonService(rs,currentUserService,projectService){this.rs=rs,this.currentUserService=currentUserService,this.projectService=projectService}return extend(WatchProjectButtonService,superClass),WatchProjectButtonService.$inject=["tgResources","tgCurrentUserService","tgProjectService"],WatchProjectButtonService.prototype._getProjectIndex=function(projectId){return this.currentUserService.projects.get("all").findIndex(function(project){return project.get("id")===projectId})},WatchProjectButtonService.prototype._updateProjects=function(projectId,notifyLevel,isWatcher){var projectIndex,projects;return projectIndex=this._getProjectIndex(projectId),-1!==projectIndex?(projects=this.currentUserService.projects.get("all").update(projectIndex,function(_this){return function(project){var totalWatchers;return totalWatchers=project.get("total_watchers"),!_this.projectService.project.get("is_watcher")&&isWatcher?totalWatchers++:_this.projectService.project.get("is_watcher")&&!isWatcher&&totalWatchers--,project.merge({is_watcher:isWatcher,total_watchers:totalWatchers,notify_level:notifyLevel})}}(this)),this.currentUserService.setProjects(projects)):void 0},WatchProjectButtonService.prototype._updateCurrentProject=function(notifyLevel,isWatcher){var project,totalWatchers;return totalWatchers=this.projectService.project.get("total_watchers"),!this.projectService.project.get("is_watcher")&&isWatcher?totalWatchers++:this.projectService.project.get("is_watcher")&&!isWatcher&&totalWatchers--,project=this.projectService.project.merge({is_watcher:isWatcher,notify_level:notifyLevel,total_watchers:totalWatchers}),this.projectService.setProject(project)},WatchProjectButtonService.prototype.watch=function(projectId,notifyLevel){return this.rs.projects.watchProject(projectId,notifyLevel).then(function(_this){return function(){return _this._updateProjects(projectId,notifyLevel,!0),_this._updateCurrentProject(notifyLevel,!0)}}(this))},WatchProjectButtonService.prototype.unwatch=function(projectId){return this.rs.projects.unwatchProject(projectId).then(function(_this){return function(){return _this._updateProjects(projectId,null,!1),_this._updateCurrentProject(null,!1)}}(this))},WatchProjectButtonService}(taiga.Service),angular.module("taigaProjects").service("tgWatchProjectButtonService",WatchProjectButtonService)}.call(this),function(){var ProjectsListingController;ProjectsListingController=function(){function ProjectsListingController(currentUserService,projectsService){this.currentUserService=currentUserService,this.projectsService=projectsService,taiga.defineImmutableProperty(this,"projects",function(_this){return function(){return _this.currentUserService.projects.get("all")}}(this))}return ProjectsListingController.$inject=["tgCurrentUserService","tgProjectsService"],ProjectsListingController.prototype.newProject=function(){return this.projectsService.newProject()},ProjectsListingController}(),angular.module("taigaProjects").controller("ProjectsListing",ProjectsListingController)}.call(this),function(){var ProjectController;ProjectController=function(){function ProjectController(routeParams,appMetaService,auth,translate,projectService){var projectSlug;this.routeParams=routeParams,this.appMetaService=appMetaService,this.auth=auth,this.translate=translate,this.projectService=projectService,projectSlug=this.routeParams.pslug,this.user=this.auth.userData,taiga.defineImmutableProperty(this,"project",function(_this){return function(){return _this.projectService.project}}(this)),taiga.defineImmutableProperty(this,"members",function(_this){return function(){return _this.projectService.activeMembers}}(this)),this.appMetaService.setfn(this._setMeta.bind(this))}return ProjectController.$inject=["$routeParams","tgAppMetaService","$tgAuth","$translate","tgProjectService"],ProjectController.prototype._setMeta=function(project){var ctx,metas;return this.project?(metas={},ctx={projectName:this.project.get("name")},metas.title=this.translate.instant("PROJECT.PAGE_TITLE",ctx),metas.description=this.project.get("description"),metas):null},ProjectController}(),angular.module("taigaProjects").controller("Project",ProjectController)}.call(this),function(){var ProjectsService,groupBy,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,groupBy=this.taiga.groupBy,ProjectsService=function(superClass){function ProjectsService(rs,projectUrl,lightboxFactory){this.rs=rs,this.projectUrl=projectUrl,this.lightboxFactory=lightboxFactory}return extend(ProjectsService,superClass),ProjectsService.$inject=["tgResources","$projectUrl","tgLightboxFactory"],ProjectsService.prototype.getProjectBySlug=function(projectSlug){return this.rs.projects.getProjectBySlug(projectSlug).then(function(_this){return function(project){return _this._decorate(project)}}(this))},ProjectsService.prototype.getProjectStats=function(projectId){return this.rs.projects.getProjectStats(projectId)},ProjectsService.prototype.getProjectsByUserId=function(userId,paginate){return this.rs.projects.getProjectsByUserId(userId,paginate).then(function(_this){return function(projects){return projects.map(_this._decorate.bind(_this))}}(this))},ProjectsService.prototype._decorate=function(project){var colorized_tags,tags,url;return url=this.projectUrl.get(project.toJS()),project=project.set("url",url),colorized_tags=[],project.get("tags")&&(tags=project.get("tags").sort(),colorized_tags=tags.map(function(tag){var color;return color=project.get("tags_colors").get(tag),Immutable.fromJS({name:tag,color:color})}),project=project.set("colorized_tags",colorized_tags)),project},ProjectsService.prototype.newProject=function(){return this.lightboxFactory.create("tg-lb-create-project",{"class":"wizard-create-project"})},ProjectsService.prototype.bulkUpdateProjectsOrder=function(sortData){return this.rs.projects.bulkUpdateOrder(sortData)},ProjectsService}(taiga.Service),angular.module("taigaProjects").service("tgProjectsService",ProjectsService); +}.call(this),function(){var Resource,module,sizeFormat,taiga;taiga=this.taiga,sizeFormat=this.taiga.sizeFormat,Resource=function(urlsService,http,config,$rootScope,$q,storage){var service;return service={},service.list=function(type,objectId,projectId){var httpOptions,params,url,urlname;return urlname="attachments/"+type,params={object_id:objectId,project:projectId},httpOptions={headers:{"x-disable-pagination":"1"}},url=urlsService.resolve(urlname),http.get(url,params,httpOptions).then(function(result){return Immutable.fromJS(result.data)})},service["delete"]=function(type,id){var url,urlname;return urlname="attachments/"+type,url=urlsService.resolve(urlname)+("/"+id),http["delete"](url)},service.patch=function(type,id,patch){var url,urlname;return urlname="attachments/"+type,url=urlsService.resolve(urlname)+("/"+id),http.patch(url,patch)},service.create=function(type,projectId,objectId,file){var data,defered,maxFileSize,response,token,uploadComplete,uploadFailed,uploadProgress,url,urlname,xhr;return urlname="attachments/"+type,url=urlsService.resolve(urlname),defered=$q.defer(),void 0===file?(defered.reject(null),defered.promise):(maxFileSize=config.get("maxUploadFileSize",null),maxFileSize&&file.size>maxFileSize?(response={status:413,data:{_error_message:"'"+file.name+"' ("+sizeFormat(file.size)+") is too heavy for our oompa loompas, try it with a smaller than ("+sizeFormat(maxFileSize)+")"}},defered.reject(response),defered.promise):(uploadProgress=function(_this){return function(evt){return $rootScope.$apply(function(){return file.status="in-progress",file.size=sizeFormat(evt.total),file.progressMessage="upload "+sizeFormat(evt.loaded)+" of "+sizeFormat(evt.total),file.progressPercent=Math.round(evt.loaded/evt.total*100)+"%"})}}(this),uploadComplete=function(_this){return function(evt){return $rootScope.$apply(function(){var attachment,ref,status;file.status="done",status=evt.target.status;try{attachment=JSON.parse(evt.target.responseText)}catch(error){attachment={}}return status>=200&&400>status?(attachment=Immutable.fromJS(attachment),defered.resolve(attachment)):(response={status:status,data:{_error_message:null!=(ref=data.attached_file)?ref[0]:void 0}},defered.reject(response))})}}(this),uploadFailed=function(_this){return function(evt){return $rootScope.$apply(function(){return file.status="error",defered.reject("fail")})}}(this),data=new FormData,data.append("project",projectId),data.append("object_id",objectId),data.append("attached_file",file),xhr=new XMLHttpRequest,xhr.upload.addEventListener("progress",uploadProgress,!1),xhr.addEventListener("load",uploadComplete,!1),xhr.addEventListener("error",uploadFailed,!1),token=storage.get("token"),xhr.open("POST",url),xhr.setRequestHeader("Authorization","Bearer "+token),xhr.setRequestHeader("Accept","application/json"),xhr.send(data),defered.promise))},function(){return{attachments:service}}},Resource.$inject=["$tgUrls","$tgHttp","$tgConfig","$rootScope","$q","$tgStorage"],module=angular.module("taigaResources2"),module.factory("tgAttachmentsResource",Resource)}.call(this),function(){var Resource,module;Resource=function(urlsService,http){var service;return service={},service.getApplicationToken=function(applicationId,state){var url;return url=urlsService.resolve("applications"),url=url+"/"+applicationId+"/token?state="+state,http.get(url).then(function(result){return Immutable.fromJS(result.data)})},service.authorizeApplicationToken=function(applicationId,state){var data,url;return url=urlsService.resolve("application-tokens"),url+="/authorize",data={state:state,application:applicationId},http.post(url,data).then(function(result){return Immutable.fromJS(result.data)})},function(){return{externalapps:service}}},Resource.$inject=["$tgUrls","$tgHttp"],module=angular.module("taigaResources2"),module.factory("tgExternalAppsResource",Resource)}.call(this),function(){var Resource,module;Resource=function(urlsService,http){var service;return service={},service.listInAllProjects=function(params){var httpOptions,url;return url=urlsService.resolve("issues"),httpOptions={headers:{"x-disable-pagination":"1"}},http.get(url,params,httpOptions).then(function(result){return Immutable.fromJS(result.data)})},function(){return{issues:service}}},Resource.$inject=["$tgUrls","$tgHttp"],module=angular.module("taigaResources2"),module.factory("tgIssuesResource",Resource)}.call(this),function(){var Resource,module,pagination;pagination=function(){},Resource=function(urlsService,http,paginateResponseService){var service;return service={},service.getProjects=function(params,pagination){var httpOptions,url;return null==params&&(params={}),null==pagination&&(pagination=!0),url=urlsService.resolve("projects"),httpOptions={},pagination||(httpOptions={headers:{"x-lazy-pagination":!0}}),http.get(url,params,httpOptions)},service.getProjectBySlug=function(projectSlug){var url;return url=urlsService.resolve("projects"),url=url+"/by_slug?slug="+projectSlug,http.get(url).then(function(result){return Immutable.fromJS(result.data)})},service.getProjectsByUserId=function(userId,paginate){var httpOptions,params,url;return null==paginate&&(paginate=!1),url=urlsService.resolve("projects"),httpOptions={},paginate||(httpOptions.headers={"x-disable-pagination":"1"}),params={member:userId,order_by:"memberships__user_order"},http.get(url,params,httpOptions).then(function(result){return Immutable.fromJS(result.data)})},service.getProjectStats=function(projectId){var url;return url=urlsService.resolve("projects"),url=url+"/"+projectId,http.get(url).then(function(result){return Immutable.fromJS(result.data)})},service.bulkUpdateOrder=function(bulkData){var url;return url=urlsService.resolve("bulk-update-projects-order"),http.post(url,bulkData)},service.getTimeline=function(projectId,page){var params,url;return params={page:page,only_relevant:!0},url=urlsService.resolve("timeline-project"),url=url+"/"+projectId,http.get(url,params,{headers:{"x-lazy-pagination":!0}}).then(function(result){return result=Immutable.fromJS(result),paginateResponseService(result)})},service.likeProject=function(projectId){var url;return url=urlsService.resolve("project-like",projectId),http.post(url)},service.unlikeProject=function(projectId){var url;return url=urlsService.resolve("project-unlike",projectId),http.post(url)},service.watchProject=function(projectId,notifyLevel){var data,url;return data={notify_level:notifyLevel},url=urlsService.resolve("project-watch",projectId),http.post(url,data)},service.unwatchProject=function(projectId){var url;return url=urlsService.resolve("project-unwatch",projectId),http.post(url)},function(){return{projects:service}}},Resource.$inject=["$tgUrls","$tgHttp","tgPaginateResponseService"],module=angular.module("taigaResources2"),module.factory("tgProjectsResources",Resource)}.call(this),function(){var Resources,services;services=["tgProjectsResources","tgUserResources","tgUsersResources","tgUserstoriesResource","tgTasksResource","tgIssuesResource","tgExternalAppsResource","tgAttachmentsResource","tgStatsResource"],Resources=function($injector){var i,j,len,len1,ref,service,serviceFn,serviceName,serviceProperty;for(i=0,len=services.length;len>i;i++)for(serviceName=services[i],serviceFn=$injector.get(serviceName),service=$injector.invoke(serviceFn),ref=Object.keys(service),j=0,len1=ref.length;len1>j;j++)serviceProperty=ref[j],this[serviceProperty]&&console.warm("repeated resource "+serviceProperty),this[serviceProperty]=service[serviceProperty];return this},Resources.$inject=["$injector"],angular.module("taigaResources2").service("tgResources",Resources)}.call(this),function(){var Resource,module;Resource=function(urlsService,http){var service;return service={},service.discover=function(applicationId,state){var url;return url=urlsService.resolve("stats-discover"),http.get(url).then(function(result){return Immutable.fromJS(result.data)})},function(){return{stats:service}}},Resource.$inject=["$tgUrls","$tgHttp"],module=angular.module("taigaResources2"),module.factory("tgStatsResource",Resource)}.call(this),function(){var Resource,module;Resource=function(urlsService,http){var service;return service={},service.listInAllProjects=function(params){var httpOptions,url;return url=urlsService.resolve("tasks"),httpOptions={headers:{"x-disable-pagination":"1"}},http.get(url,params,httpOptions).then(function(result){return Immutable.fromJS(result.data)})},function(){return{tasks:service}}},Resource.$inject=["$tgUrls","$tgHttp"],module=angular.module("taigaResources2"),module.factory("tgTasksResource",Resource)}.call(this),function(){var Resource,module;Resource=function(urlsService,http,paginateResponseService){var service;return service={},service.getUserStorage=function(key){var httpOptions,url;return url=urlsService.resolve("user-storage"),key&&(url+="/"+key),httpOptions={},http.get(url,{}).then(function(response){return response.data.value})},service.setUserStorage=function(key,value){var params,url;return url=urlsService.resolve("user-storage")+"/"+key,params={key:key,value:value},http.put(url,params)},service.createUserStorage=function(key,value){var params,url;return url=urlsService.resolve("user-storage"),params={key:key,value:value},http.post(url,params)},function(){return{user:service}}},Resource.$inject=["$tgUrls","$tgHttp"],module=angular.module("taigaResources2"),module.factory("tgUserResources",Resource)}.call(this),function(){var Resource,module;Resource=function(urlsService,http,paginateResponseService){var service;return service={},service.getUserByUsername=function(username){var httpOptions,params,url;return url=urlsService.resolve("by_username"),httpOptions={headers:{"x-disable-pagination":"1"}},params={username:username},http.get(url,params,httpOptions).then(function(result){return Immutable.fromJS(result.data)})},service.getStats=function(userId){var httpOptions,url;return url=urlsService.resolve("user-stats",userId),httpOptions={headers:{"x-disable-pagination":"1"}},http.get(url,{},httpOptions).then(function(result){return Immutable.fromJS(result.data)})},service.getContacts=function(userId){var httpOptions,url;return url=urlsService.resolve("user-contacts",userId),httpOptions={headers:{"x-disable-pagination":"1"}},http.get(url,{},httpOptions).then(function(result){return Immutable.fromJS(result.data)})},service.getLiked=function(userId,page,type,q){var params,url;return url=urlsService.resolve("user-liked",userId),params={},null!=page&&(params.page=page),null!=type&&(params.type=type),null!=q&&(params.q=q),params.only_relevant=!0,http.get(url,params,{headers:{"x-lazy-pagination":!0}}).then(function(result){return result=Immutable.fromJS(result),paginateResponseService(result)})},service.getVoted=function(userId,page,type,q){var params,url;return url=urlsService.resolve("user-voted",userId),params={},null!=page&&(params.page=page),null!=type&&(params.type=type),null!=q&&(params.q=q),http.get(url,params,{headers:{"x-lazy-pagination":!0}}).then(function(result){return result=Immutable.fromJS(result),paginateResponseService(result)})},service.getWatched=function(userId,page,type,q){var params,url;return url=urlsService.resolve("user-watched",userId),params={},null!=page&&(params.page=page),null!=type&&(params.type=type),null!=q&&(params.q=q),http.get(url,params,{headers:{"x-lazy-pagination":!0}}).then(function(result){return result=Immutable.fromJS(result),paginateResponseService(result)})},service.getProfileTimeline=function(userId,page){var params,url;return params={page:page},url=urlsService.resolve("timeline-profile"),url=url+"/"+userId,http.get(url,params,{headers:{"x-lazy-pagination":!0}}).then(function(result){return result=Immutable.fromJS(result),paginateResponseService(result)})},service.getUserTimeline=function(userId,page){var params,url;return params={page:page,only_relevant:!0},url=urlsService.resolve("timeline-user"),url=url+"/"+userId,http.get(url,params,{headers:{"x-lazy-pagination":!0}}).then(function(result){return result=Immutable.fromJS(result),paginateResponseService(result)})},function(){return{users:service}}},Resource.$inject=["$tgUrls","$tgHttp","tgPaginateResponseService"],module=angular.module("taigaResources2"),module.factory("tgUsersResources",Resource)}.call(this),function(){var Resource,module;Resource=function(urlsService,http){var service;return service={},service.listInAllProjects=function(params){var httpOptions,url;return url=urlsService.resolve("userstories"),httpOptions={headers:{"x-disable-pagination":"1"}},http.get(url,params,httpOptions).then(function(result){return Immutable.fromJS(result.data)})},function(){return{userstories:service}}},Resource.$inject=["$tgUrls","$tgHttp"],module=angular.module("taigaResources2"),module.factory("tgUserstoriesResource",Resource)}.call(this),function(){var AppMetaService,taiga,truncate;taiga=this.taiga,truncate=taiga.truncate,AppMetaService=function(){function AppMetaService(rootScope){this.rootScope=rootScope}return AppMetaService.$inject=["$rootScope"],AppMetaService.prototype._set=function(key,value){var meta;if(key)return"title"===key?(meta=$("title"),0===meta.length&&(meta=$(""),$("head").append(meta)),meta.text(value||"")):0===key.indexOf("og:")?(meta=$("meta[property='"+key+"']"),0===meta.length&&(meta=$(""),$("head").append(meta)),meta.attr("content",value||"")):(meta=$("meta[name='"+key+"']"),0===meta.length&&(meta=$(""),$("head").append(meta)),meta.attr("content",value||""))},AppMetaService.prototype.setTitle=function(title){return this._set("title",title)},AppMetaService.prototype.setDescription=function(description){return this._set("description",truncate(description,250))},AppMetaService.prototype.setTwitterMetas=function(title,description){return this._set("twitter:card","summary"),this._set("twitter:site","@taigaio"),this._set("twitter:title",title),this._set("twitter:description",truncate(description,300)),this._set("twitter:image",window.location.origin+"/"+window._version+"/images/logo-color.png")},AppMetaService.prototype.setOpenGraphMetas=function(title,description){return this._set("og:type","object"),this._set("og:site_name","Taiga - Love your projects"),this._set("og:title",title),this._set("og:description",truncate(description,300)),this._set("og:image",window.location.origin+"/"+window._version+"/images/logo-color.png"),this._set("og:url",window.location.href)},AppMetaService.prototype.setAll=function(title,description){return this.setTitle(title),this.setDescription(description),this.setTwitterMetas(title,description),this.setOpenGraphMetas(title,description)},AppMetaService.prototype.addMobileViewport=function(){return $("head").append('')},AppMetaService.prototype.removeMobileViewport=function(){return $('meta[name="viewport"]').remove()},AppMetaService.prototype.setfn=function(fn){return this.listener&&this._listener(),this._listener=this.rootScope.$watchCollection(fn,function(_this){return function(metas){return metas?(_this.setAll(metas.title,metas.description),_this._listener()):void 0}}(this))},AppMetaService}(),angular.module("taigaCommon").service("tgAppMetaService",AppMetaService)}.call(this),function(){var AttachmentsService,sizeFormat;sizeFormat=this.taiga.sizeFormat,AttachmentsService=function(){function AttachmentsService(confirm,config,translate,rs){this.confirm=confirm,this.config=config,this.translate=translate,this.rs=rs,this.maxFileSize=this.getMaxFileSize(),this.maxFileSize&&(this.maxFileSizeFormated=sizeFormat(this.maxFileSize))}return AttachmentsService.$inject=["$tgConfirm","$tgConfig","$translate","tgResources"],AttachmentsService.prototype.sizeError=function(file){var message;return message=this.translate.instant("ATTACHMENT.ERROR_MAX_SIZE_EXCEEDED",{fileName:file.name,fileSize:sizeFormat(file.size),maxFileSize:this.maxFileSizeFormated}),this.confirm.notify("error",message)},AttachmentsService.prototype.validate=function(file){return this.maxFileSize&&file.size>this.maxFileSize?(this.sizeError(file),!1):!0},AttachmentsService.prototype.getMaxFileSize=function(){return this.config.get("maxUploadFileSize",null)},AttachmentsService.prototype.list=function(type,objId,projectId){return this.rs.attachments.list(type,objId,projectId).then(function(_this){return function(attachments){return attachments.sortBy(function(attachment){return attachment.get("order")})}}(this))},AttachmentsService.prototype["delete"]=function(type,id){return this.rs.attachments["delete"](type,id)},AttachmentsService.prototype.saveError=function(file,data){var message;return message="",file&&(message=this.translate.instant("ATTACHMENT.ERROR_UPLOAD_ATTACHMENT",{fileName:file.name,errorMessage:data.data._error_message})),this.confirm.notify("error",message)},AttachmentsService.prototype.upload=function(file,objId,projectId,type){var promise;return promise=this.rs.attachments.create(type,projectId,objId,file),promise.then(null,this.saveError.bind(this,file)),promise},AttachmentsService.prototype.patch=function(id,type,patch){var promise;return promise=this.rs.attachments.patch(type,id,patch),promise.then(null,this.saveError.bind(this,null)),promise},AttachmentsService}(),angular.module("taigaCommon").service("tgAttachmentsService",AttachmentsService)}.call(this),function(){var ChekcPermissionsService,taiga;taiga=this.taiga,ChekcPermissionsService=function(){function ChekcPermissionsService(projectService){this.projectService=projectService}return ChekcPermissionsService.$inject=["tgProjectService"],ChekcPermissionsService.prototype.check=function(permission){return-1!==this.projectService.project.get("my_permissions").indexOf(permission)},ChekcPermissionsService}(),angular.module("taigaCommon").service("tgCheckPermissionsService",ChekcPermissionsService)}.call(this),function(){var CurrentUserService,groupBy,taiga;taiga=this.taiga,groupBy=this.taiga.groupBy,CurrentUserService=function(){function CurrentUserService(projectsService,storageService,rs){this.projectsService=projectsService,this.storageService=storageService,this.rs=rs,this._user=null,this._projects=Immutable.Map(),this._projectsById=Immutable.Map(),this._joyride=null,taiga.defineImmutableProperty(this,"projects",function(_this){return function(){return _this._projects}}(this)),taiga.defineImmutableProperty(this,"projectsById",function(_this){return function(){return _this._projectsById}}(this))}return CurrentUserService.$inject=["tgProjectsService","$tgStorage","tgResources"],CurrentUserService.prototype.isAuthenticated=function(){return null!==this.getUser()?!0:!1},CurrentUserService.prototype.getUser=function(){var userData;return this._user||(userData=this.storageService.get("userInfo"),userData&&(userData=Immutable.fromJS(userData),this.setUser(userData))),this._user},CurrentUserService.prototype.removeUser=function(){return this._user=null,this._projects=Immutable.Map(),this._projectsById=Immutable.Map(),this._joyride=null},CurrentUserService.prototype.setUser=function(user){return this._user=user,this._loadUserInfo()},CurrentUserService.prototype.bulkUpdateProjectsOrder=function(sortData){return this.projectsService.bulkUpdateProjectsOrder(sortData).then(function(_this){return function(){return _this.loadProjects()}}(this))},CurrentUserService.prototype.loadProjects=function(){return this.projectsService.getProjectsByUserId(this._user.get("id")).then(function(_this){return function(projects){return _this.setProjects(projects)}}(this))},CurrentUserService.prototype.disableJoyRide=function(section){return section?this._joyride[section]=!1:this._joyride={backlog:!1,kanban:!1,dashboard:!1},this.rs.user.setUserStorage("joyride",this._joyride)},CurrentUserService.prototype.loadJoyRideConfig=function(){return new Promise(function(_this){return function(resolve){return null!==_this._joyride?void resolve(_this._joyride):_this.rs.user.getUserStorage("joyride").then(function(config){return _this._joyride=config,resolve(_this._joyride)})["catch"](function(){return _this._joyride={backlog:!0,kanban:!0,dashboard:!0},_this.rs.user.createUserStorage("joyride",_this._joyride),resolve(_this._joyride)})}}(this))},CurrentUserService.prototype._loadUserInfo=function(){return Promise.all([this.loadProjects()])},CurrentUserService.prototype.setProjects=function(projects){return this._projects=this._projects.set("all",projects),this._projects=this._projects.set("recents",projects.slice(0,10)),this._projectsById=Immutable.fromJS(groupBy(projects.toJS(),function(p){return p.id})),this.projects},CurrentUserService}(),angular.module("taigaCommon").service("tgCurrentUserService",CurrentUserService)}.call(this),function(){var LightboxFactory;LightboxFactory=function(){function LightboxFactory(rootScope,compile){this.rootScope=rootScope,this.compile=compile}return LightboxFactory.$inject=["$rootScope","$compile"],LightboxFactory.prototype.create=function(name,attrs,scopeAttrs){var elm,html,scope;scope=this.rootScope.$new(),scope=_.merge(scope,scopeAttrs),elm=$("
").attr(name,!0).attr("tg-bind-scope",!0),attrs&&elm.attr(attrs),elm.addClass("remove-on-close"),html=this.compile(elm)(scope),$(document.body).append(html)},LightboxFactory}(),angular.module("taigaCommon").service("tgLightboxFactory",LightboxFactory)}.call(this),function(){var PaginateResponse;PaginateResponse=function(){return function(result){var paginateResponse;return paginateResponse=Immutable.Map({data:result.get("data"),next:!!result.get("headers")("x-pagination-next"),prev:!!result.get("headers")("x-pagination-prev"),current:result.get("headers")("x-pagination-current"),count:result.get("headers")("x-pagination-count")})}},angular.module("taigaCommon").factory("tgPaginateResponseService",PaginateResponse)}.call(this),function(){var ProjectService,taiga;taiga=this.taiga,ProjectService=function(){function ProjectService(projectsService,xhrError){this.projectsService=projectsService,this.xhrError=xhrError,this._project=null,this._section=null,this._sectionsBreadcrumb=Immutable.List(),this._activeMembers=Immutable.List(),taiga.defineImmutableProperty(this,"project",function(_this){return function(){return _this._project}}(this)),taiga.defineImmutableProperty(this,"section",function(_this){return function(){return _this._section}}(this)),taiga.defineImmutableProperty(this,"sectionsBreadcrumb",function(_this){return function(){return _this._sectionsBreadcrumb}}(this)),taiga.defineImmutableProperty(this,"activeMembers",function(_this){return function(){return _this._activeMembers}}(this))}return ProjectService.$inject=["tgProjectsService","tgXhrErrorService"],ProjectService.prototype.setSection=function(section){return this._section=section,section?this._sectionsBreadcrumb=this._sectionsBreadcrumb.push(this._section):this._sectionsBreadcrumb=Immutable.List()},ProjectService.prototype.setProjectBySlug=function(pslug){return new Promise(function(_this){return function(resolve,reject){return _this.project&&_this.project.get("slug")===pslug?resolve():_this.projectsService.getProjectBySlug(pslug).then(function(project){return _this.setProject(project),resolve()})["catch"](function(xhr){return _this.xhrError.response(xhr)})}}(this))},ProjectService.prototype.setProject=function(project){return this._project=project,this._activeMembers=this._project.get("members").filter(function(member){return member.get("is_active")})},ProjectService.prototype.cleanProject=function(){return this._project=null,this._activeMembers=Immutable.List(),this._section=null,this._sectionsBreadcrumb=Immutable.List()},ProjectService.prototype.hasPermission=function(permission){return-1!==this._project.get("my_permissions").indexOf(permission)},ProjectService.prototype.fetchProject=function(){var pslug;return pslug=this.project.get("slug"),this.projectsService.getProjectBySlug(pslug).then(function(_this){return function(project){return _this.setProject(project)}}(this))},ProjectService}(),angular.module("taigaCommon").service("tgProjectService",ProjectService)}.call(this),function(){var ScopeEvent;ScopeEvent=function(){function ScopeEvent(){}return ScopeEvent.prototype.scopes={},ScopeEvent.prototype._searchDuplicatedScopes=function(id){return _.find(Object.keys(this.scopes),function(_this){return function(key){return _this.scopes[key].$id===id}}(this))},ScopeEvent.prototype._create=function(name,scope){var duplicatedScopeName;if(duplicatedScopeName=this._searchDuplicatedScopes(scope.$id))throw new Error('scopeEvent: this scope is already register with the name "'+duplicatedScopeName+'"');if(this.scopes[name])throw new Error('scopeEvent: "'+name+'" already in use');return scope._tgEmitter=new EventEmitter2,scope.$on("$destroy",function(_this){return function(){return scope._tgEmitter.removeAllListeners(),delete _this.scopes[name]}}(this)),this.scopes[name]=scope},ScopeEvent.prototype.emitter=function(name,scope){if(scope)scope=this._create(name,scope);else{if(!this.scopes[name])throw new Error('scopeEvent: "'+name+"\" scope doesn't exist'");scope=this.scopes[name]}return scope._tgEmitter},ScopeEvent}(),angular.module("taigaCommon").service("tgScopeEvent",ScopeEvent)}.call(this),function(){var ThemeService,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,ThemeService=function(superClass){function ThemeService(){return ThemeService.__super__.constructor.apply(this,arguments)}return extend(ThemeService,superClass),ThemeService}(taiga.Service=function(){return{use:function(themeName){var stylesheetEl;return stylesheetEl=$("link[rel='stylesheet']:first"),0===stylesheetEl.length&&(stylesheetEl=$(""),$("head").append(stylesheetEl)),stylesheetEl.attr("href","/"+window._version+"/styles/theme-"+themeName+".css")}}}),angular.module("taigaCommon").service("tgThemeService",ThemeService)}.call(this),function(){var UserService,bindMethods,taiga,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;taiga=this.taiga,bindMethods=taiga.bindMethods,UserService=function(superClass){function UserService(rs){this.rs=rs,bindMethods(this)}return extend(UserService,superClass),UserService.$inject=["tgResources"],UserService.prototype.getUserByUserName=function(username){return this.rs.users.getUserByUsername(username)},UserService.prototype.getContacts=function(userId){return this.rs.users.getContacts(userId)},UserService.prototype.getLiked=function(userId,pageNumber,objectType,textQuery){return this.rs.users.getLiked(userId,pageNumber,objectType,textQuery)},UserService.prototype.getVoted=function(userId,pageNumber,objectType,textQuery){return this.rs.users.getVoted(userId,pageNumber,objectType,textQuery)},UserService.prototype.getWatched=function(userId,pageNumber,objectType,textQuery){return this.rs.users.getWatched(userId,pageNumber,objectType,textQuery)},UserService.prototype.getStats=function(userId){return this.rs.users.getStats(userId)},UserService.prototype.attachUserContactsToProjects=function(userId,projects){return this.getContacts(userId).then(function(contacts){return projects=projects.map(function(project){var contactsFiltered;return contactsFiltered=contacts.filter(function(contact){var contactId;return contactId=contact.get("id"),-1!==project.get("members").indexOf(contactId)}),project=project.set("contacts",contactsFiltered)})})},UserService}(taiga.Service),angular.module("taigaCommon").service("tgUserService",UserService)}.call(this),function(){var xhrError,extend=function(child,parent){function ctor(){this.constructor=child}for(var key in parent)hasProp.call(parent,key)&&(child[key]=parent[key]);return ctor.prototype=parent.prototype,child.prototype=new ctor,child.__super__=parent.prototype,child},hasProp={}.hasOwnProperty;xhrError=function(superClass){function xhrError(q,location,navUrls){this.q=q,this.location=location,this.navUrls=navUrls}return extend(xhrError,superClass),xhrError.$inject=["$q","$location","$tgNavUrls"],xhrError.prototype.notFound=function(){return this.location.path(this.navUrls.resolve("not-found")),this.location.replace()},xhrError.prototype.permissionDenied=function(){return this.location.path(this.navUrls.resolve("permission-denied")),this.location.replace()},xhrError.prototype.response=function(xhr){return xhr&&(404===xhr.status?this.notFound():403===xhr.status&&this.permissionDenied()),this.q.reject(xhr)},xhrError}(taiga.Service),angular.module("taigaCommon").service("tgXhrErrorService",xhrError)}.call(this),function(){var UserTimelineAttachmentDirective;UserTimelineAttachmentDirective=function(template,$compile){var isImage,link,validFileExtensions;return validFileExtensions=[".jpg",".jpeg",".bmp",".gif",".png"],isImage=function(url){return url=url.toLowerCase(),_.some(validFileExtensions,function(extension){return-1!==url.indexOf(extension,url-extension.length)})},link=function(scope,el){var is_image,templateHtml;return is_image=isImage(scope.attachment.get("url")),templateHtml=is_image?template.get("user-timeline/user-timeline-attachment/user-timeline-attachment-image.html"):template.get("user-timeline/user-timeline-attachment/user-timeline-attachment.html"),el.html(templateHtml),$compile(el.contents())(scope),el.find("img").error(function(){return this.remove()})},{link:link,scope:{attachment:"=tgUserTimelineAttachment"}}},UserTimelineAttachmentDirective.$inject=["$tgTemplate","$compile"],angular.module("taigaUserTimeline").directive("tgUserTimelineAttachment",UserTimelineAttachmentDirective)}.call(this),function(){var UserTimelineItemTitle,unslugify;unslugify=this.taiga.unslugify,UserTimelineItemTitle=function(){function UserTimelineItemTitle(translate,sce){this.translate=translate,this.sce=sce}return UserTimelineItemTitle.$inject=["$translate","$sce"],UserTimelineItemTitle.prototype._fieldTranslationKey={status:"COMMON.FIELDS.STATUS",subject:"COMMON.FIELDS.SUBJECT",description_diff:"COMMON.FIELDS.DESCRIPTION",points:"COMMON.FIELDS.POINTS",assigned_to:"COMMON.FIELDS.ASSIGNED_TO",severity:"ISSUES.FIELDS.SEVERITY",priority:"ISSUES.FIELDS.PRIORITY",type:"ISSUES.FIELDS.TYPE",is_iocaine:"TASK.FIELDS.IS_IOCAINE",is_blocked:"COMMON.FIELDS.IS_BLOCKED"},UserTimelineItemTitle.prototype._params={username:function(timeline,event){var title_attr,url,user;return user=timeline.getIn(["data","user"]),user.get("is_profile_visible")?(title_attr=this.translate.instant("COMMON.SEE_USER_PROFILE",{username:user.get("username")}),url="user-profile:username=timeline.getIn(['data', 'user', 'username'])",this._getLink(url,user.get("name"),title_attr)):this._getUsernameSpan(user.get("name"))},field_name:function(timeline,event){var field_name;return field_name=timeline.getIn(["data","value_diff","key"]),this.translate.instant(this._fieldTranslationKey[field_name])},project_name:function(timeline,event){var url;return url="project:project=timeline.getIn(['data', 'project', 'slug'])",this._getLink(url,timeline.getIn(["data","project","name"]))},new_value:function(timeline,event){var new_value,value;return _.isArray(timeline.getIn(["data","value_diff","value"]).toJS())?(value=timeline.getIn(["data","value_diff","value"]).get(1),null===value&&"assigned_to"===timeline.getIn(["data","value_diff","key"])&&(value=this.translate.instant("ACTIVITY.VALUES.UNASSIGNED")),new_value=value):new_value=timeline.getIn(["data","value_diff","value"]).first().get(1),_.escape(new_value)},sprint_name:function(timeline,event){var url;return url="project-taskboard:project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['data', 'milestone', 'slug'])", +this._getLink(url,timeline.getIn(["data","milestone","name"]))},us_name:function(timeline,event){var event_us,obj,text,url;return obj=this._getTimelineObj(timeline,event).get("userstory"),event_us={obj:"parent_userstory"},url=this._getDetailObjUrl(event_us),text="#"+obj.get("ref")+" "+obj.get("subject"),this._getLink(url,text)},obj_name:function(timeline,event){var obj,text,url;return obj=this._getTimelineObj(timeline,event),url=this._getDetailObjUrl(event),text="wikipage"===event.obj?unslugify(obj.get("slug")):"milestone"===event.obj?obj.get("name"):"#"+obj.get("ref")+" "+obj.get("subject"),this._getLink(url,text)},role_name:function(timeline,event){return _.escape(timeline.getIn(["data","value_diff","value"]).keySeq().first())}},UserTimelineItemTitle.prototype._translateTitleParams=function(param,timeline,event){return this._params[param].call(this,timeline,event)},UserTimelineItemTitle.prototype._getTimelineObj=function(timeline,event){return timeline.getIn(["data",event.obj])},UserTimelineItemTitle.prototype._getDetailObjUrl=function(event){var url;return url={issue:["project-issues-detail",":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])"],wikipage:["project-wiki-page",":project=timeline.getIn(['data', 'project', 'slug']),slug=timeline.getIn(['obj', 'slug'])"],task:["project-tasks-detail",":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])"],userstory:["project-userstories-detail",":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])"],parent_userstory:["project-userstories-detail",":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'userstory', 'ref'])"],milestone:["project-taskboard",":project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['obj', 'slug'])"]},url[event.obj][0]+url[event.obj][1]},UserTimelineItemTitle.prototype._getLink=function(url,text,title){return title=title||text,$("").attr("tg-nav",url).text(text).attr("title",title).prop("outerHTML")},UserTimelineItemTitle.prototype._getUsernameSpan=function(text){var title;return title=title||text,$("").addClass("username").text(text).prop("outerHTML")},UserTimelineItemTitle.prototype._getParams=function(timeline,event,timeline_type){var params;return params={},timeline_type.translate_params.forEach(function(_this){return function(param){return params[param]=_this._translateTitleParams(param,timeline,event)}}(this)),params},UserTimelineItemTitle.prototype.getTitle=function(timeline,event,type){var params,paramsKeys,translation;return params=this._getParams(timeline,event,type),paramsKeys={},Object.keys(params).forEach(function(key){return paramsKeys[key]="{{"+key+"}}"}),translation=this.translate.instant(type.key,paramsKeys),Object.keys(params).forEach(function(key){var find;return find="{{"+key+"}}",translation=translation.replace(new RegExp(find,"g"),params[key])}),translation},UserTimelineItemTitle}(),angular.module("taigaUserTimeline").service("tgUserTimelineItemTitle",UserTimelineItemTitle)}.call(this),function(){var UserTimelineType,timelineType;timelineType=function(timeline,event){var types;return types=[{check:function(timeline,event){return"membership"===event.obj},key:"TIMELINE.NEW_MEMBER",translate_params:["project_name"],member:function(timeline){return Immutable.Map({user:timeline.getIn(["data","user"]),role:timeline.getIn(["data","role"])})}},{check:function(timeline,event){return"project"===event.obj&&"create"===event.type},key:"TIMELINE.NEW_PROJECT",translate_params:["username","project_name"],description:function(timeline){return timeline.getIn(["data","project","description"])}},{check:function(timeline,event){return"change"===event.type&&timeline.hasIn(["data","value_diff"])&&"attachments"===timeline.getIn(["data","value_diff","key"])},key:"TIMELINE.UPLOAD_ATTACHMENT",translate_params:["username","obj_name"]},{check:function(timeline,event){return"userstory"===event.obj&&"create"===event.type},key:"TIMELINE.US_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(timeline,event){return"issue"===event.obj&&"create"===event.type},key:"TIMELINE.ISSUE_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(timeline,event){return"wikipage"===event.obj&&"create"===event.type},key:"TIMELINE.WIKI_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(timeline,event){return"task"===event.obj&&"create"===event.type&&!timeline.getIn(["data","task","userstory"])},key:"TIMELINE.TASK_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(timeline,event){return"task"===event.obj&&"create"===event.type&&timeline.getIn(["data","task","userstory"])},key:"TIMELINE.TASK_CREATED_WITH_US",translate_params:["username","project_name","obj_name","us_name"]},{check:function(timeline,event){return"milestone"===event.obj&&"create"===event.type},key:"TIMELINE.MILESTONE_CREATED",translate_params:["username","project_name","obj_name"]},{check:function(timeline,event){return timeline.getIn(["data","comment"])&&"userstory"===event.obj},key:"TIMELINE.NEW_COMMENT_US",translate_params:["username","obj_name"],description:function(timeline){var text;return text=timeline.getIn(["data","comment_html"]),$($.parseHTML(text)).text()}},{check:function(timeline,event){return timeline.getIn(["data","comment"])&&"issue"===event.obj},key:"TIMELINE.NEW_COMMENT_ISSUE",translate_params:["username","obj_name"],description:function(timeline){var text;return text=timeline.getIn(["data","comment_html"]),$($.parseHTML(text)).text()}},{check:function(timeline,event){return timeline.getIn(["data","comment"])&&"task"===event.obj},key:"TIMELINE.NEW_COMMENT_TASK",translate_params:["username","obj_name"],description:function(timeline){var text;return text=timeline.getIn(["data","comment_html"]),$($.parseHTML(text)).text()}},{check:function(timeline,event){return timeline.hasIn(["data","value_diff"])&&"moveInBacklog"===timeline.getIn(["data","value_diff","key"])&&timeline.hasIn(["data","value_diff","value","backlog_order"])&&"change"===event.type},key:"TIMELINE.US_MOVED",translate_params:["username","obj_name"]},{check:function(timeline,event){return timeline.hasIn(["data","value_diff"])&&"moveInBacklog"===timeline.getIn(["data","value_diff","key"])&&"change"===event.type&&"userstory"===event.obj?null===timeline.getIn(["data","value_diff","value","milestone"]).get(1):!1},key:"TIMELINE.US_REMOVED_FROM_MILESTONE",translate_params:["username","obj_name"]},{check:function(timeline,event){return timeline.hasIn(["data","value_diff"])&&"moveInBacklog"===timeline.getIn(["data","value_diff","key"])&&"change"===event.type&&"userstory"===event.obj},key:"TIMELINE.US_ADDED_MILESTONE",translate_params:["username","obj_name","sprint_name"]},{check:function(timeline,event){return timeline.hasIn(["data","value_diff"])&&"blocked"===timeline.getIn(["data","value_diff","key"])&&"change"===event.type?timeline.getIn(["data","value_diff","value","is_blocked"]).get(1)===!0:!1},key:"TIMELINE.BLOCKED",translate_params:["username","obj_name"],description:function(timeline){var text;return timeline.hasIn(["data","value_diff","value","blocked_note_html"])?(text=timeline.getIn(["data","value_diff","value","blocked_note_html"]).get(1),$($.parseHTML(text)).text()):!1}},{check:function(timeline,event){return timeline.hasIn(["data","value_diff"])&&"blocked"===timeline.getIn(["data","value_diff","key"])&&"change"===event.type?timeline.getIn(["data","value_diff","value","is_blocked"]).get(1)===!1:!1},key:"TIMELINE.UNBLOCKED",translate_params:["username","obj_name"]},{check:function(timeline,event){return"milestone"===event.obj&&"change"===event.type},key:"TIMELINE.MILESTONE_UPDATED",translate_params:["username","obj_name"]},{check:function(timeline,event){return"wikipage"===event.obj&&"change"===event.type},key:"TIMELINE.WIKI_UPDATED",translate_params:["username","obj_name"]},{check:function(timeline,event){return"userstory"===event.obj&&"change"===event.type&&timeline.hasIn(["data","value_diff"])&&"points"===timeline.getIn(["data","value_diff","key"])},key:"TIMELINE.US_UPDATED_POINTS",translate_params:["username","field_name","obj_name","new_value","role_name"]},{check:function(timeline,event){return"userstory"===event.obj&&"change"===event.type&&timeline.hasIn(["data","value_diff"])&&"description_diff"===timeline.getIn(["data","value_diff","key"])},key:"TIMELINE.US_UPDATED",translate_params:["username","field_name","obj_name"]},{check:function(timeline,event){return"userstory"===event.obj&&"change"===event.type},key:"TIMELINE.US_UPDATED_WITH_NEW_VALUE",translate_params:["username","field_name","obj_name","new_value"]},{check:function(timeline,event){return"issue"===event.obj&&"change"===event.type&&timeline.hasIn(["data","value_diff"])&&"description_diff"===timeline.getIn(["data","value_diff","key"])},key:"TIMELINE.ISSUE_UPDATED",translate_params:["username","field_name","obj_name"]},{check:function(timeline,event){return"issue"===event.obj&&"change"===event.type},key:"TIMELINE.ISSUE_UPDATED_WITH_NEW_VALUE",translate_params:["username","field_name","obj_name","new_value"]},{check:function(timeline,event){return"task"===event.obj&&"change"===event.type&&!timeline.getIn(["data","task","userstory"])&&timeline.hasIn(["data","value_diff"])&&"description_diff"===timeline.getIn(["data","value_diff","key"])},key:"TIMELINE.TASK_UPDATED",translate_params:["username","field_name","obj_name"]},{check:function(timeline,event){return"task"===event.obj&&"change"===event.type&&timeline.getIn(["data","task","userstory"])&&timeline.hasIn(["data","value_diff"])&&"description_diff"===timeline.getIn(["data","value_diff","key"])},key:"TIMELINE.TASK_UPDATED_WITH_US",translate_params:["username","field_name","obj_name","us_name"]},{check:function(timeline,event){return"task"===event.obj&&"change"===event.type&&!timeline.getIn(["data","task","userstory"])},key:"TIMELINE.TASK_UPDATED_WITH_NEW_VALUE",translate_params:["username","field_name","obj_name","new_value"]},{check:function(timeline,event){return"task"===event.obj&&"change"===event.type&&timeline.getIn(["data","task","userstory"])},key:"TIMELINE.TASK_UPDATED_WITH_US_NEW_VALUE",translate_params:["username","field_name","obj_name","us_name","new_value"]},{check:function(timeline,event){return"user"===event.obj&&"create"===event.type},key:"TIMELINE.NEW_USER",translate_params:["username"]}],_.find(types,function(obj){return obj.check(timeline,event)})},UserTimelineType=function(){function UserTimelineType(){}return UserTimelineType.prototype.getType=function(timeline,event){return timelineType(timeline,event)},UserTimelineType}(),angular.module("taigaUserTimeline").service("tgUserTimelineItemType",UserTimelineType)}.call(this),function(){var UserTimelineItemDirective;UserTimelineItemDirective=function(){return{templateUrl:"user-timeline/user-timeline-item/user-timeline-item.html",scope:{timeline:"=tgUserTimelineItem"}}},angular.module("taigaUserTimeline").directive("tgUserTimelineItem",UserTimelineItemDirective)}.call(this),function(){var UserTimelinePaginationSequence;UserTimelinePaginationSequence=function(){var obj;return obj={},obj.generate=function(config){var getContent,items,next,page;return page=1,items=Immutable.List(),config.minItems=config.minItems||20,next=function(){return items=Immutable.List(),getContent()},getContent=function(){return config.fetch(page).then(function(response){var data;return page++,data=response.get("data"),config.filter&&(data=config.filter(data)),config.map&&(data=data.map(config.map)),items=items.concat(data),items.size\n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: app.coffee\n */\n\n(function() {\n var configure, i18nInit, init, module, modules, pluginsWithModule, taiga;\n\n this.taiga = taiga = {};\n\n this.taigaContribPlugins = this.taigaContribPlugins || window.taigaContribPlugins || [];\n\n taiga.generateHash = function(components) {\n if (components == null) {\n components = [];\n }\n components = _.map(components, function(x) {\n return JSON.stringify(x);\n });\n return hex_sha1(components.join(\":\"));\n };\n\n taiga.generateUniqueSessionIdentifier = function() {\n var date, randomNumber;\n date = (new Date()).getTime();\n randomNumber = Math.floor(Math.random() * 0x9000000);\n return taiga.generateHash([date, randomNumber]);\n };\n\n taiga.sessionId = taiga.generateUniqueSessionIdentifier();\n\n configure = function($routeProvider, $locationProvider, $httpProvider, $provide, $tgEventsProvider, $compileProvider, $translateProvider, $translatePartialLoaderProvider, $animateProvider) {\n var authHttpIntercept, decorators, defaultHeaders, loaderIntercept, originalWhen, preferedLangCode, userInfo, versionCheckHttpIntercept;\n $animateProvider.classNameFilter(/^(?:(?!ng-animate-disabled).)*$/);\n originalWhen = $routeProvider.when;\n $routeProvider.when = function(path, route) {\n route.resolve || (route.resolve = {});\n angular.extend(route.resolve, {\n languageLoad: [\n \"$q\", \"$translate\", function($q, $translate) {\n var deferred;\n deferred = $q.defer();\n $translate().then(function() {\n return deferred.resolve();\n });\n return deferred.promise;\n }\n ]\n });\n return originalWhen.call($routeProvider, path, route);\n };\n $routeProvider.when(\"/\", {\n templateUrl: \"home/home.html\",\n controller: \"Home\",\n controllerAs: \"vm\",\n loader: true,\n title: \"HOME.PAGE_TITLE\",\n loader: true,\n description: \"HOME.PAGE_DESCRIPTION\",\n joyride: \"dashboard\"\n });\n $routeProvider.when(\"/discover\", {\n templateUrl: \"discover/discover-home/discover-home.html\",\n controller: \"DiscoverHome\",\n controllerAs: \"vm\",\n title: \"PROJECT.NAVIGATION.DISCOVER\",\n loader: true\n });\n $routeProvider.when(\"/discover/search\", {\n templateUrl: \"discover/discover-search/discover-search.html\",\n title: \"PROJECT.NAVIGATION.DISCOVER\",\n loader: true,\n controller: \"DiscoverSearch\",\n controllerAs: \"vm\",\n reloadOnSearch: false\n });\n $routeProvider.when(\"/projects/\", {\n templateUrl: \"projects/listing/projects-listing.html\",\n access: {\n requiresLogin: true\n },\n title: \"PROJECTS.PAGE_TITLE\",\n description: \"PROJECTS.PAGE_DESCRIPTION\",\n loader: true,\n controller: \"ProjectsListing\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/project/:pslug/\", {\n templateUrl: \"projects/project/project.html\",\n loader: true,\n controller: \"Project\",\n controllerAs: \"vm\",\n section: \"project-timeline\"\n });\n $routeProvider.when(\"/project/:pslug/search\", {\n templateUrl: \"search/search.html\",\n reloadOnSearch: false,\n section: \"search\",\n loader: true\n });\n $routeProvider.when(\"/project/:pslug/backlog\", {\n templateUrl: \"backlog/backlog.html\",\n loader: true,\n section: \"backlog\",\n joyride: \"backlog\"\n });\n $routeProvider.when(\"/project/:pslug/kanban\", {\n templateUrl: \"kanban/kanban.html\",\n loader: true,\n section: \"kanban\",\n joyride: \"kanban\"\n });\n $routeProvider.when(\"/project/:pslug/taskboard/:sslug\", {\n templateUrl: \"taskboard/taskboard.html\",\n loader: true,\n section: \"backlog\"\n });\n $routeProvider.when(\"/project/:pslug/us/:usref\", {\n templateUrl: \"us/us-detail.html\",\n loader: true,\n section: \"backlog-kanban\"\n });\n $routeProvider.when(\"/project/:pslug/task/:taskref\", {\n templateUrl: \"task/task-detail.html\",\n loader: true,\n section: \"backlog-kanban\"\n });\n $routeProvider.when(\"/project/:pslug/wiki\", {\n redirectTo: function(params) {\n return \"/project/\" + params.pslug + \"/wiki/home\";\n }\n });\n $routeProvider.when(\"/project/:pslug/wiki/:slug\", {\n templateUrl: \"wiki/wiki.html\",\n loader: true,\n section: \"wiki\"\n });\n $routeProvider.when(\"/project/:pslug/team\", {\n templateUrl: \"team/team.html\",\n loader: true,\n section: \"team\"\n });\n $routeProvider.when(\"/project/:pslug/issues\", {\n templateUrl: \"issue/issues.html\",\n loader: true,\n section: \"issues\"\n });\n $routeProvider.when(\"/project/:pslug/issue/:issueref\", {\n templateUrl: \"issue/issues-detail.html\",\n loader: true,\n section: \"issues\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/details\", {\n templateUrl: \"admin/admin-project-profile.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/default-values\", {\n templateUrl: \"admin/admin-project-default-values.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/modules\", {\n templateUrl: \"admin/admin-project-modules.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/export\", {\n templateUrl: \"admin/admin-project-export.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-profile/reports\", {\n templateUrl: \"admin/admin-project-reports.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/status\", {\n templateUrl: \"admin/admin-project-values-status.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/points\", {\n templateUrl: \"admin/admin-project-values-points.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/priorities\", {\n templateUrl: \"admin/admin-project-values-priorities.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/severities\", {\n templateUrl: \"admin/admin-project-values-severities.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/types\", {\n templateUrl: \"admin/admin-project-values-types.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/project-values/custom-fields\", {\n templateUrl: \"admin/admin-project-values-custom-fields.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/memberships\", {\n templateUrl: \"admin/admin-memberships.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/roles\", {\n templateUrl: \"admin/admin-roles.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/third-parties/webhooks\", {\n templateUrl: \"admin/admin-third-parties-webhooks.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/third-parties/github\", {\n templateUrl: \"admin/admin-third-parties-github.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/third-parties/gitlab\", {\n templateUrl: \"admin/admin-third-parties-gitlab.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/third-parties/bitbucket\", {\n templateUrl: \"admin/admin-third-parties-bitbucket.html\",\n section: \"admin\"\n });\n $routeProvider.when(\"/project/:pslug/admin/contrib/:plugin\", {\n templateUrl: \"contrib/main.html\"\n });\n $routeProvider.when(\"/user-settings/user-profile\", {\n templateUrl: \"user/user-profile.html\"\n });\n $routeProvider.when(\"/user-settings/user-change-password\", {\n templateUrl: \"user/user-change-password.html\"\n });\n $routeProvider.when(\"/user-settings/mail-notifications\", {\n templateUrl: \"user/mail-notifications.html\"\n });\n $routeProvider.when(\"/change-email/:email_token\", {\n templateUrl: \"user/change-email.html\"\n });\n $routeProvider.when(\"/cancel-account/:cancel_token\", {\n templateUrl: \"user/cancel-account.html\"\n });\n $routeProvider.when(\"/profile\", {\n templateUrl: \"profile/profile.html\",\n loader: true,\n access: {\n requiresLogin: true\n },\n controller: \"Profile\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/profile/:slug\", {\n templateUrl: \"profile/profile.html\",\n loader: true,\n controller: \"Profile\",\n controllerAs: \"vm\"\n });\n $routeProvider.when(\"/login\", {\n templateUrl: \"auth/login.html\",\n title: \"LOGIN.PAGE_TITLE\",\n description: \"LOGIN.PAGE_DESCRIPTION\",\n disableHeader: true\n });\n $routeProvider.when(\"/register\", {\n templateUrl: \"auth/register.html\",\n title: \"REGISTER.PAGE_TITLE\",\n description: \"REGISTER.PAGE_DESCRIPTION\",\n disableHeader: true\n });\n $routeProvider.when(\"/forgot-password\", {\n templateUrl: \"auth/forgot-password.html\",\n title: \"FORGOT_PASSWORD.PAGE_TITLE\",\n description: \"FORGOT_PASSWORD.PAGE_DESCRIPTION\",\n disableHeader: true\n });\n $routeProvider.when(\"/change-password/:token\", {\n templateUrl: \"auth/change-password-from-recovery.html\",\n title: \"CHANGE_PASSWORD.PAGE_TITLE\",\n description: \"CHANGE_PASSWORD.PAGE_TITLE\",\n disableHeader: true\n });\n $routeProvider.when(\"/invitation/:token\", {\n templateUrl: \"auth/invitation.html\",\n title: \"INVITATION.PAGE_TITLE\",\n description: \"INVITATION.PAGE_DESCRIPTION\",\n disableHeader: true\n });\n $routeProvider.when(\"/external-apps\", {\n templateUrl: \"external-apps/external-app.html\",\n title: \"EXTERNAL_APP.PAGE_TITLE\",\n description: \"EXTERNAL_APP.PAGE_DESCRIPTION\",\n controller: \"ExternalApp\",\n controllerAs: \"vm\",\n disableHeader: true,\n mobileViewport: true\n });\n $routeProvider.when(\"/error\", {\n templateUrl: \"error/error.html\"\n });\n $routeProvider.when(\"/not-found\", {\n templateUrl: \"error/not-found.html\"\n });\n $routeProvider.when(\"/permission-denied\", {\n templateUrl: \"error/permission-denied.html\"\n });\n $routeProvider.otherwise({\n redirectTo: \"/not-found\"\n });\n $locationProvider.html5Mode({\n enabled: true,\n requireBase: false\n });\n defaultHeaders = {\n \"Content-Type\": \"application/json\",\n \"Accept-Language\": window.taigaConfig.defaultLanguage || \"en\",\n \"X-Session-Id\": taiga.sessionId\n };\n $httpProvider.defaults.headers[\"delete\"] = defaultHeaders;\n $httpProvider.defaults.headers.patch = defaultHeaders;\n $httpProvider.defaults.headers.post = defaultHeaders;\n $httpProvider.defaults.headers.put = defaultHeaders;\n $httpProvider.defaults.headers.get = {\n \"X-Session-Id\": taiga.sessionId\n };\n $httpProvider.useApplyAsync(true);\n $tgEventsProvider.setSessionId(taiga.sessionId);\n authHttpIntercept = function($q, $location, $navUrls, $lightboxService) {\n var httpResponseError;\n httpResponseError = function(response) {\n var nextUrl;\n if (response.status === 0 || (response.status === -1 && !response.config.cancelable)) {\n $lightboxService.closeAll();\n $location.path($navUrls.resolve(\"error\"));\n $location.replace();\n } else if (response.status === 401 && $location.url().indexOf('/login') === -1) {\n nextUrl = encodeURIComponent($location.url());\n $location.url($navUrls.resolve(\"login\")).search(\"next=\" + nextUrl);\n }\n return $q.reject(response);\n };\n return {\n responseError: httpResponseError\n };\n };\n $provide.factory(\"authHttpIntercept\", [\"$q\", \"$location\", \"$tgNavUrls\", \"lightboxService\", authHttpIntercept]);\n $httpProvider.interceptors.push(\"authHttpIntercept\");\n loaderIntercept = function($q, loaderService) {\n return {\n request: function(config) {\n loaderService.logRequest();\n return config;\n },\n requestError: function(rejection) {\n loaderService.logResponse();\n return $q.reject(rejection);\n },\n responseError: function(rejection) {\n loaderService.logResponse();\n return $q.reject(rejection);\n },\n response: function(response) {\n loaderService.logResponse();\n return response;\n }\n };\n };\n $provide.factory(\"loaderIntercept\", [\"$q\", \"tgLoader\", loaderIntercept]);\n $httpProvider.interceptors.push(\"loaderIntercept\");\n versionCheckHttpIntercept = function($q) {\n var httpResponseError;\n httpResponseError = function(response) {\n var $injector;\n if (response.status === 400 && response.data.version) {\n $injector = angular.element(\"body\").injector();\n $injector.invoke([\n \"$tgConfirm\", \"$translate\", (function(_this) {\n return function($confirm, $translate) {\n var versionErrorMsg;\n versionErrorMsg = $translate.instant(\"ERROR.VERSION_ERROR\");\n return $confirm.notify(\"error\", versionErrorMsg, null, 10000);\n };\n })(this)\n ]);\n }\n return $q.reject(response);\n };\n return {\n responseError: httpResponseError\n };\n };\n $provide.factory(\"versionCheckHttpIntercept\", [\"$q\", versionCheckHttpIntercept]);\n $httpProvider.interceptors.push(\"versionCheckHttpIntercept\");\n window.checksley.updateValidators({\n linewidth: function(val, width) {\n var lines, valid;\n lines = taiga.nl2br(val).split(\"
\");\n valid = _.every(lines, function(line) {\n return line.length < width;\n });\n return valid;\n }\n });\n $compileProvider.debugInfoEnabled(window.taigaConfig.debugInfo || false);\n if (localStorage.userInfo) {\n userInfo = JSON.parse(localStorage.userInfo);\n }\n preferedLangCode = (userInfo != null ? userInfo.lang : void 0) || window.taigaConfig.defaultLanguage || \"en\";\n $translatePartialLoaderProvider.addPart('taiga');\n $translateProvider.useLoader('$translatePartialLoader', {\n urlTemplate: '/' + window._version + '/locales/{part}/locale-{lang}.json'\n }).useSanitizeValueStrategy('escapeParameters').addInterpolation('$translateMessageFormatInterpolation').preferredLanguage(preferedLangCode);\n $translateProvider.fallbackLanguage(preferedLangCode);\n decorators = window.getDecorators();\n return _.each(decorators, function(decorator) {\n return $provide.decorator(decorator.provider, decorator.decorator);\n });\n };\n\n i18nInit = function(lang, $translate) {\n var messages;\n moment.locale(lang);\n messages = {\n defaultMessage: $translate.instant(\"COMMON.FORM_ERRORS.DEFAULT_MESSAGE\"),\n type: {\n email: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_EMAIL\"),\n url: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_URL\"),\n urlstrict: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_URLSTRICT\"),\n number: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_NUMBER\"),\n digits: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_DIGITS\"),\n dateIso: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_DATEISO\"),\n alphanum: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_ALPHANUM\"),\n phone: $translate.instant(\"COMMON.FORM_ERRORS.TYPE_PHONE\")\n },\n notnull: $translate.instant(\"COMMON.FORM_ERRORS.NOTNULL\"),\n notblank: $translate.instant(\"COMMON.FORM_ERRORS.NOT_BLANK\"),\n required: $translate.instant(\"COMMON.FORM_ERRORS.REQUIRED\"),\n regexp: $translate.instant(\"COMMON.FORM_ERRORS.REGEXP\"),\n min: $translate.instant(\"COMMON.FORM_ERRORS.MIN\"),\n max: $translate.instant(\"COMMON.FORM_ERRORS.MAX\"),\n range: $translate.instant(\"COMMON.FORM_ERRORS.RANGE\"),\n minlength: $translate.instant(\"COMMON.FORM_ERRORS.MIN_LENGTH\"),\n maxlength: $translate.instant(\"COMMON.FORM_ERRORS.MAX_LENGTH\"),\n rangelength: $translate.instant(\"COMMON.FORM_ERRORS.RANGE_LENGTH\"),\n mincheck: $translate.instant(\"COMMON.FORM_ERRORS.MIN_CHECK\"),\n maxcheck: $translate.instant(\"COMMON.FORM_ERRORS.MAX_CHECK\"),\n rangecheck: $translate.instant(\"COMMON.FORM_ERRORS.RANGE_CHECK\"),\n equalto: $translate.instant(\"COMMON.FORM_ERRORS.EQUAL_TO\")\n };\n return checksley.updateMessages('default', messages);\n };\n\n init = function($log, $rootscope, $auth, $events, $analytics, $translate, $location, $navUrls, appMetaService, projectService, loaderService, navigationBarService) {\n var un, user;\n $log.debug(\"Initialize application\");\n $rootscope.contribPlugins = this.taigaContribPlugins;\n $rootscope.adminPlugins = _.where(this.taigaContribPlugins, {\n \"type\": \"admin\"\n });\n $rootscope.$on(\"$translateChangeEnd\", function(e, ctx) {\n var lang;\n lang = ctx.language;\n return i18nInit(lang, $translate);\n });\n Promise.setScheduler(function(cb) {\n return $rootscope.$evalAsync(cb);\n });\n $events.setupConnection();\n if ($auth.isAuthenticated()) {\n user = $auth.getUser();\n }\n $analytics.initialize();\n un = $rootscope.$on('$routeChangeStart', function(event, next) {\n if (next.loader) {\n loaderService.start(true);\n }\n return un();\n });\n return $rootscope.$on('$routeChangeSuccess', function(event, next) {\n var description, title;\n if (next.loader) {\n loaderService.start(true);\n }\n if (next.access && next.access.requiresLogin) {\n if (!$auth.isAuthenticated()) {\n $location.path($navUrls.resolve(\"login\"));\n }\n }\n projectService.setSection(next.section);\n if (next.params.pslug) {\n projectService.setProjectBySlug(next.params.pslug);\n } else {\n projectService.cleanProject();\n }\n if (next.title || next.description) {\n title = $translate.instant(next.title || \"\");\n description = $translate.instant(next.description || \"\");\n appMetaService.setAll(title, description);\n }\n if (next.mobileViewport) {\n appMetaService.addMobileViewport();\n } else {\n appMetaService.removeMobileViewport();\n }\n if (next.disableHeader) {\n return navigationBarService.disableHeader();\n } else {\n return navigationBarService.enableHeader();\n }\n });\n };\n\n pluginsWithModule = _.filter(this.taigaContribPlugins, function(plugin) {\n return plugin.module;\n });\n\n angular.module('infinite-scroll').value('THROTTLE_MILLISECONDS', 500);\n\n modules = [\"taigaBase\", \"taigaCommon\", \"taigaResources\", \"taigaResources2\", \"taigaAuth\", \"taigaEvents\", \"taigaHome\", \"taigaNavigationBar\", \"taigaProjects\", \"taigaRelatedTasks\", \"taigaBacklog\", \"taigaTaskboard\", \"taigaKanban\", \"taigaIssues\", \"taigaUserStories\", \"taigaTasks\", \"taigaTeam\", \"taigaWiki\", \"taigaSearch\", \"taigaAdmin\", \"taigaProject\", \"taigaUserSettings\", \"taigaFeedback\", \"taigaPlugins\", \"taigaIntegrations\", \"taigaComponents\", \"taigaProfile\", \"taigaHome\", \"taigaUserTimeline\", \"taigaExternalApps\", \"taigaDiscover\", \"templates\", \"ngSanitize\", \"ngRoute\", \"ngAnimate\", \"ngAria\", \"pascalprecht.translate\", \"infinite-scroll\", \"tgRepeat\"].concat(_.map(pluginsWithModule, function(plugin) {\n return plugin.module;\n }));\n\n module = angular.module(\"taiga\", modules);\n\n module.config([\"$routeProvider\", \"$locationProvider\", \"$httpProvider\", \"$provide\", \"$tgEventsProvider\", \"$compileProvider\", \"$translateProvider\", \"$translatePartialLoaderProvider\", \"$animateProvider\", configure]);\n\n module.run([\"$log\", \"$rootScope\", \"$tgAuth\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"tgProjectService\", \"tgLoader\", \"tgNavigationBarService\", \"$route\", init]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: classes.coffee\n */\n\n(function() {\n var TaigaBase, TaigaController, TaigaService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n TaigaBase = (function() {\n function TaigaBase() {}\n\n return TaigaBase;\n\n })();\n\n TaigaService = (function(superClass) {\n extend(TaigaService, superClass);\n\n function TaigaService() {\n return TaigaService.__super__.constructor.apply(this, arguments);\n }\n\n return TaigaService;\n\n })(TaigaBase);\n\n TaigaController = (function(superClass) {\n extend(TaigaController, superClass);\n\n function TaigaController() {\n this.onInitialDataError = bind(this.onInitialDataError, this);\n return TaigaController.__super__.constructor.apply(this, arguments);\n }\n\n TaigaController.prototype.onInitialDataError = function(xhr) {\n if (xhr) {\n if (xhr.status === 404) {\n this.location.path(this.navUrls.resolve(\"not-found\"));\n this.location.replace();\n } else if (xhr.status === 403) {\n this.location.path(this.navUrls.resolve(\"permission-denied\"));\n this.location.replace();\n }\n }\n return this.q.reject(xhr);\n };\n\n return TaigaController;\n\n })(TaigaBase);\n\n this.taiga.Base = TaigaBase;\n\n this.taiga.Service = TaigaService;\n\n this.taiga.Controller = TaigaController;\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: utils.coffee\n */\n\n(function() {\n var bindMethods, bindOnce, cancelTimeout, debounce, debounceLeading, defineImmutableProperty, groupBy, isImage, joinStr, mixOf, nl2br, patch, replaceTags, scopeDefer, sizeFormat, slugify, startswith, stripTags, taiga, timeout, toString, toggleText, trim, truncate, unslugify,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },\n slice = [].slice,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n nl2br = (function(_this) {\n return function(str) {\n var breakTag;\n breakTag = '
';\n return (str + '').replace(/([^>\\r\\n]?)(\\r\\n|\\n\\r|\\r|\\n)/g, '$1' + breakTag + '$2');\n };\n })(this);\n\n bindMethods = (function(_this) {\n return function(object) {\n var dependencies, methods;\n dependencies = _.keys(object);\n methods = [];\n _.forIn(object, function(value, key) {\n if (indexOf.call(dependencies, key) < 0) {\n return methods.push(key);\n }\n });\n return _.bindAll(object, methods);\n };\n })(this);\n\n bindOnce = (function(_this) {\n return function(scope, attr, continuation) {\n var delBind, val;\n val = scope.$eval(attr);\n if (val !== void 0) {\n return continuation(val);\n }\n delBind = null;\n return delBind = scope.$watch(attr, function(val) {\n if (val === void 0) {\n return;\n }\n continuation(val);\n if (delBind) {\n return delBind();\n }\n });\n };\n })(this);\n\n mixOf = function() {\n var Mixed, base, i, method, mixin, mixins, name, ref;\n base = arguments[0], mixins = 2 <= arguments.length ? slice.call(arguments, 1) : [];\n Mixed = (function(superClass) {\n extend(Mixed, superClass);\n\n function Mixed() {\n return Mixed.__super__.constructor.apply(this, arguments);\n }\n\n return Mixed;\n\n })(base);\n for (i = mixins.length - 1; i >= 0; i += -1) {\n mixin = mixins[i];\n ref = mixin.prototype;\n for (name in ref) {\n method = ref[name];\n Mixed.prototype[name] = method;\n }\n }\n return Mixed;\n };\n\n trim = function(data, char) {\n return _.str.trim(data, char);\n };\n\n slugify = function(data) {\n return _.str.slugify(data);\n };\n\n unslugify = function(data) {\n if (data) {\n return _.str.capitalize(data.replace(/-/g, ' '));\n }\n return data;\n };\n\n toggleText = function(element, texts) {\n var nextTextPosition, text;\n nextTextPosition = element.data('nextTextPosition');\n if ((nextTextPosition == null) || nextTextPosition >= texts.length) {\n nextTextPosition = 0;\n }\n text = texts[nextTextPosition];\n element.data('nextTextPosition', nextTextPosition + 1);\n return element.text(text);\n };\n\n groupBy = function(coll, pred) {\n var i, item, len, result;\n result = {};\n for (i = 0, len = coll.length; i < len; i++) {\n item = coll[i];\n result[pred(item)] = item;\n }\n return result;\n };\n\n timeout = function(wait, continuation) {\n return window.setTimeout(continuation, wait);\n };\n\n cancelTimeout = function(timeoutVar) {\n return window.clearTimeout(timeoutVar);\n };\n\n scopeDefer = function(scope, func) {\n return _.defer((function(_this) {\n return function() {\n return scope.$apply(func);\n };\n })(this));\n };\n\n toString = function(value) {\n if (_.isNumber(value)) {\n return value + \"\";\n } else if (_.isString(value)) {\n return value;\n } else if (_.isPlainObject(value)) {\n return JSON.stringify(value);\n } else if (_.isUndefined(value)) {\n return \"\";\n }\n return value.toString();\n };\n\n joinStr = function(str, coll) {\n return _.str.join(str, coll);\n };\n\n debounce = function(wait, func) {\n return _.debounce(func, wait, {\n leading: true,\n trailing: false\n });\n };\n\n debounceLeading = function(wait, func) {\n return _.debounce(func, wait, {\n leading: false,\n trailing: true\n });\n };\n\n startswith = function(str1, str2) {\n return _.str.startsWith(str1, str2);\n };\n\n truncate = function(str, maxLength, suffix) {\n var out;\n if (suffix == null) {\n suffix = \"...\";\n }\n if ((typeof str !== \"string\") && !(str instanceof String)) {\n return str;\n }\n out = str.slice(0);\n if (out.length > maxLength) {\n out = out.substring(0, maxLength + 1);\n out = out.substring(0, Math.min(out.length, out.lastIndexOf(\" \")));\n out = out + suffix;\n }\n return out;\n };\n\n sizeFormat = function(input, precision) {\n var number, size, units;\n if (precision == null) {\n precision = 1;\n }\n if (isNaN(parseFloat(input)) || !isFinite(input)) {\n return \"-\";\n }\n if (input === 0) {\n return \"0 bytes\";\n }\n units = [\"bytes\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"];\n number = Math.floor(Math.log(input) / Math.log(1024));\n if (number > 5) {\n number = 5;\n }\n size = (input / Math.pow(1024, number)).toFixed(precision);\n return size + \" \" + units[number];\n };\n\n stripTags = function(str, exception) {\n var pattern;\n if (exception) {\n pattern = new RegExp('<(?!' + exception + '\\s*\\/?)[^>]+>', 'gi');\n return String(str).replace(pattern, '');\n } else {\n return String(str).replace(/<\\/?[^>]+>/g, '');\n }\n };\n\n replaceTags = function(str, tags, replace) {\n var pattern;\n pattern = new RegExp('<(' + tags + ')>', 'gi');\n str = str.replace(pattern, '<' + replace + '>');\n pattern = new RegExp('<\\/(' + tags + ')>', 'gi');\n str = str.replace(pattern, '');\n return str;\n };\n\n defineImmutableProperty = (function(_this) {\n return function(obj, name, fn) {\n return Object.defineProperty(obj, name, {\n get: function() {\n var fn_result;\n if (!_.isFunction(fn)) {\n throw \"defineImmutableProperty third param must be a function\";\n }\n fn_result = fn();\n if (fn_result && _.isObject(fn_result)) {\n if (fn_result.size === void 0) {\n throw \"defineImmutableProperty must return immutable data\";\n }\n }\n return fn_result;\n }\n });\n };\n })(this);\n\n _.mixin({\n removeKeys: function(obj, keys) {\n return _.chain([keys]).flatten().reduce(function(obj, key) {\n delete obj[key];\n return obj;\n }, obj).value();\n },\n cartesianProduct: function() {\n return _.reduceRight(arguments, function(a, b) {\n return _.flatten(_.map(a, function(x) {\n return _.map(b, function(y) {\n return [y].concat(x);\n });\n }), true);\n }, [[]]);\n }\n });\n\n isImage = function(name) {\n return name.match(/\\.(jpe?g|png|gif|gifv|webm)/i) !== null;\n };\n\n patch = function(oldImmutable, newImmutable) {\n var pathObj;\n pathObj = {};\n newImmutable.forEach(function(newValue, key) {\n if (newValue !== oldImmutable.get(key)) {\n if (newValue.toJS) {\n return pathObj[key] = newValue.toJS();\n } else {\n return pathObj[key] = newValue;\n }\n }\n });\n return pathObj;\n };\n\n taiga = this.taiga;\n\n taiga.nl2br = nl2br;\n\n taiga.bindMethods = bindMethods;\n\n taiga.bindOnce = bindOnce;\n\n taiga.mixOf = mixOf;\n\n taiga.trim = trim;\n\n taiga.slugify = slugify;\n\n taiga.unslugify = unslugify;\n\n taiga.toggleText = toggleText;\n\n taiga.groupBy = groupBy;\n\n taiga.timeout = timeout;\n\n taiga.cancelTimeout = cancelTimeout;\n\n taiga.scopeDefer = scopeDefer;\n\n taiga.toString = toString;\n\n taiga.joinStr = joinStr;\n\n taiga.truncate = truncate;\n\n taiga.debounce = debounce;\n\n taiga.debounceLeading = debounceLeading;\n\n taiga.startswith = startswith;\n\n taiga.sizeFormat = sizeFormat;\n\n taiga.stripTags = stripTags;\n\n taiga.replaceTags = replaceTags;\n\n taiga.defineImmutableProperty = defineImmutableProperty;\n\n taiga.isImage = isImage;\n\n taiga.patch = patch;\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/controllerMixins.coffee\n */\n\n(function() {\n var FiltersMixin, PageMixin, groupBy, joinStr, taiga, toString, trim;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n joinStr = this.taiga.joinStr;\n\n trim = this.taiga.trim;\n\n toString = this.taiga.toString;\n\n PageMixin = (function() {\n function PageMixin() {}\n\n PageMixin.prototype.fillUsersAndRoles = function(users, roles) {\n var activeUsers, computableRoles;\n activeUsers = _.filter(users, (function(_this) {\n return function(user) {\n return user.is_active;\n };\n })(this));\n this.scope.activeUsers = _.sortBy(activeUsers, \"full_name_display\");\n this.scope.activeUsersById = groupBy(this.scope.activeUsers, function(e) {\n return e.id;\n });\n this.scope.users = _.sortBy(users, \"full_name_display\");\n this.scope.usersById = groupBy(this.scope.users, function(e) {\n return e.id;\n });\n this.scope.roles = _.sortBy(roles, \"order\");\n computableRoles = _(this.scope.project.members).map(\"role\").uniq().value();\n return this.scope.computableRoles = _(roles).filter(\"computable\").filter(function(x) {\n return _.contains(computableRoles, x.id);\n }).value();\n };\n\n PageMixin.prototype.loadUsersAndRoles = function() {\n var promise;\n promise = this.q.all([this.rs.projects.usersList(this.scope.projectId), this.rs.projects.rolesList(this.scope.projectId)]);\n return promise.then((function(_this) {\n return function(results) {\n var roles, users;\n users = results[0], roles = results[1];\n _this.fillUsersAndRoles(users, roles);\n return results;\n };\n })(this));\n };\n\n return PageMixin;\n\n })();\n\n taiga.PageMixin = PageMixin;\n\n FiltersMixin = (function() {\n function FiltersMixin() {}\n\n FiltersMixin.prototype.selectFilter = function(name, value, load) {\n var existing, location, params;\n if (load == null) {\n load = false;\n }\n params = this.location.search();\n if (params[name] !== void 0 && name !== \"page\") {\n existing = _.map(taiga.toString(params[name]).split(\",\"), function(x) {\n return trim(x);\n });\n existing.push(taiga.toString(value));\n existing = _.compact(existing);\n value = joinStr(\",\", _.uniq(existing));\n }\n if (!this.location.isInCurrentRouteParams(name, value)) {\n location = load ? this.location : this.location.noreload(this.scope);\n return location.search(name, value);\n }\n };\n\n FiltersMixin.prototype.replaceFilter = function(name, value, load) {\n var location;\n if (load == null) {\n load = false;\n }\n if (!this.location.isInCurrentRouteParams(name, value)) {\n location = load ? this.location : this.location.noreload(this.scope);\n return location.search(name, value);\n }\n };\n\n FiltersMixin.prototype.replaceAllFilters = function(filters, load) {\n var location;\n if (load == null) {\n load = false;\n }\n location = load ? this.location : this.location.noreload(this.scope);\n return location.search(filters);\n };\n\n FiltersMixin.prototype.unselectFilter = function(name, value, load) {\n var location, newValues, params, parsedValues;\n if (load == null) {\n load = false;\n }\n params = this.location.search();\n if (params[name] === void 0) {\n return;\n }\n if (value === void 0 || value === null) {\n delete params[name];\n }\n parsedValues = _.map(taiga.toString(params[name]).split(\",\"), function(x) {\n return trim(x);\n });\n newValues = _.reject(parsedValues, function(x) {\n return x === taiga.toString(value);\n });\n newValues = _.compact(newValues);\n if (_.isEmpty(newValues)) {\n value = null;\n } else {\n value = joinStr(\",\", _.uniq(newValues));\n }\n location = load ? this.location : this.location.noreload(this.scope);\n return location.search(name, value);\n };\n\n return FiltersMixin;\n\n })();\n\n taiga.FiltersMixin = FiltersMixin;\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaAdmin\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/auth.coffee\n */\n\n(function() {\n var AuthService, CancelAccountDirective, ChangeEmailDirective, ChangePasswordFromRecoveryDirective, ForgotPasswordDirective, InvitationDirective, LoginDirective, PublicRegisterMessageDirective, RegisterDirective, debounce, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaAuth\", [\"taigaResources\"]);\n\n AuthService = (function(superClass) {\n extend(AuthService, superClass);\n\n AuthService.$inject = [\"$rootScope\", \"$tgStorage\", \"$tgModel\", \"$tgResources\", \"$tgHttp\", \"$tgUrls\", \"$tgConfig\", \"$translate\", \"tgCurrentUserService\", \"tgThemeService\"];\n\n function AuthService(rootscope, storage, model, rs, http, urls, config, translate, currentUserService, themeService) {\n var userModel;\n this.rootscope = rootscope;\n this.storage = storage;\n this.model = model;\n this.rs = rs;\n this.http = http;\n this.urls = urls;\n this.config = config;\n this.translate = translate;\n this.currentUserService = currentUserService;\n this.themeService = themeService;\n AuthService.__super__.constructor.call(this);\n userModel = this.getUser();\n this._currentTheme = this._getUserTheme();\n this.setUserdata(userModel);\n }\n\n AuthService.prototype.setUserdata = function(userModel) {\n if (userModel) {\n this.userData = Immutable.fromJS(userModel.getAttrs());\n return this.currentUserService.setUser(this.userData);\n } else {\n return this.userData = null;\n }\n };\n\n AuthService.prototype._getUserTheme = function() {\n var ref;\n return ((ref = this.rootscope.user) != null ? ref.theme : void 0) || this.config.get(\"defaultTheme\") || \"taiga\";\n };\n\n AuthService.prototype._setTheme = function() {\n var newTheme;\n newTheme = this._getUserTheme();\n if (this._currentTheme !== newTheme) {\n this._currentTheme = newTheme;\n return this.themeService.use(this._currentTheme);\n }\n };\n\n AuthService.prototype._setLocales = function() {\n var lang, ref;\n lang = ((ref = this.rootscope.user) != null ? ref.lang : void 0) || this.config.get(\"defaultLanguage\") || \"en\";\n this.translate.preferredLanguage(lang);\n return this.translate.use(lang);\n };\n\n AuthService.prototype.getUser = function() {\n var user, userData;\n if (this.rootscope.user) {\n return this.rootscope.user;\n }\n userData = this.storage.get(\"userInfo\");\n if (userData) {\n user = this.model.make_model(\"users\", userData);\n this.rootscope.user = user;\n this._setLocales();\n this._setTheme();\n return user;\n } else {\n this._setTheme();\n }\n return null;\n };\n\n AuthService.prototype.setUser = function(user) {\n this.rootscope.auth = user;\n this.storage.set(\"userInfo\", user.getAttrs());\n this.rootscope.user = user;\n this.setUserdata(user);\n this._setLocales();\n return this._setTheme();\n };\n\n AuthService.prototype.clear = function() {\n this.rootscope.auth = null;\n this.rootscope.user = null;\n return this.storage.remove(\"userInfo\");\n };\n\n AuthService.prototype.setToken = function(token) {\n return this.storage.set(\"token\", token);\n };\n\n AuthService.prototype.getToken = function() {\n return this.storage.get(\"token\");\n };\n\n AuthService.prototype.removeToken = function() {\n return this.storage.remove(\"token\");\n };\n\n AuthService.prototype.isAuthenticated = function() {\n if (this.getUser() !== null) {\n return true;\n }\n return false;\n };\n\n AuthService.prototype.login = function(data, type) {\n var url;\n url = this.urls.resolve(\"auth\");\n data = _.clone(data, false);\n data.type = type ? type : \"normal\";\n this.removeToken();\n return this.http.post(url, data).then((function(_this) {\n return function(data, status) {\n var user;\n user = _this.model.make_model(\"users\", data.data);\n _this.setToken(user.auth_token);\n _this.setUser(user);\n return user;\n };\n })(this));\n };\n\n AuthService.prototype.logout = function() {\n this.removeToken();\n this.clear();\n this.currentUserService.removeUser();\n this._setTheme();\n return this._setLocales();\n };\n\n AuthService.prototype.register = function(data, type, existing) {\n var url;\n url = this.urls.resolve(\"auth-register\");\n data = _.clone(data, false);\n data.type = type ? type : \"public\";\n if (type === \"private\") {\n data.existing = existing ? existing : false;\n }\n this.removeToken();\n return this.http.post(url, data).then((function(_this) {\n return function(response) {\n var user;\n user = _this.model.make_model(\"users\", response.data);\n _this.setToken(user.auth_token);\n _this.setUser(user);\n return user;\n };\n })(this));\n };\n\n AuthService.prototype.getInvitation = function(token) {\n return this.rs.invitations.get(token);\n };\n\n AuthService.prototype.acceptInvitiationWithNewUser = function(data) {\n return this.register(data, \"private\", false);\n };\n\n AuthService.prototype.acceptInvitiationWithExistingUser = function(data) {\n return this.register(data, \"private\", true);\n };\n\n AuthService.prototype.forgotPassword = function(data) {\n var url;\n url = this.urls.resolve(\"users-password-recovery\");\n data = _.clone(data, false);\n this.removeToken();\n return this.http.post(url, data);\n };\n\n AuthService.prototype.changePasswordFromRecovery = function(data) {\n var url;\n url = this.urls.resolve(\"users-change-password-from-recovery\");\n data = _.clone(data, false);\n this.removeToken();\n return this.http.post(url, data);\n };\n\n AuthService.prototype.changeEmail = function(data) {\n var url;\n url = this.urls.resolve(\"users-change-email\");\n data = _.clone(data, false);\n return this.http.post(url, data);\n };\n\n AuthService.prototype.cancelAccount = function(data) {\n var url;\n url = this.urls.resolve(\"users-cancel-account\");\n data = _.clone(data, false);\n return this.http.post(url, data);\n };\n\n return AuthService;\n\n })(taiga.Service);\n\n module.service(\"$tgAuth\", AuthService);\n\n PublicRegisterMessageDirective = function($config, $navUrls, $routeParams, templates) {\n var template, templateFn;\n template = templates.get(\"auth/login-text.html\", true);\n templateFn = function() {\n var nextUrl, publicRegisterEnabled, url;\n publicRegisterEnabled = $config.get(\"publicRegisterEnabled\");\n if (!publicRegisterEnabled) {\n return \"\";\n }\n url = $navUrls.resolve(\"register\");\n if ($routeParams['next'] && $routeParams['next'] !== $navUrls.resolve(\"register\")) {\n nextUrl = encodeURIComponent($routeParams['next']);\n console.log(\"-----\", nextUrl);\n url += \"?next=\" + nextUrl;\n }\n return template({\n url: url\n });\n };\n return {\n restrict: \"AE\",\n scope: {},\n template: templateFn\n };\n };\n\n module.directive(\"tgPublicRegisterMessage\", [\"$tgConfig\", \"$tgNavUrls\", \"$routeParams\", \"$tgTemplate\", PublicRegisterMessageDirective]);\n\n LoginDirective = function($auth, $confirm, $location, $config, $routeParams, $navUrls, $events, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onError, onSuccess, submit;\n form = new checksley.Form($el.find(\"form.login-form\"));\n if ($routeParams['next'] && $routeParams['next'] !== $navUrls.resolve(\"login\")) {\n $scope.nextUrl = decodeURIComponent($routeParams['next']);\n } else {\n $scope.nextUrl = $navUrls.resolve(\"home\");\n }\n onSuccess = function(response) {\n $events.setupConnection();\n return $location.url($scope.nextUrl);\n };\n onError = function(response) {\n return $confirm.notify(\"light-error\", $translate.instant(\"LOGIN_FORM.ERROR_AUTH_INCORRECT\"));\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var data, loginFormType, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n data = {\n \"username\": $el.find(\"form.login-form input[name=username]\").val(),\n \"password\": $el.find(\"form.login-form input[name=password]\").val()\n };\n loginFormType = $config.get(\"loginFormType\", \"normal\");\n promise = $auth.login(data, loginFormType);\n return promise.then(onSuccess, onError);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n window.prerenderReady = true;\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLogin\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgConfig\", \"$routeParams\", \"$tgNavUrls\", \"$tgEvents\", \"$translate\", LoginDirective]);\n\n RegisterDirective = function($auth, $confirm, $location, $navUrls, $config, $routeParams, $analytics, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit;\n if (!$config.get(\"publicRegisterEnabled\")) {\n $location.path($navUrls.resolve(\"not-found\"));\n $location.replace();\n }\n $scope.data = {};\n form = $el.find(\"form\").checksley({\n onlyOneErrorElement: true\n });\n if ($routeParams['next'] && $routeParams['next'] !== $navUrls.resolve(\"register\")) {\n $scope.nextUrl = decodeURIComponent($routeParams['next']);\n } else {\n $scope.nextUrl = $navUrls.resolve(\"home\");\n }\n onSuccessSubmit = function(response) {\n $analytics.trackEvent(\"auth\", \"register\", \"user registration\", 1);\n $confirm.notify(\"success\", $translate.instant(\"LOGIN_FORM.SUCCESS\"));\n return $location.url($scope.nextUrl);\n };\n onErrorSubmit = function(response) {\n var text;\n if (response.data._error_message) {\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {\n error: response.data._error_message\n });\n $confirm.notify(\"light-error\", text);\n }\n return form.setErrors(response.data);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n promise = $auth.register($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return window.prerenderReady = true;\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRegister\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgNavUrls\", \"$tgConfig\", \"$routeParams\", \"$tgAnalytics\", \"$translate\", RegisterDirective]);\n\n ForgotPasswordDirective = function($auth, $confirm, $location, $navUrls, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit;\n $scope.data = {};\n form = $el.find(\"form\").checksley();\n onSuccessSubmit = function(response) {\n var text;\n $location.path($navUrls.resolve(\"login\"));\n text = $translate.instant(\"FORGOT_PASSWORD_FORM.SUCCESS\");\n return $confirm.success(text);\n };\n onErrorSubmit = function(response) {\n var text;\n text = $translate.instant(\"FORGOT_PASSWORD_FORM.ERROR\");\n return $confirm.notify(\"light-error\", text);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n promise = $auth.forgotPassword($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return window.prerenderReady = true;\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgForgotPassword\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$tgNavUrls\", \"$translate\", ForgotPasswordDirective]);\n\n ChangePasswordFromRecoveryDirective = function($auth, $confirm, $location, $params, $navUrls, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit, text;\n $scope.data = {};\n if ($params.token != null) {\n $scope.tokenInParams = true;\n $scope.data.token = $params.token;\n } else {\n $location.path($navUrls.resolve(\"login\"));\n text = $translate.instant(\"CHANGE_PASSWORD_RECOVERY_FORM.ERROR\");\n $confirm.notify(\"light-error\", text);\n }\n form = $el.find(\"form\").checksley();\n onSuccessSubmit = function(response) {\n $location.path($navUrls.resolve(\"login\"));\n text = $translate.instant(\"CHANGE_PASSWORD_RECOVERY_FORM.SUCCESS\");\n return $confirm.success(text);\n };\n onErrorSubmit = function(response) {\n text = $translate.instant(\"CHANGE_PASSWORD_RECOVERY_FORM.ERROR\");\n return $confirm.notify(\"light-error\", text);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n promise = $auth.changePasswordFromRecovery($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgChangePasswordFromRecovery\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$routeParams\", \"$tgNavUrls\", \"$translate\", ChangePasswordFromRecoveryDirective]);\n\n InvitationDirective = function($auth, $confirm, $location, $params, $navUrls, $analytics, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var loginForm, onErrorSubmitLogin, onErrorSubmitRegister, onSuccessSubmitLogin, onSuccessSubmitRegister, promise, registerForm, submitLogin, submitRegister, token;\n token = $params.token;\n promise = $auth.getInvitation(token);\n promise.then(function(invitation) {\n return $scope.invitation = invitation;\n });\n promise.then(null, function(response) {\n var text;\n $location.path($navUrls.resolve(\"login\"));\n text = $translate.instant(\"INVITATION_LOGIN_FORM.NOT_FOUND\");\n return $confirm.notify(\"light-error\", text);\n });\n $scope.dataLogin = {\n token: token\n };\n loginForm = $el.find(\"form.login-form\").checksley({\n onlyOneErrorElement: true\n });\n onSuccessSubmitLogin = function(response) {\n var text;\n $analytics.trackEvent(\"auth\", \"invitationAccept\", \"invitation accept with existing user\", 1);\n $location.path($navUrls.resolve(\"project\", {\n project: $scope.invitation.project_slug\n }));\n text = $translate.instant(\"INVITATION_LOGIN_FORM.SUCCESS\", {\n \"project_name\": $scope.invitation.project_name\n });\n return $confirm.notify(\"success\", text);\n };\n onErrorSubmitLogin = function(response) {\n return $confirm.notify(\"light-error\", response.data._error_message);\n };\n submitLogin = debounce(2000, (function(_this) {\n return function(event) {\n event.preventDefault();\n if (!loginForm.validate()) {\n return;\n }\n promise = $auth.acceptInvitiationWithExistingUser($scope.dataLogin);\n return promise.then(onSuccessSubmitLogin, onErrorSubmitLogin);\n };\n })(this));\n $el.on(\"submit\", \"form.login-form\", submitLogin);\n $el.on(\"click\", \".button-login\", submitLogin);\n $scope.dataRegister = {\n token: token\n };\n registerForm = $el.find(\"form.register-form\").checksley({\n onlyOneErrorElement: true\n });\n onSuccessSubmitRegister = function(response) {\n $analytics.trackEvent(\"auth\", \"invitationAccept\", \"invitation accept with new user\", 1);\n $location.path($navUrls.resolve(\"project\", {\n project: $scope.invitation.project_slug\n }));\n return $confirm.notify(\"success\", \"You've successfully joined this project\", \"Welcome to \" + (_.escape($scope.invitation.project_name)));\n };\n onErrorSubmitRegister = function(response) {\n var text;\n if (response.data._error_message) {\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {\n error: response.data._error_message\n });\n $confirm.notify(\"light-error\", text);\n }\n return registerForm.setErrors(response.data);\n };\n submitRegister = debounce(2000, (function(_this) {\n return function(event) {\n event.preventDefault();\n if (!registerForm.validate()) {\n return;\n }\n promise = $auth.acceptInvitiationWithNewUser($scope.dataRegister);\n return promise.then(onSuccessSubmitRegister, onErrorSubmitRegister);\n };\n })(this));\n $el.on(\"submit\", \"form.register-form\", submitRegister);\n $el.on(\"click\", \".button-register\", submitRegister);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgInvitation\", [\"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$routeParams\", \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\", InvitationDirective]);\n\n ChangeEmailDirective = function($repo, $model, $auth, $confirm, $location, $params, $navUrls, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit;\n $scope.data = {};\n $scope.data.email_token = $params.email_token;\n form = $el.find(\"form\").checksley();\n onSuccessSubmit = function(response) {\n var text;\n if ($auth.isAuthenticated()) {\n $repo.queryOne(\"users\", $auth.getUser().id).then((function(_this) {\n return function(data) {\n $auth.setUser(data);\n return $location.path($navUrls.resolve(\"home\"));\n };\n })(this));\n } else {\n $location.path($navUrls.resolve(\"login\"));\n }\n text = $translate.instant(\"CHANGE_EMAIL_FORM.SUCCESS\");\n return $confirm.success(text);\n };\n onErrorSubmit = function(response) {\n var text;\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {\n error: response.data._error_message\n });\n return $confirm.notify(\"light-error\", text);\n };\n submit = function() {\n var promise;\n if (!form.validate()) {\n return;\n }\n promise = $auth.changeEmail($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n $el.on(\"submit\", function(event) {\n event.preventDefault();\n return submit();\n });\n $el.on(\"click\", \"a.button-change-email\", function(event) {\n event.preventDefault();\n return submit();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgChangeEmail\", [\"$tgRepo\", \"$tgModel\", \"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$routeParams\", \"$tgNavUrls\", \"$translate\", ChangeEmailDirective]);\n\n CancelAccountDirective = function($repo, $model, $auth, $confirm, $location, $params, $navUrls) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, onErrorSubmit, onSuccessSubmit, submit;\n $scope.data = {};\n $scope.data.cancel_token = $params.cancel_token;\n form = $el.find(\"form\").checksley();\n onSuccessSubmit = function(response) {\n var text;\n $auth.logout();\n $location.path($navUrls.resolve(\"home\"));\n text = $translate.instant(\"CANCEL_ACCOUNT.SUCCESS\");\n return $confirm.success(text);\n };\n onErrorSubmit = function(response) {\n var text;\n text = $translate.instant(\"COMMON.GENERIC_ERROR\", {\n error: response.data._error_message\n });\n return $confirm.notify(\"error\", text);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n promise = $auth.cancelAccount($scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgCancelAccount\", [\"$tgRepo\", \"$tgModel\", \"$tgAuth\", \"$tgConfirm\", \"$tgLocation\", \"$routeParams\", \"$tgNavUrls\", CancelAccountDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaBacklog\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base.coffee\n */\n\n(function() {\n var TaigaMainDirective, bindOnce, groupBy, init, module, taiga, urls;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaBase\", []);\n\n TaigaMainDirective = function($rootscope, $window) {\n var link;\n link = function($scope, $el, $attrs) {\n return $window.onresize = function() {\n return $rootscope.$broadcast(\"resize\");\n };\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMain\", [\"$rootScope\", \"$window\", TaigaMainDirective]);\n\n urls = {\n \"home\": \"/\",\n \"projects\": \"/projects\",\n \"error\": \"/error\",\n \"not-found\": \"/not-found\",\n \"permission-denied\": \"/permission-denied\",\n \"discover\": \"/discover\",\n \"discover-search\": \"/discover/search\",\n \"login\": \"/login\",\n \"forgot-password\": \"/forgot-password\",\n \"change-password\": \"/change-password/:token\",\n \"change-email\": \"/change-email/:token\",\n \"cancel-account\": \"/cancel-account/:token\",\n \"register\": \"/register\",\n \"invitation\": \"/invitation/:token\",\n \"create-project\": \"/create-project\",\n \"profile\": \"/profile\",\n \"user-profile\": \"/profile/:username\",\n \"project\": \"/project/:project\",\n \"project-backlog\": \"/project/:project/backlog\",\n \"project-taskboard\": \"/project/:project/taskboard/:sprint\",\n \"project-kanban\": \"/project/:project/kanban\",\n \"project-issues\": \"/project/:project/issues\",\n \"project-search\": \"/project/:project/search\",\n \"project-userstories-detail\": \"/project/:project/us/:ref\",\n \"project-tasks-detail\": \"/project/:project/task/:ref\",\n \"project-issues-detail\": \"/project/:project/issue/:ref\",\n \"project-wiki\": \"/project/:project/wiki\",\n \"project-wiki-page\": \"/project/:project/wiki/:slug\",\n \"project-team\": \"/project/:project/team\",\n \"project-admin-home\": \"/project/:project/admin/project-profile/details\",\n \"project-admin-project-profile-details\": \"/project/:project/admin/project-profile/details\",\n \"project-admin-project-profile-default-values\": \"/project/:project/admin/project-profile/default-values\",\n \"project-admin-project-profile-modules\": \"/project/:project/admin/project-profile/modules\",\n \"project-admin-project-profile-export\": \"/project/:project/admin/project-profile/export\",\n \"project-admin-project-profile-reports\": \"/project/:project/admin/project-profile/reports\",\n \"project-admin-project-values-status\": \"/project/:project/admin/project-values/status\",\n \"project-admin-project-values-points\": \"/project/:project/admin/project-values/points\",\n \"project-admin-project-values-priorities\": \"/project/:project/admin/project-values/priorities\",\n \"project-admin-project-values-severities\": \"/project/:project/admin/project-values/severities\",\n \"project-admin-project-values-types\": \"/project/:project/admin/project-values/types\",\n \"project-admin-project-values-custom-fields\": \"/project/:project/admin/project-values/custom-fields\",\n \"project-admin-memberships\": \"/project/:project/admin/memberships\",\n \"project-admin-roles\": \"/project/:project/admin/roles\",\n \"project-admin-third-parties-webhooks\": \"/project/:project/admin/third-parties/webhooks\",\n \"project-admin-third-parties-github\": \"/project/:project/admin/third-parties/github\",\n \"project-admin-third-parties-gitlab\": \"/project/:project/admin/third-parties/gitlab\",\n \"project-admin-third-parties-bitbucket\": \"/project/:project/admin/third-parties/bitbucket\",\n \"project-admin-contrib\": \"/project/:project/admin/contrib/:plugin\",\n \"user-settings-user-profile\": \"/user-settings/user-profile\",\n \"user-settings-user-change-password\": \"/user-settings/user-change-password\",\n \"user-settings-user-avatar\": \"/user-settings/user-avatar\",\n \"user-settings-mail-notifications\": \"/user-settings/mail-notifications\"\n };\n\n init = function($log, $navurls) {\n $log.debug(\"Initialize navigation urls\");\n return $navurls.update(urls);\n };\n\n module.run([\"$log\", \"$tgNavUrls\", init]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common.coffee\n */\n\n(function() {\n var AnimationFrame, Capslock, CheckPermissionDirective, ClassPermissionDirective, DataPickerConfig, LimitLineLengthDirective, ProjectUrl, Qqueue, SelectedText, Template, ToggleCommentDirective, module, taiga,\n slice = [].slice;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\", []);\n\n DataPickerConfig = function($translate) {\n return {\n get: function() {\n return {\n i18n: {\n previousMonth: $translate.instant(\"COMMON.PICKERDATE.PREV_MONTH\"),\n nextMonth: $translate.instant(\"COMMON.PICKERDATE.NEXT_MONTH\"),\n months: [$translate.instant(\"COMMON.PICKERDATE.MONTHS.JAN\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.FEB\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.MAR\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.APR\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.MAY\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.JUN\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.JUL\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.AUG\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.SEP\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.OCT\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.NOV\"), $translate.instant(\"COMMON.PICKERDATE.MONTHS.DEC\")],\n weekdays: [$translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.SUN\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.MON\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.TUE\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.WED\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.THU\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.FRI\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS.SAT\")],\n weekdaysShort: [$translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.SUN\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.MON\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.TUE\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.WED\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.THU\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.FRI\"), $translate.instant(\"COMMON.PICKERDATE.WEEK_DAYS_SHORT.SAT\")]\n },\n isRTL: $translate.instant(\"COMMON.PICKERDATE.IS_RTL\") === \"true\",\n firstDay: parseInt($translate.instant(\"COMMON.PICKERDATE.FIRST_DAY_OF_WEEK\"), 10),\n format: $translate.instant(\"COMMON.PICKERDATE.FORMAT\")\n };\n }\n };\n };\n\n module.factory(\"tgDatePickerConfigService\", [\"$translate\", DataPickerConfig]);\n\n SelectedText = function($window, $document) {\n var get;\n get = function() {\n if ($window.getSelection) {\n return $window.getSelection().toString();\n } else if ($document.selection) {\n return $document.selection.createRange().text;\n }\n return \"\";\n };\n return {\n get: get\n };\n };\n\n module.factory(\"$selectedText\", [\"$window\", \"$document\", SelectedText]);\n\n CheckPermissionDirective = function(projectService) {\n var link, render;\n render = function($el, project, permission) {\n if (project && permission) {\n if (project.get('my_permissions').indexOf(permission) > -1) {\n return $el.removeClass('hidden');\n }\n }\n };\n link = function($scope, $el, $attrs) {\n var permission, unObserve, unwatch;\n $el.addClass('hidden');\n permission = $attrs.tgCheckPermission;\n unwatch = $scope.$watch(function() {\n return projectService.project;\n }, function() {\n if (!projectService.project) {\n return;\n }\n render($el, projectService.project, permission);\n return unwatch();\n });\n unObserve = $attrs.$observe(\"tgCheckPermission\", function(permission) {\n if (!permission) {\n return;\n }\n render($el, projectService.project, permission);\n return unObserve();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n CheckPermissionDirective.$inject = [\"tgProjectService\"];\n\n module.directive(\"tgCheckPermission\", CheckPermissionDirective);\n\n ClassPermissionDirective = function() {\n var link, name;\n name = \"tgClassPermission\";\n link = function($scope, $el, $attrs) {\n var checkPermissions, tgClassPermissionWatchAction, unbindWatcher;\n checkPermissions = function(project, className, permission) {\n var negation;\n negation = permission[0] === \"!\";\n if (negation) {\n permission = permission.slice(1);\n }\n if (negation && project.my_permissions.indexOf(permission) === -1) {\n return $el.addClass(className);\n } else if (!negation && project.my_permissions.indexOf(permission) !== -1) {\n return $el.addClass(className);\n } else {\n return $el.removeClass(className);\n }\n };\n tgClassPermissionWatchAction = function(project) {\n var className, classes, permission, results;\n if (project) {\n unbindWatcher();\n classes = $scope.$eval($attrs[name]);\n results = [];\n for (className in classes) {\n permission = classes[className];\n results.push(checkPermissions(project, className, permission));\n }\n return results;\n }\n };\n return unbindWatcher = $scope.$watch(\"project\", tgClassPermissionWatchAction);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgClassPermission\", ClassPermissionDirective);\n\n AnimationFrame = function() {\n var add, animationFrame, performAnimation, tail;\n animationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame;\n performAnimation = (function(_this) {\n return function(time) {\n var fn;\n fn = tail.shift();\n fn();\n if (tail.length) {\n return animationFrame(performAnimation);\n }\n };\n })(this);\n tail = [];\n add = function() {\n var fn, i, len, results;\n results = [];\n for (i = 0, len = arguments.length; i < len; i++) {\n fn = arguments[i];\n tail.push(fn);\n if (tail.length === 1) {\n results.push(animationFrame(performAnimation));\n } else {\n results.push(void 0);\n }\n }\n return results;\n };\n return {\n add: add\n };\n };\n\n module.factory(\"animationFrame\", AnimationFrame);\n\n ToggleCommentDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $el.find(\"textarea\").on(\"focus\", function() {\n return $el.addClass(\"active\");\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgToggleComment\", ToggleCommentDirective);\n\n ProjectUrl = function($navurls) {\n var get;\n get = function(project) {\n var ctx;\n ctx = {\n project: project.slug\n };\n if (project.is_backlog_activated && project.my_permissions.indexOf(\"view_us\") > -1) {\n return $navurls.resolve(\"project-backlog\", ctx);\n }\n if (project.is_kanban_activated && project.my_permissions.indexOf(\"view_us\") > -1) {\n return $navurls.resolve(\"project-kanban\", ctx);\n }\n if (project.is_wiki_activated && project.my_permissions.indexOf(\"view_wiki_pages\") > -1) {\n return $navurls.resolve(\"project-wiki\", ctx);\n }\n if (project.is_issues_activated && project.my_permissions.indexOf(\"view_issues\") > -1) {\n return $navurls.resolve(\"project-issues\", ctx);\n }\n return $navurls.resolve(\"project\", ctx);\n };\n return {\n get: get\n };\n };\n\n module.factory(\"$projectUrl\", [\"$tgNavUrls\", ProjectUrl]);\n\n LimitLineLengthDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var maxColsPerLine;\n maxColsPerLine = parseInt($el.attr(\"cols\"));\n return $el.on(\"keyup\", function(event) {\n var code, lines;\n code = event.keyCode;\n lines = $el.val().split(\"\\n\");\n _.each(lines, function(line, index) {\n return lines[index] = line.substring(0, maxColsPerLine - 2);\n });\n return $el.val(lines.join(\"\\n\"));\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLimitLineLength\", LimitLineLengthDirective);\n\n Qqueue = function($q) {\n var deferred, lastPromise, qqueue;\n deferred = $q.defer();\n deferred.resolve();\n lastPromise = deferred.promise;\n qqueue = {\n bindAdd: (function(_this) {\n return function(fn) {\n return function() {\n var args;\n args = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n return lastPromise = lastPromise.then(function() {\n return fn.apply(_this, args);\n });\n };\n return qqueue;\n };\n })(this),\n add: (function(_this) {\n return function(fn) {\n if (!lastPromise) {\n lastPromise = fn();\n } else {\n lastPromise = lastPromise.then(fn);\n }\n return qqueue;\n };\n })(this)\n };\n return qqueue;\n };\n\n module.factory(\"$tgQqueue\", [\"$q\", Qqueue]);\n\n Template = function($templateCache) {\n return {\n get: (function(_this) {\n return function(name, lodash) {\n var tmp;\n if (lodash == null) {\n lodash = false;\n }\n tmp = $templateCache.get(name);\n if (lodash) {\n tmp = _.template(tmp);\n }\n return tmp;\n };\n })(this)\n };\n };\n\n module.factory(\"$tgTemplate\", [\"$templateCache\", Template]);\n\n Capslock = function($translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var hideIcon, open, showIcon, warningIcon;\n open = false;\n warningIcon = $('
').addClass('icon').addClass('icon-capslock').attr('title', $translate.instant('COMMON.CAPSLOCK_WARNING'));\n hideIcon = function() {\n return warningIcon.fadeOut(function() {\n open = false;\n return $(this).remove();\n });\n };\n showIcon = function(e) {\n var element;\n if (open) {\n return;\n }\n element = e.currentTarget;\n $(element).parent().append(warningIcon);\n $('.icon-capslock').fadeIn();\n return open = true;\n };\n $el.on('blur', function(e) {\n return hideIcon();\n });\n $el.on('keyup.capslock, focus', function(e) {\n if ($el.val() === $el.val().toLowerCase()) {\n return hideIcon(e);\n } else {\n return showIcon(e);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off('.capslock');\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgCapslock\", [\"$translate\", Capslock]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/events.coffee\n */\n\n(function() {\n var EventsProvider, EventsService, bindMethods, module, startswith, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n taiga = this.taiga;\n\n startswith = this.taiga.startswith;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaEvents\", []);\n\n EventsService = (function() {\n function EventsService(win, log, config, auth, liveAnnouncementService1, rootScope) {\n this.win = win;\n this.log = log;\n this.config = config;\n this.auth = auth;\n this.liveAnnouncementService = liveAnnouncementService1;\n this.rootScope = rootScope;\n this.processMessage = bind(this.processMessage, this);\n bindMethods(this);\n }\n\n EventsService.prototype.initialize = function(sessionId) {\n this.sessionId = sessionId;\n this.subscriptions = {};\n this.connected = false;\n this.error = false;\n this.pendingMessages = [];\n this.missedHeartbeats = 0;\n this.heartbeatInterval = null;\n if (this.win.WebSocket === void 0) {\n return this.log.info(\"WebSockets not supported on your browser\");\n }\n };\n\n EventsService.prototype.setupConnection = function() {\n var loc, path, scheme, url;\n this.stopExistingConnection();\n url = this.config.get(\"eventsUrl\");\n if (!url) {\n return;\n }\n if (!startswith(url, \"ws:\") && !startswith(url, \"wss:\")) {\n loc = this.win.location;\n scheme = loc.protocol === \"https:\" ? \"wss:\" : \"ws:\";\n path = _.str.ltrim(url, \"/\");\n url = scheme + \"//\" + loc.host + \"/\" + path;\n }\n this.ws = new this.win.WebSocket(url);\n this.ws.addEventListener(\"open\", this.onOpen);\n this.ws.addEventListener(\"message\", this.onMessage);\n this.ws.addEventListener(\"error\", this.onError);\n return this.ws.addEventListener(\"close\", this.onClose);\n };\n\n EventsService.prototype.stopExistingConnection = function() {\n if (this.ws === void 0) {\n return;\n }\n this.ws.removeEventListener(\"open\", this.onOpen);\n this.ws.removeEventListener(\"close\", this.onClose);\n this.ws.removeEventListener(\"error\", this.onError);\n this.ws.removeEventListener(\"message\", this.onMessage);\n this.stopHeartBeatMessages();\n this.ws.close();\n return delete this.ws;\n };\n\n EventsService.prototype.notifications = function() {\n return this.subscribe(null, 'notifications', (function(_this) {\n return function(data) {\n _this.liveAnnouncementService.show(data.title, data.desc);\n return _this.rootScope.$digest();\n };\n })(this));\n };\n\n EventsService.prototype.startHeartBeatMessages = function() {\n var heartbeatIntervalTime, maxMissedHeartbeats;\n if (this.heartbeatInterval) {\n return;\n }\n maxMissedHeartbeats = this.config.get(\"eventsMaxMissedHeartbeats\", 5);\n heartbeatIntervalTime = this.config.get(\"eventsHeartbeatIntervalTime\", 60000);\n this.missedHeartbeats = 0;\n this.heartbeatInterval = setInterval((function(_this) {\n return function() {\n var e, error1;\n try {\n if (_this.missedHeartbeats >= maxMissedHeartbeats) {\n throw new Error(\"Too many missed heartbeats PINGs.\");\n }\n _this.missedHeartbeats++;\n _this.sendMessage({\n cmd: \"ping\"\n });\n return _this.log.debug(\"HeartBeat send PING\");\n } catch (error1) {\n e = error1;\n _this.log.error(\"HeartBeat error: \" + e.message);\n return _this.stopHeartBeatMessages();\n }\n };\n })(this), heartbeatIntervalTime);\n return this.log.debug(\"HeartBeat enabled\");\n };\n\n EventsService.prototype.stopHeartBeatMessages = function() {\n if (!this.heartbeatInterval) {\n return;\n }\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = null;\n return this.log.debug(\"HeartBeat disabled\");\n };\n\n EventsService.prototype.processHeartBeatPongMessage = function(data) {\n this.missedHeartbeats = 0;\n return this.log.debug(\"HeartBeat recived PONG\");\n };\n\n EventsService.prototype.serialize = function(message) {\n if (_.isObject(message)) {\n return JSON.stringify(message);\n }\n return message;\n };\n\n EventsService.prototype.sendMessage = function(message) {\n var i, len, messages, msg, results;\n this.pendingMessages.push(message);\n if (!this.connected) {\n return;\n }\n messages = _.map(this.pendingMessages, this.serialize);\n this.pendingMessages = [];\n results = [];\n for (i = 0, len = messages.length; i < len; i++) {\n msg = messages[i];\n results.push(this.ws.send(msg));\n }\n return results;\n };\n\n EventsService.prototype.processMessage = function(data) {\n var routingKey, subscription;\n routingKey = data.routing_key;\n if (this.subscriptions[routingKey] == null) {\n return;\n }\n subscription = this.subscriptions[routingKey];\n if (subscription.scope) {\n return subscription.scope.$apply(function() {\n return subscription.callback(data.data);\n });\n } else {\n return subscription.callback(data.data);\n }\n };\n\n EventsService.prototype.subscribe = function(scope, routingKey, callback) {\n var message, subscription;\n if (this.error) {\n return;\n }\n this.log.debug(\"Subscribe to: \" + routingKey);\n subscription = {\n scope: scope,\n routingKey: routingKey,\n callback: _.debounce(callback, 500, {\n \"leading\": true,\n \"trailing\": false\n })\n };\n message = {\n \"cmd\": \"subscribe\",\n \"routing_key\": routingKey\n };\n this.subscriptions[routingKey] = subscription;\n this.sendMessage(message);\n if (scope) {\n return scope.$on(\"$destroy\", (function(_this) {\n return function() {\n return _this.unsubscribe(routingKey);\n };\n })(this));\n }\n };\n\n EventsService.prototype.unsubscribe = function(routingKey) {\n var message;\n if (this.error) {\n return;\n }\n this.log.debug(\"Unsubscribe from: \" + routingKey);\n message = {\n \"cmd\": \"unsubscribe\",\n \"routing_key\": routingKey\n };\n return this.sendMessage(message);\n };\n\n EventsService.prototype.onOpen = function() {\n var message, token;\n this.connected = true;\n this.startHeartBeatMessages();\n this.notifications();\n this.log.debug(\"WebSocket connection opened\");\n token = this.auth.getToken();\n message = {\n cmd: \"auth\",\n data: {\n token: token,\n sessionId: this.sessionId\n }\n };\n return this.sendMessage(message);\n };\n\n EventsService.prototype.onMessage = function(event) {\n var data;\n this.log.debug(\"WebSocket message received: \" + event.data);\n data = JSON.parse(event.data);\n if (data.cmd === \"pong\") {\n return this.processHeartBeatPongMessage(data);\n } else {\n return this.processMessage(data);\n }\n };\n\n EventsService.prototype.onError = function(error) {\n this.log.error(\"WebSocket error: \" + error);\n return this.error = true;\n };\n\n EventsService.prototype.onClose = function() {\n this.log.debug(\"WebSocket closed.\");\n this.connected = false;\n return this.stopHeartBeatMessages();\n };\n\n return EventsService;\n\n })();\n\n EventsProvider = (function() {\n function EventsProvider() {}\n\n EventsProvider.prototype.setSessionId = function(sessionId) {\n return this.sessionId = sessionId;\n };\n\n EventsProvider.prototype.$get = function($win, $log, $conf, $auth, liveAnnouncementService, $rootScope) {\n var service;\n service = new EventsService($win, $log, $conf, $auth, liveAnnouncementService, $rootScope);\n service.initialize(this.sessionId);\n return service;\n };\n\n EventsProvider.prototype.$get.$inject = [\"$window\", \"$log\", \"$tgConfig\", \"$tgAuth\", \"tgLiveAnnouncementService\", \"$rootScope\"];\n\n return EventsProvider;\n\n })();\n\n module.provider(\"$tgEvents\", EventsProvider);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/feedback.coffee\n */\n\n(function() {\n var FeedbackDirective, bindOnce, debounce, groupBy, mixOf, module, taiga, trim;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n mixOf = this.taiga.mixOf;\n\n debounce = this.taiga.debounce;\n\n trim = this.taiga.trim;\n\n module = angular.module(\"taigaFeedback\", []);\n\n FeedbackDirective = function($lightboxService, $repo, $confirm, $loading, feedbackService) {\n var directive, link;\n link = function($scope, $el, $attrs) {\n var form, openLightbox, submit, submitButton;\n form = $el.find(\"form\").checksley();\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.create(\"feedback\", $scope.feedback);\n promise.then(function(data) {\n currentLoading.finish();\n $lightboxService.close($el);\n return $confirm.notify(\"success\", \"\\\\o/ we'll be happy to read your\");\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n openLightbox = function() {\n $scope.feedback = {};\n $lightboxService.open($el);\n return $el.find(\"textarea\").focus();\n };\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return openLightbox();\n };\n directive = {\n link: link,\n templateUrl: \"common/lightbox-feedback.html\",\n scope: {}\n };\n return directive;\n };\n\n module.directive(\"tgLbFeedback\", [\"lightboxService\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"tgFeedbackService\", FeedbackDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/integrations.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaIntegrations\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaIssues\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/kanban.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaKanban\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaPlugins\", [\"ngRoute\"]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/projects.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaProject\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/related-tasks.coffee\n */\n\n(function() {\n var RelatedTaskAssignedToInlineEditionDirective, RelatedTaskCreateButtonDirective, RelatedTaskCreateFormDirective, RelatedTaskRowDirective, RelatedTasksDirective, debounce, module, taiga, trim;\n\n taiga = this.taiga;\n\n trim = this.taiga.trim;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaRelatedTasks\", []);\n\n RelatedTaskRowDirective = function($repo, $compile, $confirm, $rootscope, $loading, $template, $translate) {\n var link, templateEdit, templateView;\n templateView = $template.get(\"task/related-task-row.html\", true);\n templateEdit = $template.get(\"task/related-task-row-edit.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var renderEdit, renderView, saveTask;\n saveTask = debounce(2000, function(task) {\n var currentLoading, promise;\n task.subject = $el.find('input').val();\n currentLoading = $loading().target($el.find('.task-name')).start();\n promise = $repo.save(task);\n promise.then((function(_this) {\n return function() {\n currentLoading.finish();\n return $rootscope.$broadcast(\"related-tasks:update\");\n };\n })(this));\n promise.then(null, (function(_this) {\n return function() {\n currentLoading.finish();\n $el.find('input').val(task.subject);\n return $confirm.notify(\"error\");\n };\n })(this));\n return promise;\n });\n renderEdit = function(task) {\n $el.html($compile(templateEdit({\n task: task\n }))($scope));\n $el.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === 13) {\n return saveTask($model.$modelValue).then(function() {\n return renderView($model.$modelValue);\n });\n } else if (event.keyCode === 27) {\n return renderView($model.$modelValue);\n }\n });\n $el.on(\"click\", \".icon-floppy\", function(event) {\n return saveTask($model.$modelValue).then(function() {\n return renderView($model.$modelValue);\n });\n });\n return $el.on(\"click\", \".cancel-edit\", function(event) {\n return renderView($model.$modelValue);\n });\n };\n renderView = function(task) {\n var perms;\n $el.off();\n perms = {\n modify_task: $scope.project.my_permissions.indexOf(\"modify_task\") !== -1,\n delete_task: $scope.project.my_permissions.indexOf(\"delete_task\") !== -1\n };\n $el.html($compile(templateView({\n task: task,\n perms: perms\n }))($scope));\n $el.on(\"click\", \".icon-edit\", function() {\n renderEdit($model.$modelValue);\n return $el.find('input').focus().select();\n });\n return $el.on(\"click\", \".delete-task\", function(event) {\n var message, title;\n title = $translate.instant(\"TASK.TITLE_DELETE_ACTION\");\n task = $model.$modelValue;\n message = task.subject;\n return $confirm.askOnDelete(title, message).then(function(askResponse) {\n var promise;\n promise = $repo.remove(task);\n promise.then(function() {\n askResponse.finish();\n return $scope.$emit(\"related-tasks:delete\");\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n });\n });\n });\n };\n $scope.$watch($attrs.ngModel, function(val) {\n if (!val) {\n return;\n }\n return renderView(val);\n });\n $scope.$on(\"related-tasks:assigned-to-changed\", function() {\n return $rootscope.$broadcast(\"related-tasks:update\");\n });\n $scope.$on(\"related-tasks:status-changed\", function() {\n return $rootscope.$broadcast(\"related-tasks:update\");\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgRelatedTaskRow\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$rootScope\", \"$tgLoading\", \"$tgTemplate\", \"$translate\", RelatedTaskRowDirective]);\n\n RelatedTaskCreateFormDirective = function($repo, $compile, $confirm, $tgmodel, $loading, $analytics, $template) {\n var link, newTask, template;\n template = $template.get(\"task/related-task-create-form.html\", true);\n newTask = {\n subject: \"\",\n assigned_to: null\n };\n link = function($scope, $el, $attrs) {\n var close, createTask, render;\n createTask = debounce(2000, function(task) {\n var currentLoading, promise;\n task.subject = $el.find('input').val();\n task.assigned_to = $scope.newTask.assigned_to;\n task.status = $scope.newTask.status;\n $scope.newTask.status = $scope.project.default_task_status;\n $scope.newTask.assigned_to = null;\n currentLoading = $loading().target($el.find('.task-name')).start();\n promise = $repo.create(\"tasks\", task);\n promise.then(function() {\n $analytics.trackEvent(\"task\", \"create\", \"create task on userstory\", 1);\n currentLoading.finish();\n return $scope.$emit(\"related-tasks:add\");\n });\n promise.then(null, function() {\n $el.find('input').val(task.subject);\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n return promise;\n });\n close = function() {\n $el.off();\n $el.html(\"\");\n return $scope.newRelatedTaskFormOpen = false;\n };\n render = function() {\n $scope.newRelatedTaskFormOpen = true;\n $el.html($compile(template())($scope));\n $el.find('input').focus().select();\n $el.addClass('active');\n $el.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === 13) {\n return createTask(newTask).then(function() {\n return render();\n });\n } else if (event.keyCode === 27) {\n return $scope.$apply(function() {\n return close();\n });\n }\n });\n $el.on(\"click\", \".icon-delete\", function(event) {\n return $scope.$apply(function() {\n return close();\n });\n });\n return $el.on(\"click\", \".icon-floppy\", function(event) {\n return createTask(newTask).then(function() {\n return close();\n });\n });\n };\n taiga.bindOnce($scope, \"us\", function(val) {\n newTask[\"status\"] = $scope.project.default_task_status;\n newTask[\"project\"] = $scope.project.id;\n newTask[\"user_story\"] = $scope.us.id;\n $scope.newTask = $tgmodel.make_model(\"tasks\", newTask);\n return $el.html(\"\");\n });\n $scope.$on(\"related-tasks:show-form\", function() {\n return render();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRelatedTaskCreateForm\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$tgModel\", \"$tgLoading\", \"$tgAnalytics\", \"$tgTemplate\", RelatedTaskCreateFormDirective]);\n\n RelatedTaskCreateButtonDirective = function($repo, $compile, $confirm, $tgmodel, $template) {\n var link, template;\n template = $template.get(\"common/components/add-button.html\", true);\n link = function($scope, $el, $attrs) {\n $scope.$watch(\"project\", function(val) {\n if (!val) {\n return;\n }\n $el.off();\n if ($scope.project.my_permissions.indexOf(\"add_task\") !== -1) {\n $el.html($compile(template())($scope));\n } else {\n $el.html(\"\");\n }\n return $el.on(\"click\", \".add-button\", function(event) {\n return $scope.$emit(\"related-tasks:add-new-clicked\");\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRelatedTaskCreateButton\", [\"$tgRepo\", \"$compile\", \"$tgConfirm\", \"$tgModel\", \"$tgTemplate\", RelatedTaskCreateButtonDirective]);\n\n RelatedTasksDirective = function($repo, $rs, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n var loadTasks;\n loadTasks = function() {\n return $rs.tasks.list($scope.projectId, null, $scope.usId).then((function(_this) {\n return function(tasks) {\n $scope.tasks = _.sortBy(tasks, 'ref');\n return tasks;\n };\n })(this));\n };\n $scope.$on(\"related-tasks:add\", function() {\n return loadTasks().then(function() {\n return $rootscope.$broadcast(\"related-tasks:update\");\n });\n });\n $scope.$on(\"related-tasks:delete\", function() {\n return loadTasks().then(function() {\n return $rootscope.$broadcast(\"related-tasks:update\");\n });\n });\n $scope.$on(\"related-tasks:add-new-clicked\", function() {\n return $scope.$broadcast(\"related-tasks:show-form\");\n });\n taiga.bindOnce($scope, \"us\", function(val) {\n return loadTasks();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRelatedTasks\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", RelatedTasksDirective]);\n\n RelatedTaskAssignedToInlineEditionDirective = function($repo, $rootscope, $translate) {\n var link, template;\n template = _.template(\"\\\" alt=\\\"<%- name %>\\\"/>\\n
<%- name %>
\");\n link = function($scope, $el, $attrs) {\n var $ctrl, autoSave, notAutoSave, task, updateRelatedTask;\n updateRelatedTask = function(task) {\n var ctx, member;\n ctx = {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\"),\n imgurl: \"/\" + window._version + \"/images/unnamed.png\"\n };\n member = $scope.usersById[task.assigned_to];\n if (member) {\n ctx.imgurl = member.photo;\n ctx.name = member.full_name_display;\n }\n $el.find(\".avatar\").html(template(ctx));\n return $el.find(\".task-assignedto\").attr('title', ctx.name);\n };\n $ctrl = $el.controller();\n task = $scope.$eval($attrs.tgRelatedTaskAssignedToInlineEdition);\n notAutoSave = $scope.$eval($attrs.notAutoSave);\n autoSave = !notAutoSave;\n updateRelatedTask(task);\n $el.on(\"click\", \".task-assignedto\", function(event) {\n return $rootscope.$broadcast(\"assigned-to:add\", task);\n });\n taiga.bindOnce($scope, \"project\", function(project) {\n if (project.my_permissions.indexOf(\"modify_task\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n $scope.$on(\"assigned-to:added\", debounce(2000, (function(_this) {\n return function(ctx, userId, updatedRelatedTask) {\n if (updatedRelatedTask.id === task.id) {\n updatedRelatedTask.assigned_to = userId;\n if (autoSave) {\n $repo.save(updatedRelatedTask).then(function() {\n return $scope.$emit(\"related-tasks:assigned-to-changed\");\n });\n }\n return updateRelatedTask(updatedRelatedTask);\n }\n };\n })(this)));\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRelatedTaskAssignedToInlineEdition\", [\"$tgRepo\", \"$rootScope\", \"$translate\", RelatedTaskAssignedToInlineEditionDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources.coffee\n */\n\n(function() {\n var ResourcesService, initResources, initUrls, module, taiga, urls,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n ResourcesService = (function(superClass) {\n extend(ResourcesService, superClass);\n\n function ResourcesService() {\n return ResourcesService.__super__.constructor.apply(this, arguments);\n }\n\n return ResourcesService;\n\n })(taiga.Service);\n\n urls = {\n \"auth\": \"/auth\",\n \"auth-register\": \"/auth/register\",\n \"invitations\": \"/invitations\",\n \"users\": \"/users\",\n \"by_username\": \"/users/by_username\",\n \"users-password-recovery\": \"/users/password_recovery\",\n \"users-change-password-from-recovery\": \"/users/change_password_from_recovery\",\n \"users-change-password\": \"/users/change_password\",\n \"users-change-email\": \"/users/change_email\",\n \"users-cancel-account\": \"/users/cancel\",\n \"user-stats\": \"/users/%s/stats\",\n \"user-liked\": \"/users/%s/liked\",\n \"user-voted\": \"/users/%s/voted\",\n \"user-watched\": \"/users/%s/watched\",\n \"user-contacts\": \"/users/%s/contacts\",\n \"permissions\": \"/permissions\",\n \"notify-policies\": \"/notify-policies\",\n \"user-storage\": \"/user-storage\",\n \"memberships\": \"/memberships\",\n \"bulk-create-memberships\": \"/memberships/bulk_create\",\n \"roles\": \"/roles\",\n \"permissions\": \"/permissions\",\n \"resolver\": \"/resolver\",\n \"projects\": \"/projects\",\n \"project-templates\": \"/project-templates\",\n \"project-modules\": \"/projects/%s/modules\",\n \"bulk-update-projects-order\": \"/projects/bulk_update_order\",\n \"project-like\": \"/projects/%s/like\",\n \"project-unlike\": \"/projects/%s/unlike\",\n \"project-watch\": \"/projects/%s/watch\",\n \"project-unwatch\": \"/projects/%s/unwatch\",\n \"userstory-statuses\": \"/userstory-statuses\",\n \"points\": \"/points\",\n \"task-statuses\": \"/task-statuses\",\n \"issue-statuses\": \"/issue-statuses\",\n \"issue-types\": \"/issue-types\",\n \"priorities\": \"/priorities\",\n \"severities\": \"/severities\",\n \"milestones\": \"/milestones\",\n \"userstories\": \"/userstories\",\n \"bulk-create-us\": \"/userstories/bulk_create\",\n \"bulk-update-us-backlog-order\": \"/userstories/bulk_update_backlog_order\",\n \"bulk-update-us-sprint-order\": \"/userstories/bulk_update_sprint_order\",\n \"bulk-update-us-kanban-order\": \"/userstories/bulk_update_kanban_order\",\n \"userstories-filters\": \"/userstories/filters_data\",\n \"userstory-upvote\": \"/userstories/%s/upvote\",\n \"userstory-downvote\": \"/userstories/%s/downvote\",\n \"userstory-watch\": \"/userstories/%s/watch\",\n \"userstory-unwatch\": \"/userstories/%s/unwatch\",\n \"tasks\": \"/tasks\",\n \"bulk-create-tasks\": \"/tasks/bulk_create\",\n \"bulk-update-task-taskboard-order\": \"/tasks/bulk_update_taskboard_order\",\n \"task-upvote\": \"/tasks/%s/upvote\",\n \"task-downvote\": \"/tasks/%s/downvote\",\n \"task-watch\": \"/tasks/%s/watch\",\n \"task-unwatch\": \"/tasks/%s/unwatch\",\n \"issues\": \"/issues\",\n \"bulk-create-issues\": \"/issues/bulk_create\",\n \"issues-filters\": \"/issues/filters_data\",\n \"issue-upvote\": \"/issues/%s/upvote\",\n \"issue-downvote\": \"/issues/%s/downvote\",\n \"issue-watch\": \"/issues/%s/watch\",\n \"issue-unwatch\": \"/issues/%s/unwatch\",\n \"wiki\": \"/wiki\",\n \"wiki-restore\": \"/wiki/%s/restore\",\n \"wiki-links\": \"/wiki-links\",\n \"history/us\": \"/history/userstory\",\n \"history/issue\": \"/history/issue\",\n \"history/task\": \"/history/task\",\n \"history/wiki\": \"/history/wiki\",\n \"attachments/us\": \"/userstories/attachments\",\n \"attachments/issue\": \"/issues/attachments\",\n \"attachments/task\": \"/tasks/attachments\",\n \"attachments/wiki_page\": \"/wiki/attachments\",\n \"custom-attributes/userstory\": \"/userstory-custom-attributes\",\n \"custom-attributes/issue\": \"/issue-custom-attributes\",\n \"custom-attributes/task\": \"/task-custom-attributes\",\n \"custom-attributes-values/userstory\": \"/userstories/custom-attributes-values\",\n \"custom-attributes-values/issue\": \"/issues/custom-attributes-values\",\n \"custom-attributes-values/task\": \"/tasks/custom-attributes-values\",\n \"webhooks\": \"/webhooks\",\n \"webhooks-test\": \"/webhooks/%s/test\",\n \"webhooklogs\": \"/webhooklogs\",\n \"webhooklogs-resend\": \"/webhooklogs/%s/resend\",\n \"userstories-csv\": \"/userstories/csv?uuid=%s\",\n \"tasks-csv\": \"/tasks/csv?uuid=%s\",\n \"issues-csv\": \"/issues/csv?uuid=%s\",\n \"timeline-profile\": \"/timeline/profile\",\n \"timeline-user\": \"/timeline/user\",\n \"timeline-project\": \"/timeline/project\",\n \"search\": \"/search\",\n \"exporter\": \"/exporter\",\n \"importer\": \"/importer/load_dump\",\n \"feedback\": \"/feedback\",\n \"locales\": \"/locales\",\n \"applications\": \"/applications\",\n \"application-tokens\": \"/application-tokens\",\n \"stats-discover\": \"/stats/discover\"\n };\n\n initUrls = function($log, $urls) {\n $log.debug(\"Initialize api urls\");\n return $urls.update(urls);\n };\n\n initResources = function($log, $rs) {\n var i, len, provider, providers, results;\n $log.debug(\"Initialize resources\");\n providers = _.toArray(arguments).slice(2);\n results = [];\n for (i = 0, len = providers.length; i < len; i++) {\n provider = providers[i];\n results.push(provider($rs));\n }\n return results;\n };\n\n module = angular.module(\"taigaResources\", [\"taigaBase\"]);\n\n module.service(\"$tgResources\", ResourcesService);\n\n module.run([\"$log\", \"$tgUrls\", initUrls]);\n\n module.run([\"$log\", \"$tgResources\", \"$tgProjectsResourcesProvider\", \"$tgCustomAttributesResourcesProvider\", \"$tgCustomAttributesValuesResourcesProvider\", \"$tgMembershipsResourcesProvider\", \"$tgNotifyPoliciesResourcesProvider\", \"$tgInvitationsResourcesProvider\", \"$tgRolesResourcesProvider\", \"$tgUserSettingsResourcesProvider\", \"$tgSprintsResourcesProvider\", \"$tgUserstoriesResourcesProvider\", \"$tgTasksResourcesProvider\", \"$tgIssuesResourcesProvider\", \"$tgWikiResourcesProvider\", \"$tgSearchResourcesProvider\", \"$tgMdRenderResourcesProvider\", \"$tgHistoryResourcesProvider\", \"$tgKanbanResourcesProvider\", \"$tgModulesResourcesProvider\", \"$tgWebhooksResourcesProvider\", \"$tgWebhookLogsResourcesProvider\", \"$tgLocalesResourcesProvider\", \"$tgUsersResourcesProvider\", initResources]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/search.coffee\n */\n\n(function() {\n var SearchBoxDirective, SearchController, SearchDirective, bindOnce, debounce, debounceLeading, groupBy, mixOf, module, taiga, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n mixOf = this.taiga.mixOf;\n\n debounceLeading = this.taiga.debounceLeading;\n\n trim = this.taiga.trim;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaSearch\", []);\n\n SearchController = (function(superClass) {\n extend(SearchController, superClass);\n\n SearchController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"tgAppMetaService\", \"$tgNavUrls\", \"$translate\"];\n\n function SearchController(scope1, repo, rs, params, q, location, appMetaService, navUrls, translate) {\n var loadSearchData, promise;\n this.scope = scope1;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.translate = translate;\n this.scope.sectionName = \"Search\";\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"SEARCH.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.translate.instant(\"SEARCH.PAGE_DESCRIPTION\", {\n projectName: _this.scope.project.name,\n projectDescription: _this.scope.project.description\n });\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.searchTerm = null;\n loadSearchData = debounceLeading(100, (function(_this) {\n return function(t) {\n return _this.loadSearchData(t);\n };\n })(this));\n bindOnce(this.scope, \"projectId\", (function(_this) {\n return function(projectId) {\n if (!_this.scope.searchResults && _this.scope.searchTerm) {\n return _this.loadSearchData();\n }\n };\n })(this));\n this.scope.$watch(\"searchTerm\", (function(_this) {\n return function(term) {\n if (term !== void 0 && _this.scope.projectId) {\n return _this.loadSearchData(term);\n }\n };\n })(this));\n }\n\n SearchController.prototype.loadFilters = function() {\n var defered;\n defered = this.q.defer();\n defered.resolve();\n return defered.promise;\n };\n\n SearchController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n _this.scope.issueStatusById = groupBy(project.issue_statuses, function(x) {\n return x.id;\n });\n _this.scope.taskStatusById = groupBy(project.task_statuses, function(x) {\n return x.id;\n });\n _this.scope.severityById = groupBy(project.severities, function(x) {\n return x.id;\n });\n _this.scope.priorityById = groupBy(project.priorities, function(x) {\n return x.id;\n });\n _this.scope.usStatusById = groupBy(project.us_statuses, function(x) {\n return x.id;\n });\n return project;\n };\n })(this));\n };\n\n SearchController.prototype.loadSearchData = function(term) {\n if (term == null) {\n term = \"\";\n }\n this.scope.loading = true;\n return this._loadSearchData(term).then((function(_this) {\n return function(data) {\n _this.scope.searchResults = data;\n return _this.scope.loading = false;\n };\n })(this));\n };\n\n SearchController.prototype._loadSearchData = function(term) {\n if (term == null) {\n term = \"\";\n }\n if (this._promise) {\n this._promise.abort();\n }\n this._promise = this.rs.search[\"do\"](this.scope.projectId, term);\n return this._promise;\n };\n\n SearchController.prototype.loadInitialData = function() {\n return this.loadProject().then((function(_this) {\n return function(project) {\n _this.scope.projectId = project.id;\n return _this.fillUsersAndRoles(project.members, project.roles);\n };\n })(this));\n };\n\n return SearchController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"SearchController\", SearchController);\n\n SearchBoxDirective = function(projectService, $lightboxService, $navurls, $location, $route) {\n var link;\n link = function($scope, $el, $attrs) {\n var openLightbox, project, submit;\n project = null;\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var form, text, url;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n text = $el.find(\"#search-text\").val();\n url = $navurls.resolve(\"project-search\", {\n project: project.get(\"slug\")\n });\n return $scope.$apply(function() {\n $lightboxService.close($el);\n $location.path(url);\n $location.search(\"text\", text).path(url);\n return $route.reload();\n });\n };\n })(this));\n openLightbox = function() {\n project = projectService.project;\n return $lightboxService.open($el).then(function() {\n return $el.find(\"#search-text\").focus();\n });\n };\n $el.on(\"submit\", \"form\", submit);\n return openLightbox();\n };\n return {\n templateUrl: \"search/lightbox-search.html\",\n link: link\n };\n };\n\n SearchBoxDirective.$inject = [\"tgProjectService\", \"lightboxService\", \"$tgNavUrls\", \"$tgLocation\", \"$route\"];\n\n module.directive(\"tgSearchBox\", SearchBoxDirective);\n\n SearchDirective = function($log, $compile, $templatecache, $routeparams, $location) {\n var link, linkTable;\n linkTable = function($scope, $el, $attrs, $ctrl) {\n var activeSectionName, applyAutoTab, getActiveSection, lastSearchResults, markSectionTabActive, renderFilterTabs, renderTableContent, tabsDom, templates;\n applyAutoTab = true;\n activeSectionName = \"userstories\";\n tabsDom = $el.find(\".search-filter\");\n lastSearchResults = null;\n getActiveSection = function(data) {\n var i, len, maxVal, name, ref, selectedSection, value;\n maxVal = 0;\n selectedSection = {};\n selectedSection.name = \"userstories\";\n selectedSection.value = [];\n if (!applyAutoTab) {\n selectedSection.name = activeSectionName;\n selectedSection.value = data[activeSectionName];\n return selectedSection;\n }\n if (data) {\n ref = [\"userstories\", \"issues\", \"tasks\", \"wikipages\"];\n for (i = 0, len = ref.length; i < len; i++) {\n name = ref[i];\n value = data[name];\n if (value.length > maxVal) {\n maxVal = value.length;\n selectedSection.name = name;\n selectedSection.value = value;\n break;\n }\n }\n }\n if (maxVal === 0) {\n return selectedSection;\n }\n return selectedSection;\n };\n renderFilterTabs = function(data) {\n var name, results, value;\n results = [];\n for (name in data) {\n value = data[name];\n tabsDom.find(\"li.\" + name).show();\n results.push(tabsDom.find(\"li.\" + name + \" .num\").html(value.length));\n }\n return results;\n };\n markSectionTabActive = function(section) {\n tabsDom.find(\"a.active\").removeClass(\"active\");\n tabsDom.find(\"li.\" + section.name + \" a\").addClass(\"active\");\n applyAutoTab = false;\n return activeSectionName = section.name;\n };\n templates = {\n issues: $templatecache.get(\"search-issues\"),\n tasks: $templatecache.get(\"search-tasks\"),\n userstories: $templatecache.get(\"search-userstories\"),\n wikipages: $templatecache.get(\"search-wikipages\")\n };\n renderTableContent = function(section) {\n var element, oldElements, oldScope, scope, template;\n oldElements = $el.find(\".search-result-table\").children();\n oldScope = oldElements.scope();\n if (oldScope) {\n oldScope.$destroy();\n oldElements.remove();\n }\n scope = $scope.$new();\n scope[section.name] = section.value;\n template = angular.element.parseHTML(trim(templates[section.name]));\n element = $compile(template)(scope);\n return $el.find(\".search-result-table\").html(element);\n };\n $scope.$watch(\"searchResults\", function(data) {\n var activeSection;\n lastSearchResults = data;\n if (!lastSearchResults) {\n return;\n }\n activeSection = getActiveSection(data);\n renderFilterTabs(data);\n renderTableContent(activeSection);\n return markSectionTabActive(activeSection);\n });\n $scope.$watch(\"searchTerm\", function(searchTerm) {\n if (searchTerm !== void 0) {\n return $location.search(\"text\", searchTerm);\n }\n });\n return $el.on(\"click\", \".search-filter li > a\", function(event) {\n var section, sectionData, sectionName, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n sectionName = target.parent().data(\"name\");\n sectionData = !lastSearchResults ? [] : lastSearchResults[sectionName];\n section = {\n name: sectionName,\n value: sectionData\n };\n return $scope.$apply(function() {\n renderTableContent(section);\n return markSectionTabActive(section);\n });\n });\n };\n link = function($scope, $el, $attrs) {\n var $ctrl, searchText;\n $ctrl = $el.controller();\n linkTable($scope, $el, $attrs, $ctrl);\n searchText = $routeparams.text;\n return $scope.$watch(\"projectId\", function(projectId) {\n if (projectId != null) {\n return $scope.searchTerm = searchText;\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgSearch\", [\"$log\", \"$compile\", \"$templateCache\", \"$routeParams\", \"$tgLocation\", SearchDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaTaskboard\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/tasks.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaTasks\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/team.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaTeam\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaUserSettings\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/userstories.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaUserStories\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/wiki.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaWiki\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/analytics.coffee\n */\n\n(function() {\n var AnalyticsService, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\");\n\n AnalyticsService = (function(superClass) {\n extend(AnalyticsService, superClass);\n\n AnalyticsService.$inject = [\"$rootScope\", \"$log\", \"$tgConfig\", \"$window\", \"$document\", \"$location\"];\n\n function AnalyticsService(rootscope, log, config, win, doc, location) {\n var conf;\n this.rootscope = rootscope;\n this.log = log;\n this.config = config;\n this.win = win;\n this.doc = doc;\n this.location = location;\n this.initialized = false;\n conf = this.config.get(\"analytics\", {});\n this.accountId = conf.accountId;\n this.pageEvent = conf.pageEvent || \"$routeChangeSuccess\";\n this.trackRoutes = conf.trackRoutes || true;\n this.ignoreFirstPageLoad = conf.ignoreFirstPageLoad || false;\n }\n\n AnalyticsService.prototype.initialize = function() {\n if (!this.accountId) {\n this.log.debug(\"Analytics: no acount id provided. Disabling.\");\n return;\n }\n this.injectAnalytics();\n this.win.ga(\"create\", this.accountId, \"auto\");\n this.win.ga(\"require\", \"displayfeatures\");\n if (this.trackRoutes && (!this.ignoreFirstPageLoad)) {\n this.win.ga(\"send\", \"pageview\", this.getUrl());\n }\n if (this.trackRoutes) {\n this.rootscope.$on(this.pageEvent, (function(_this) {\n return function() {\n return _this.trackPage(_this.getUrl(), \"Taiga\");\n };\n })(this));\n }\n return this.initialized = true;\n };\n\n AnalyticsService.prototype.getUrl = function() {\n return this.location.path();\n };\n\n AnalyticsService.prototype.injectAnalytics = function() {\n var fn;\n fn = (function(i,s,o,g,r,a,m){i[\"GoogleAnalyticsObject\"]=r;i[r]=i[r]||function(){\n (i[r].q=i[r].q||[]).push(arguments);},i[r].l=1*new Date();a=s.createElement(o),\n m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m);});\n return fn(window, document, \"script\", \"//www.google-analytics.com/analytics.js\", \"ga\");\n };\n\n AnalyticsService.prototype.trackPage = function(url, title) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n title = title || this.doc[0].title;\n return this.win.ga(\"send\", \"pageview\", {\n \"page\": url,\n \"title\": title\n });\n };\n\n AnalyticsService.prototype.trackEvent = function(category, action, label, value) {\n if (!this.initialized) {\n return;\n }\n if (!this.win.ga) {\n return;\n }\n return this.win.ga(\"send\", \"event\", category, action, label, value);\n };\n\n return AnalyticsService;\n\n })(taiga.Service);\n\n module.service(\"$tgAnalytics\", AnalyticsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: bind-scope.coffee\n */\n\n(function() {\n var BindScope, module;\n\n module = angular.module(\"taigaCommon\");\n\n BindScope = function(config) {\n var link;\n if (!config.debugInfo) {\n jQuery.fn.scope = function() {\n return this.data('scope');\n };\n }\n link = function($scope, $el) {\n if (!config.debugInfo) {\n return $el.data('scope', $scope).addClass('tg-scope');\n }\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBindScope\", [\"$tgConfig\", BindScope]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: compile-html.directive.coffee\n */\n\n(function() {\n var CompileHtmlDirective;\n\n CompileHtmlDirective = function($compile) {\n var link;\n link = function(scope, element, attrs) {\n return scope.$watch(attrs.tgCompileHtml, function(newValue, oldValue) {\n element.html(newValue);\n return $compile(element.contents())(scope);\n });\n };\n return {\n link: link\n };\n };\n\n CompileHtmlDirective.$inject = [\"$compile\"];\n\n angular.module(\"taigaCommon\").directive(\"tgCompileHtml\", CompileHtmlDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/components.coffee\n */\n\n(function() {\n var AssignedToDirective, BlockButtonDirective, CreatedByDisplayDirective, DateRangeDirective, DateSelectorDirective, DeleteButtonDirective, EditableDescriptionDirective, EditableSubjectDirective, EditableWysiwyg, ListItemAssignedtoDirective, ListItemIssueStatusDirective, ListItemPriorityDirective, ListItemSeverityDirective, ListItemTaskStatusDirective, ListItemTypeDirective, ListItemUsStatusDirective, SprintProgressBarDirective, TgMainTitleDirective, TgProgressBarDirective, WatchersDirective, bindOnce, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaCommon\");\n\n DateRangeDirective = function($translate) {\n var link, renderRange;\n renderRange = function($el, first, second) {\n var endDate, initDate, prettyDate;\n prettyDate = $translate.instant(\"BACKLOG.SPRINTS.DATE\");\n initDate = moment(first).format(prettyDate);\n endDate = moment(second).format(prettyDate);\n return $el.html(initDate + \"-\" + endDate);\n };\n link = function($scope, $el, $attrs) {\n var first, ref, second;\n ref = $attrs.tgDateRange.split(\",\"), first = ref[0], second = ref[1];\n return bindOnce($scope, first, function(valFirst) {\n return bindOnce($scope, second, function(valSecond) {\n return renderRange($el, valFirst, valSecond);\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgDateRange\", [\"$translate\", DateRangeDirective]);\n\n DateSelectorDirective = function($rootscope, datePickerConfigService) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var initialize, selectedDate, unbind;\n selectedDate = null;\n initialize = function() {\n var datePickerConfig;\n datePickerConfig = datePickerConfigService.get();\n _.merge(datePickerConfig, {\n field: $el[0],\n onSelect: (function(_this) {\n return function(date) {\n return selectedDate = date;\n };\n })(this),\n onOpen: (function(_this) {\n return function() {\n if (selectedDate != null) {\n return $el.picker.setDate(selectedDate);\n }\n };\n })(this)\n });\n return $el.picker = new Pikaday(datePickerConfig);\n };\n unbind = $rootscope.$on(\"$translateChangeEnd\", (function(_this) {\n return function(ctx) {\n return initialize();\n };\n })(this));\n $scope.$watch($attrs.ngModel, function(val) {\n if ((val != null) && !$el.picker) {\n initialize();\n }\n if (val != null) {\n return $el.picker.setDate(val);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return unbind();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgDateSelector\", [\"$rootScope\", \"tgDatePickerConfigService\", DateSelectorDirective]);\n\n SprintProgressBarDirective = function() {\n var link, renderProgress;\n renderProgress = function($el, percentage, visual_percentage) {\n if ($el.hasClass(\".current-progress\")) {\n return $el.css(\"width\", percentage + \"%\");\n } else {\n $el.find(\".current-progress\").css(\"width\", visual_percentage + \"%\");\n return $el.find(\".number\").html(percentage + \" %\");\n }\n };\n link = function($scope, $el, $attrs) {\n bindOnce($scope, $attrs.tgSprintProgressbar, function(sprint) {\n var closedPoints, percentage, totalPoints, visual_percentage;\n closedPoints = sprint.closed_points;\n totalPoints = sprint.total_points;\n percentage = 0;\n if (totalPoints !== 0) {\n percentage = Math.round(100 * (closedPoints / totalPoints));\n }\n visual_percentage = 0;\n if (totalPoints !== 0) {\n visual_percentage = Math.round(98 * (closedPoints / totalPoints));\n }\n return renderProgress($el, percentage, visual_percentage);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgSprintProgressbar\", SprintProgressBarDirective);\n\n CreatedByDisplayDirective = function($template, $compile, $translate, $navUrls) {\n var link;\n link = function($scope, $el, $attrs) {\n bindOnce($scope, $attrs.ngModel, function(model) {\n var ref;\n if (model != null) {\n $scope.owner = model.owner_extra_info || {\n full_name_display: $translate.instant(\"COMMON.EXTERNAL_USER\"),\n photo: \"/\" + window._version + \"/images/user-noimage.png\"\n };\n $scope.url = ((ref = $scope.owner) != null ? ref.is_active : void 0) ? $navUrls.resolve(\"user-profile\", {\n username: $scope.owner.username\n }) : \"\";\n return $scope.date = moment(model.created_date).format($translate.instant(\"COMMON.DATETIME\"));\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\",\n scope: true,\n templateUrl: \"common/components/created-by.html\"\n };\n };\n\n module.directive(\"tgCreatedByDisplay\", [\"$tgTemplate\", \"$compile\", \"$translate\", \"$tgNavUrls\", CreatedByDisplayDirective]);\n\n WatchersDirective = function($rootscope, $confirm, $repo, $qqueue, $template, $compile, $translate) {\n var link, template;\n template = $template.get(\"common/components/watchers.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var deleteWatcher, isEditable, renderWatchers, save;\n isEditable = function() {\n var ref, ref1;\n return ((ref = $scope.project) != null ? (ref1 = ref.my_permissions) != null ? ref1.indexOf($attrs.requiredPerm) : void 0 : void 0) !== -1;\n };\n save = $qqueue.bindAdd((function(_this) {\n return function(watchers) {\n var item, promise;\n item = $model.$modelValue.clone();\n item.watchers = watchers;\n $model.$setViewValue(item);\n promise = $repo.save($model.$modelValue);\n promise.then(function() {\n watchers = _.map(watchers, function(watcherId) {\n return $scope.usersById[watcherId];\n });\n renderWatchers(watchers);\n return $rootscope.$broadcast(\"object:updated\");\n });\n return promise.then(null, function() {\n $model.$modelValue.revert();\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n deleteWatcher = $qqueue.bindAdd((function(_this) {\n return function(watcherIds) {\n var item, promise;\n item = $model.$modelValue.clone();\n item.watchers = watcherIds;\n $model.$setViewValue(item);\n promise = $repo.save($model.$modelValue);\n promise.then(function() {\n var watchers;\n watchers = _.map(item.watchers, function(watcherId) {\n return $scope.usersById[watcherId];\n });\n renderWatchers(watchers);\n return $rootscope.$broadcast(\"object:updated\");\n });\n return promise.then(null, function() {\n item.revert();\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n renderWatchers = function(watchers) {\n var ctx, html;\n ctx = {\n watchers: watchers,\n isEditable: isEditable()\n };\n html = $compile(template(ctx))($scope);\n return $el.html(html);\n };\n $el.on(\"click\", \".js-delete-watcher\", function(event) {\n var message, target, title, watcherId;\n event.preventDefault();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n watcherId = target.data(\"watcher-id\");\n title = $translate.instant(\"COMMON.WATCHERS.TITLE_LIGHTBOX_DELETE_WARTCHER\");\n message = $scope.usersById[watcherId].full_name_display;\n return $confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var watcherIds;\n askResponse.finish();\n watcherIds = _.clone($model.$modelValue.watchers, false);\n watcherIds = _.pull(watcherIds, watcherId);\n return deleteWatcher(watcherIds);\n };\n })(this));\n });\n $scope.$on(\"watcher:added\", function(ctx, watcherId) {\n var watchers;\n watchers = _.clone($model.$modelValue.watchers, false);\n watchers.push(watcherId);\n watchers = _.uniq(watchers);\n return save(watchers);\n });\n $scope.$watch($attrs.ngModel, function(item) {\n var watchers;\n if (item == null) {\n return;\n }\n watchers = _.map(item.watchers, function(watcherId) {\n return $scope.usersById[watcherId];\n });\n return renderWatchers(watchers);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgWatchers\", [\"$rootScope\", \"$tgConfirm\", \"$tgRepo\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", \"$translate\", WatchersDirective]);\n\n AssignedToDirective = function($rootscope, $confirm, $repo, $loading, $qqueue, $template, $translate, $compile, $currentUserService) {\n var link, template;\n template = $template.get(\"common/components/assigned-to.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, renderAssignedTo, save;\n isEditable = function() {\n var ref, ref1;\n return ((ref = $scope.project) != null ? (ref1 = ref.my_permissions) != null ? ref1.indexOf($attrs.requiredPerm) : void 0 : void 0) !== -1;\n };\n save = $qqueue.bindAdd((function(_this) {\n return function(userId) {\n var currentLoading, promise;\n $model.$modelValue.assigned_to = userId;\n currentLoading = $loading().target($el).start();\n promise = $repo.save($model.$modelValue);\n promise.then(function() {\n currentLoading.finish();\n renderAssignedTo($model.$modelValue);\n return $rootscope.$broadcast(\"object:updated\");\n });\n promise.then(null, function() {\n $model.$modelValue.revert();\n $confirm.notify(\"error\");\n return currentLoading.finish();\n });\n return promise;\n };\n })(this));\n renderAssignedTo = function(assignedObject) {\n var ctx, fullName, html, isIocaine, isUnassigned, photo;\n if ((assignedObject != null ? assignedObject.assigned_to : void 0) != null) {\n fullName = assignedObject.assigned_to_extra_info.full_name_display;\n photo = assignedObject.assigned_to_extra_info.photo;\n isUnassigned = false;\n } else {\n fullName = $translate.instant(\"COMMON.ASSIGNED_TO.ASSIGN\");\n photo = \"/\" + window._version + \"/images/unnamed.png\";\n isUnassigned = true;\n }\n isIocaine = assignedObject != null ? assignedObject.is_iocaine : void 0;\n ctx = {\n fullName: fullName,\n photo: photo,\n isUnassigned: isUnassigned,\n isEditable: isEditable(),\n isIocaine: isIocaine,\n fullNameVisible: !(isUnassigned && !$currentUserService.isAuthenticated())\n };\n html = $compile(template(ctx))($scope);\n return $el.html(html);\n };\n $el.on(\"click\", \".user-assigned\", function(event) {\n event.preventDefault();\n if (!isEditable()) {\n return;\n }\n return $scope.$apply(function() {\n return $rootscope.$broadcast(\"assigned-to:add\", $model.$modelValue);\n });\n });\n $el.on(\"click\", \".assign-to-me\", function(event) {\n event.preventDefault();\n if (!isEditable()) {\n return;\n }\n $model.$modelValue.assigned_to = $currentUserService.getUser().get('id');\n return save($currentUserService.getUser().get('id'));\n });\n $el.on(\"click\", \".icon-delete\", function(event) {\n var title;\n event.preventDefault();\n if (!isEditable()) {\n return;\n }\n title = $translate.instant(\"COMMON.ASSIGNED_TO.CONFIRM_UNASSIGNED\");\n return $confirm.ask(title).then((function(_this) {\n return function(response) {\n response.finish();\n $model.$modelValue.assigned_to = null;\n return save(null);\n };\n })(this));\n });\n $scope.$on(\"assigned-to:added\", function(ctx, userId, item) {\n if (item.id !== $model.$modelValue.id) {\n return;\n }\n return save(userId);\n });\n $scope.$watch($attrs.ngModel, function(instance) {\n return renderAssignedTo(instance);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgAssignedTo\", [\"$rootScope\", \"$tgConfirm\", \"$tgRepo\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$translate\", \"$compile\", \"tgCurrentUserService\", AssignedToDirective]);\n\n BlockButtonDirective = function($rootscope, $loading, $template) {\n var link, template;\n template = $template.get(\"common/components/block-button.html\");\n link = function($scope, $el, $attrs, $model) {\n var isEditable;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_us\") !== -1;\n };\n $scope.$watch($attrs.ngModel, function(item) {\n if (!item) {\n return;\n }\n if (isEditable()) {\n $el.find('.item-block').addClass('editable');\n }\n if (item.is_blocked) {\n $el.find('.item-block').removeClass('is-active');\n return $el.find('.item-unblock').addClass('is-active');\n } else {\n $el.find('.item-block').addClass('is-active');\n return $el.find('.item-unblock').removeClass('is-active');\n }\n });\n $el.on(\"click\", \".item-block\", function(event) {\n event.preventDefault();\n return $rootscope.$broadcast(\"block\", $model.$modelValue);\n });\n $el.on(\"click\", \".item-unblock\", function(event) {\n var currentLoading, finish;\n event.preventDefault();\n currentLoading = $loading().target($el.find(\".item-unblock\")).start();\n finish = function() {\n return currentLoading.finish();\n };\n return $rootscope.$broadcast(\"unblock\", $model.$modelValue, finish);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\",\n template: template\n };\n };\n\n module.directive(\"tgBlockButton\", [\"$rootScope\", \"$tgLoading\", \"$tgTemplate\", BlockButtonDirective]);\n\n DeleteButtonDirective = function($log, $repo, $confirm, $location, $template) {\n var link, template;\n template = $template.get(\"common/components/delete-button.html\");\n link = function($scope, $el, $attrs, $model) {\n if (!$attrs.onDeleteGoToUrl) {\n return $log.error(\"DeleteButtonDirective requires on-delete-go-to-url set in scope.\");\n }\n if (!$attrs.onDeleteTitle) {\n return $log.error(\"DeleteButtonDirective requires on-delete-title set in scope.\");\n }\n $el.on(\"click\", \".button-delete\", function(event) {\n var subtitle, title;\n title = $attrs.onDeleteTitle;\n subtitle = $model.$modelValue.subject;\n return $confirm.askOnDelete(title, subtitle).then((function(_this) {\n return function(askResponse) {\n var promise;\n promise = $repo.remove($model.$modelValue);\n promise.then(function() {\n var url;\n askResponse.finish();\n url = $scope.$eval($attrs.onDeleteGoToUrl);\n return $location.path(url);\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\",\n template: template\n };\n };\n\n module.directive(\"tgDeleteButton\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"$tgTemplate\", DeleteButtonDirective]);\n\n EditableSubjectDirective = function($rootscope, $repo, $confirm, $loading, $qqueue, $template) {\n var link, template;\n template = $template.get(\"common/components/editable-subject.html\");\n link = function($scope, $el, $attrs, $model) {\n var isEditable, save;\n $scope.$on(\"object:updated\", function() {\n $el.find('.edit-subject').hide();\n return $el.find('.view-subject').show();\n });\n isEditable = function() {\n return $scope.project.my_permissions.indexOf($attrs.requiredPerm) !== -1;\n };\n save = $qqueue.bindAdd((function(_this) {\n return function(subject) {\n var currentLoading, promise;\n $model.$modelValue.subject = subject;\n currentLoading = $loading().target($el.find('.save-container')).start();\n promise = $repo.save($model.$modelValue);\n promise.then(function() {\n $confirm.notify(\"success\");\n $rootscope.$broadcast(\"object:updated\");\n $el.find('.edit-subject').hide();\n return $el.find('.view-subject').show();\n });\n promise.then(null, function() {\n return $confirm.notify(\"error\");\n });\n promise[\"finally\"](function() {\n return currentLoading.finish();\n });\n return promise;\n };\n })(this));\n $el.click(function() {\n if (!isEditable()) {\n return;\n }\n $el.find('.edit-subject').show();\n $el.find('.view-subject').hide();\n return $el.find('input').focus();\n });\n $el.on(\"click\", \".save\", function(e) {\n var subject;\n e.preventDefault();\n subject = $scope.item.subject;\n return save(subject);\n });\n $el.on(\"keyup\", \"input\", function(event) {\n var subject;\n if (event.keyCode === 13) {\n subject = $scope.item.subject;\n return save(subject);\n } else if (event.keyCode === 27) {\n $scope.$apply((function(_this) {\n return function() {\n return $model.$modelValue.revert();\n };\n })(this));\n $el.find('div.edit-subject').hide();\n return $el.find('div.view-subject').show();\n }\n });\n $el.find('div.edit-subject').hide();\n $el.find('div.view-subject span.edit').hide();\n $scope.$watch($attrs.ngModel, function(value) {\n if (!value) {\n return;\n }\n $scope.item = value;\n if (!isEditable()) {\n return $el.find('.view-subject .edit').remove();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\",\n template: template\n };\n };\n\n module.directive(\"tgEditableSubject\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", EditableSubjectDirective]);\n\n EditableDescriptionDirective = function($rootscope, $repo, $confirm, $compile, $loading, $selectedText, $qqueue, $template) {\n var link, noDescriptionMegEditMode, noDescriptionMegReadMode, template;\n template = $template.get(\"common/components/editable-description.html\");\n noDescriptionMegEditMode = $template.get(\"common/components/editable-description-msg-edit-mode.html\");\n noDescriptionMegReadMode = $template.get(\"common/components/editable-description-msg-read-mode.html\");\n link = function($scope, $el, $attrs, $model) {\n var isEditable, save;\n $el.find('.edit-description').hide();\n $el.find('.view-description .edit').hide();\n $scope.$on(\"object:updated\", function() {\n $el.find('.edit-description').hide();\n return $el.find('.view-description').show();\n });\n isEditable = function() {\n return $scope.project.my_permissions.indexOf($attrs.requiredPerm) !== -1;\n };\n save = $qqueue.bindAdd((function(_this) {\n return function(description) {\n var currentLoading, promise;\n $model.$modelValue.description = description;\n currentLoading = $loading().target($el.find('.save-container')).start();\n promise = $repo.save($model.$modelValue);\n promise.then(function() {\n $confirm.notify(\"success\");\n $rootscope.$broadcast(\"object:updated\");\n $el.find('.edit-description').hide();\n return $el.find('.view-description').show();\n });\n promise.then(null, function() {\n return $confirm.notify(\"error\");\n });\n return promise[\"finally\"](function() {\n return currentLoading.finish();\n });\n };\n })(this));\n $el.on(\"mouseup\", \".view-description\", function(event) {\n var target;\n target = angular.element(event.target);\n if (!isEditable()) {\n return;\n }\n if (target.is('a')) {\n return;\n }\n if ($selectedText.get().length) {\n return;\n }\n $el.find('.edit-description').show();\n $el.find('.view-description').hide();\n return $el.find('textarea').focus();\n });\n $el.on(\"click\", \"a\", function(event) {\n var href, target;\n target = angular.element(event.target);\n href = target.attr('href');\n if (href.indexOf(\"#\") === 0) {\n event.preventDefault();\n return $('body').scrollTop($(href).offset().top);\n }\n });\n $el.on(\"click\", \".save\", function(e) {\n var description;\n e.preventDefault();\n description = $scope.item.description;\n return save(description);\n });\n $el.on(\"keydown\", \"textarea\", function(event) {\n if (event.keyCode === 27) {\n $scope.$apply((function(_this) {\n return function() {\n return $scope.item.revert();\n };\n })(this));\n $el.find('.edit-description').hide();\n return $el.find('.view-description').show();\n }\n });\n $scope.$watch($attrs.ngModel, function(value) {\n if (!value) {\n return;\n }\n $scope.item = value;\n if (isEditable()) {\n $el.find('.view-description .edit').show();\n $el.find('.view-description .us-content').addClass('editable');\n return $scope.noDescriptionMsg = $compile(noDescriptionMegEditMode)($scope);\n } else {\n return $scope.noDescriptionMsg = $compile(noDescriptionMegReadMode)($scope);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\",\n template: template\n };\n };\n\n module.directive(\"tgEditableDescription\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$compile\", \"$tgLoading\", \"$selectedText\", \"$tgQqueue\", \"$tgTemplate\", EditableDescriptionDirective]);\n\n EditableWysiwyg = function(attachmentsService, attachmentsFullService) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var isInEditMode, uploadFile;\n isInEditMode = function() {\n return $el.find('textarea').is(':visible');\n };\n uploadFile = function(file, type) {\n if (!attachmentsService.validate(file)) {\n return;\n }\n return attachmentsFullService.addAttachment($model.$modelValue.project, $model.$modelValue.id, type, file).then(function(result) {\n if (taiga.isImage(result.getIn(['file', 'name']))) {\n return '![' + result.getIn(['file', 'name']) + '](' + result.getIn(['file', 'url']) + ')';\n } else {\n return '[' + result.getIn(['file', 'name']) + '](' + result.getIn(['file', 'url']) + ')';\n }\n });\n };\n $el.on('dragover', function(e) {\n var textarea;\n textarea = $el.find('textarea').focus();\n return false;\n });\n return $el.on('drop', function(e) {\n var dataTransfer, promises, textarea, type;\n e.stopPropagation();\n e.preventDefault();\n if (isInEditMode()) {\n dataTransfer = e.dataTransfer || (e.originalEvent && e.originalEvent.dataTransfer);\n textarea = $el.find('textarea');\n textarea.addClass('in-progress');\n type = $model.$modelValue['_name'];\n if (type === \"userstories\") {\n type = \"us\";\n } else if (type === \"tasks\") {\n type = \"task\";\n } else if (type === \"issues\") {\n type = \"issue\";\n } else if (type === \"wiki\") {\n type = \"wiki_page\";\n }\n promises = _.map(dataTransfer.files, function(file) {\n return uploadFile(file, type);\n });\n return Promise.all(promises).then(function(result) {\n textarea = $el.find('textarea');\n $.markItUp({\n replaceWith: result.join(' ')\n });\n return textarea.removeClass('in-progress');\n });\n }\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgEditableWysiwyg\", [\"tgAttachmentsService\", \"tgAttachmentsFullService\", EditableWysiwyg]);\n\n ListItemUsStatusDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var us;\n us = $scope.$eval($attrs.tgListitemUsStatus);\n return bindOnce($scope, \"usStatusById\", function(usStatusById) {\n return $el.html(usStatusById[us.status].name);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemUsStatus\", ListItemUsStatusDirective);\n\n ListItemTaskStatusDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var task;\n task = $scope.$eval($attrs.tgListitemTaskStatus);\n return bindOnce($scope, \"taskStatusById\", function(taskStatusById) {\n return $el.html(taskStatusById[task.status].name);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemTaskStatus\", ListItemTaskStatusDirective);\n\n ListItemAssignedtoDirective = function($template, $translate) {\n var link, template;\n template = $template.get(\"common/components/list-item-assigned-to-avatar.html\", true);\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, \"usersById\", function(usersById) {\n var ctx, item, member;\n item = $scope.$eval($attrs.tgListitemAssignedto);\n ctx = {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\"),\n imgurl: \"/\" + window._version + \"/images/unnamed.png\"\n };\n member = usersById[item.assigned_to];\n if (member) {\n ctx.imgurl = member.photo;\n ctx.name = member.full_name_display;\n }\n return $el.html(template(ctx));\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemAssignedto\", [\"$tgTemplate\", \"$translate\", ListItemAssignedtoDirective]);\n\n ListItemIssueStatusDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var issue;\n issue = $scope.$eval($attrs.tgListitemIssueStatus);\n return bindOnce($scope, \"issueStatusById\", function(issueStatusById) {\n return $el.html(issueStatusById[issue.status].name);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgListitemIssueStatus\", ListItemIssueStatusDirective);\n\n ListItemTypeDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var render;\n render = function(issueTypeById, issue) {\n var domNode, type;\n type = issueTypeById[issue.type];\n domNode = $el.find(\".level\");\n domNode.css(\"background-color\", type.color);\n return domNode.attr(\"title\", type.name);\n };\n bindOnce($scope, \"issueTypeById\", function(issueTypeById) {\n var issue;\n issue = $scope.$eval($attrs.tgListitemType);\n return render(issueTypeById, issue);\n });\n return $scope.$watch($attrs.tgListitemType, function(issue) {\n return render($scope.issueTypeById, issue);\n });\n };\n return {\n link: link,\n templateUrl: \"common/components/level.html\"\n };\n };\n\n module.directive(\"tgListitemType\", ListItemTypeDirective);\n\n ListItemPriorityDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var render;\n render = function(priorityById, issue) {\n var domNode, priority;\n priority = priorityById[issue.priority];\n domNode = $el.find(\".level\");\n domNode.css(\"background-color\", priority.color);\n return domNode.attr(\"title\", priority.name);\n };\n bindOnce($scope, \"priorityById\", function(priorityById) {\n var issue;\n issue = $scope.$eval($attrs.tgListitemPriority);\n return render(priorityById, issue);\n });\n return $scope.$watch($attrs.tgListitemPriority, function(issue) {\n return render($scope.priorityById, issue);\n });\n };\n return {\n link: link,\n templateUrl: \"common/components/level.html\"\n };\n };\n\n module.directive(\"tgListitemPriority\", ListItemPriorityDirective);\n\n ListItemSeverityDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var render;\n render = function(severityById, issue) {\n var domNode, severity;\n severity = severityById[issue.severity];\n domNode = $el.find(\".level\");\n domNode.css(\"background-color\", severity.color);\n return domNode.attr(\"title\", severity.name);\n };\n bindOnce($scope, \"severityById\", function(severityById) {\n var issue;\n issue = $scope.$eval($attrs.tgListitemSeverity);\n return render(severityById, issue);\n });\n return $scope.$watch($attrs.tgListitemSeverity, function(issue) {\n return render($scope.severityById, issue);\n });\n };\n return {\n link: link,\n templateUrl: \"common/components/level.html\"\n };\n };\n\n module.directive(\"tgListitemSeverity\", ListItemSeverityDirective);\n\n TgProgressBarDirective = function($template) {\n var link, render, template;\n template = $template.get(\"common/components/progress-bar.html\", true);\n render = function(el, percentage) {\n return el.html(template({\n percentage: percentage\n }));\n };\n link = function($scope, $el, $attrs) {\n var element;\n element = angular.element($el);\n $scope.$watch($attrs.tgProgressBar, function(percentage) {\n percentage = _.max([0, percentage]);\n percentage = _.min([100, percentage]);\n return render($el, percentage);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProgressBar\", [\"$tgTemplate\", TgProgressBarDirective]);\n\n TgMainTitleDirective = function($translate) {\n var link;\n link = function($scope, $el, $attrs) {\n $attrs.$observe(\"i18nSectionName\", function(i18nSectionName) {\n return $scope.sectionName = i18nSectionName;\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n templateUrl: \"common/components/main-title.html\",\n scope: {\n projectName: \"=projectName\"\n }\n };\n };\n\n module.directive(\"tgMainTitle\", [\"$translate\", TgMainTitleDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/confirm.coffee\n */\n\n(function() {\n var ConfirmService, NOTIFICATION_MSG, bindMethods, cancelTimeout, debounce, module, taiga, timeout,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n timeout = this.taiga.timeout;\n\n cancelTimeout = this.taiga.cancelTimeout;\n\n debounce = this.taiga.debounce;\n\n bindMethods = this.taiga.bindMethods;\n\n NOTIFICATION_MSG = {\n \"success\": {\n title: \"NOTIFICATION.OK\",\n message: \"NOTIFICATION.SAVED\"\n },\n \"error\": {\n title: \"NOTIFICATION.WARNING\",\n message: \"NOTIFICATION.WARNING_TEXT\"\n },\n \"light-error\": {\n title: \"NOTIFICATION.WARNING\",\n message: \"NOTIFICATION.WARNING_TEXT\"\n }\n };\n\n ConfirmService = (function(superClass) {\n extend(ConfirmService, superClass);\n\n ConfirmService.$inject = [\"$q\", \"lightboxService\", \"$tgLoading\", \"$translate\"];\n\n function ConfirmService(q, lightboxService, loading, translate) {\n this.q = q;\n this.lightboxService = lightboxService;\n this.loading = loading;\n this.translate = translate;\n bindMethods(this);\n }\n\n ConfirmService.prototype.hide = function(el) {\n if (el) {\n this.lightboxService.close(el);\n return el.off(\".confirm-dialog\");\n }\n };\n\n ConfirmService.prototype.ask = function(title, subtitle, message, lightboxSelector) {\n var defered, el;\n if (lightboxSelector == null) {\n lightboxSelector = \".lightbox-generic-ask\";\n }\n defered = this.q.defer();\n el = angular.element(lightboxSelector);\n el.find(\"h2.title\").text(title);\n el.find(\"span.subtitle\").text(subtitle);\n el.find(\"span.message\").text(message);\n el.on(\"click.confirm-dialog\", \"a.button-green\", debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n currentLoading = _this.loading().target(target).start();\n return defered.resolve({\n finish: function(ok) {\n if (ok == null) {\n ok = true;\n }\n currentLoading.finish();\n if (ok) {\n return _this.hide(el);\n }\n }\n });\n };\n })(this)));\n el.on(\"click.confirm-dialog\", \"a.button-red\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.reject();\n return _this.hide(el);\n };\n })(this));\n this.lightboxService.open(el);\n return defered.promise;\n };\n\n ConfirmService.prototype.askOnDelete = function(title, message) {\n return this.ask(title, this.translate.instant(\"NOTIFICATION.ASK_DELETE\"), message);\n };\n\n ConfirmService.prototype.askChoice = function(title, subtitle, choices, replacement, warning, lightboxSelector) {\n var choicesField, defered, el;\n if (lightboxSelector == null) {\n lightboxSelector = \".lightbox-ask-choice\";\n }\n defered = this.q.defer();\n el = angular.element(lightboxSelector);\n el.find(\".title\").text(title);\n el.find(\".subtitle\").text(subtitle);\n if (replacement) {\n el.find(\".replacement\").text(replacement);\n } else {\n el.find(\".replacement\").remove();\n }\n if (warning) {\n el.find(\".warning\").text(warning);\n } else {\n el.find(\".warning\").remove();\n }\n choicesField = el.find(\".choices\");\n choicesField.html('');\n _.each(choices, function(value, key) {\n value = _.escape(value);\n return choicesField.append(angular.element(\"\"));\n });\n el.on(\"click.confirm-dialog\", \"a.button-green\", debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n currentLoading = _this.loading().target(target).start();\n return defered.resolve({\n selected: choicesField.val(),\n finish: function(ok) {\n if (ok == null) {\n ok = true;\n }\n currentLoading.finish();\n if (ok) {\n return _this.hide(el);\n }\n }\n });\n };\n })(this)));\n el.on(\"click.confirm-dialog\", \"a.button-red\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.reject();\n return _this.hide(el);\n };\n })(this));\n this.lightboxService.open(el);\n return defered.promise;\n };\n\n ConfirmService.prototype.error = function(message) {\n var defered, el;\n defered = this.q.defer();\n el = angular.element(\".lightbox-generic-error\");\n el.find(\"h2.title\").html(message);\n el.on(\"click.confirm-dialog\", \"a.button-green\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.resolve();\n return _this.hide(el);\n };\n })(this));\n el.on(\"click.confirm-dialog\", \"a.close\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.resolve();\n return _this.hide(el);\n };\n })(this));\n this.lightboxService.open(el);\n return defered.promise;\n };\n\n ConfirmService.prototype.success = function(title, message) {\n var defered, el;\n defered = this.q.defer();\n el = angular.element(\".lightbox-generic-success\");\n if (title) {\n el.find(\"h2.title\").html(title);\n }\n if (message) {\n el.find(\"p.message\").html(message);\n }\n el.on(\"click.confirm-dialog\", \"a.button-green\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.resolve();\n return _this.hide(el);\n };\n })(this));\n el.on(\"click.confirm-dialog\", \"a.close\", (function(_this) {\n return function(event) {\n event.preventDefault();\n defered.resolve();\n return _this.hide(el);\n };\n })(this));\n this.lightboxService.open(el);\n return defered.promise;\n };\n\n ConfirmService.prototype.loader = function(title, message) {\n var el;\n el = angular.element(\".lightbox-generic-loading\");\n if (title) {\n el.find(\"h2.title\").html(title);\n }\n if (message) {\n el.find(\"p.message\").html(message);\n }\n return {\n start: (function(_this) {\n return function() {\n return _this.lightboxService.open(el);\n };\n })(this),\n stop: (function(_this) {\n return function() {\n return _this.lightboxService.close(el);\n };\n })(this),\n update: (function(_this) {\n return function(status, title, message, percent) {\n if (title) {\n el.find(\"h2.title\").html(title);\n }\n if (message) {\n el.find(\"p.message\").html(message);\n }\n if (percent) {\n el.find(\".spin\").addClass(\"hidden\");\n el.find(\".progress-bar-wrapper\").removeClass(\"hidden\");\n el.find(\".progress-bar-wrapper > .bar\").width(percent + '%');\n return el.find(\".progress-bar-wrapper > span\").html(percent + '%').css('left', (percent - 9) + '%');\n } else {\n el.find(\".spin\").removeClass(\"hidden\");\n return el.find(\".progress-bar-wrapper\").addClass(\"hidden\");\n }\n };\n })(this)\n };\n };\n\n ConfirmService.prototype.notify = function(type, message, title, time) {\n var body, el, selector;\n selector = \".notification-message-\" + type;\n el = angular.element(selector);\n if (el.hasClass(\"active\")) {\n return;\n }\n if (title) {\n el.find(\"h4\").html(title);\n } else {\n el.find(\"h4\").html(this.translate.instant(NOTIFICATION_MSG[type].title));\n }\n if (message) {\n el.find(\"p\").html(message);\n } else {\n el.find(\"p\").html(this.translate.instant(NOTIFICATION_MSG[type].message));\n }\n body = angular.element(\"body\");\n body.find(\".notification-message .notification-light\").removeClass('active').addClass('inactive');\n body.find(selector).removeClass('inactive').addClass('active');\n if (this.tsem) {\n cancelTimeout(this.tsem);\n }\n if (!time) {\n time = type === 'error' || type === 'light-error' ? 3500 : 1500;\n }\n this.tsem = timeout(time, (function(_this) {\n return function() {\n body.find(selector).removeClass('active').addClass('inactive');\n return delete _this.tsem;\n };\n })(this));\n return el.on(\"click\", \".icon-delete, .close\", (function(_this) {\n return function(event) {\n return body.find(selector).removeClass('active').addClass('inactive');\n };\n })(this));\n };\n\n return ConfirmService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaCommon\");\n\n module.service(\"$tgConfirm\", ConfirmService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/custom-field-values.coffee\n */\n\n(function() {\n var CustomAttributeValueDirective, CustomAttributesValuesController, CustomAttributesValuesDirective, DATE_TYPE, MULTILINE_TYPE, TEXT_TYPE, TYPE_CHOICES, bindMethods, bindOnce, debounce, generateHash, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n bindMethods = this.taiga.bindMethods;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n generateHash = taiga.generateHash;\n\n module = angular.module(\"taigaCommon\");\n\n TEXT_TYPE = \"text\";\n\n MULTILINE_TYPE = \"multiline\";\n\n DATE_TYPE = \"date\";\n\n TYPE_CHOICES = [\n {\n key: TEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT\"\n }, {\n key: MULTILINE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI\"\n }, {\n key: DATE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE\"\n }\n ];\n\n CustomAttributesValuesController = (function(superClass) {\n extend(CustomAttributesValuesController, superClass);\n\n CustomAttributesValuesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$q\"];\n\n function CustomAttributesValuesController(scope, rootscope, repo, rs, confirm, q) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.rs = rs;\n this.confirm = confirm;\n this.q = q;\n bindMethods(this);\n this.type = null;\n this.objectId = null;\n this.projectId = null;\n this.customAttributes = [];\n this.customAttributesValues = null;\n }\n\n CustomAttributesValuesController.prototype.initialize = function(type, objectId) {\n this.project = this.scope.project;\n this.type = type;\n this.objectId = objectId;\n return this.projectId = this.scope.projectId;\n };\n\n CustomAttributesValuesController.prototype.loadCustomAttributesValues = function() {\n if (!this.objectId) {\n return this.customAttributesValues;\n }\n return this.rs.customAttributesValues[this.type].get(this.objectId).then((function(_this) {\n return function(customAttributesValues) {\n _this.customAttributes = _this.project[_this.type + \"_custom_attributes\"];\n _this.customAttributesValues = customAttributesValues;\n return customAttributesValues;\n };\n })(this));\n };\n\n CustomAttributesValuesController.prototype.getAttributeValue = function(attribute) {\n var attributeValue;\n attributeValue = _.clone(attribute, false);\n attributeValue.value = this.customAttributesValues.attributes_values[attribute.id];\n return attributeValue;\n };\n\n CustomAttributesValuesController.prototype.updateAttributeValue = function(attributeValue) {\n var attributesValues, onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n return _this.rootscope.$broadcast(\"custom-attributes-values:edit\");\n };\n })(this);\n onError = (function(_this) {\n return function(response) {\n _this.confirm.notify(\"error\");\n return _this.q.reject();\n };\n })(this);\n attributesValues = _.clone(this.customAttributesValues.attributes_values, true);\n attributesValues[attributeValue.id] = attributeValue.value;\n this.customAttributesValues.attributes_values = attributesValues;\n this.customAttributesValues.id = this.objectId;\n return this.repo.save(this.customAttributesValues).then(onSuccess, onError);\n };\n\n return CustomAttributesValuesController;\n\n })(taiga.Controller);\n\n CustomAttributesValuesDirective = function($templates, $storage) {\n var collapsedHash, link, template, templateFn;\n template = $templates.get(\"custom-attributes/custom-attributes-values.html\", true);\n collapsedHash = function(type) {\n return generateHash([\"custom-attributes-collapsed\", type]);\n };\n link = function($scope, $el, $attrs, $ctrls) {\n var $ctrl, $model;\n $ctrl = $ctrls[0];\n $model = $ctrls[1];\n bindOnce($scope, $attrs.ngModel, function(value) {\n $ctrl.initialize($attrs.type, value.id);\n return $ctrl.loadCustomAttributesValues();\n });\n $el.on(\"click\", \".custom-fields-header a\", function() {\n var collapsed, hash;\n hash = collapsedHash($attrs.type);\n collapsed = !($storage.get(hash) || false);\n $storage.set(hash, collapsed);\n if (collapsed) {\n $el.find(\".custom-fields-header a\").removeClass(\"open\");\n return $el.find(\".custom-fields-body\").removeClass(\"open\");\n } else {\n $el.find(\".custom-fields-header a\").addClass(\"open\");\n return $el.find(\".custom-fields-body\").addClass(\"open\");\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n templateFn = function($el, $attrs) {\n var collapsed;\n collapsed = $storage.get(collapsedHash($attrs.type)) || false;\n return template({\n requiredEditionPerm: $attrs.requiredEditionPerm,\n collapsed: collapsed\n });\n };\n return {\n require: [\"tgCustomAttributesValues\", \"ngModel\"],\n controller: CustomAttributesValuesController,\n controllerAs: \"ctrl\",\n restrict: \"AE\",\n scope: true,\n link: link,\n template: templateFn\n };\n };\n\n module.directive(\"tgCustomAttributesValues\", [\"$tgTemplate\", \"$tgStorage\", \"$translate\", CustomAttributesValuesDirective]);\n\n CustomAttributeValueDirective = function($template, $selectedText, $compile, $translate, datePickerConfigService) {\n var link, template, templateEdit;\n template = $template.get(\"custom-attributes/custom-attribute-value.html\", true);\n templateEdit = $template.get(\"custom-attributes/custom-attribute-value-edit.html\", true);\n link = function($scope, $el, $attrs, $ctrl) {\n var attributeValue, isEditable, prettyDate, render, setFocusAndSelectOnInputField, submit;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n render = function(attributeValue, edit) {\n var ctx, datePickerConfig, editable, html, value;\n if (edit == null) {\n edit = false;\n }\n if (attributeValue.type === DATE_TYPE && attributeValue.value) {\n value = moment(attributeValue.value, \"YYYY-MM-DD\").format(prettyDate);\n } else {\n value = attributeValue.value;\n }\n editable = isEditable();\n ctx = {\n id: attributeValue.id,\n name: attributeValue.name,\n description: attributeValue.description,\n value: value,\n isEditable: editable,\n type: attributeValue.type\n };\n if (editable && (edit || !value)) {\n html = templateEdit(ctx);\n html = $compile(html)($scope);\n $el.html(html);\n if (attributeValue.type === DATE_TYPE) {\n datePickerConfig = datePickerConfigService.get();\n _.merge(datePickerConfig, {\n field: $el.find(\"input[name=value]\")[0],\n onSelect: (function(_this) {\n return function(date) {\n var selectedDate;\n return selectedDate = date;\n };\n })(this),\n onOpen: (function(_this) {\n return function() {\n if (typeof selectedDate !== \"undefined\" && selectedDate !== null) {\n return $el.picker.setDate(selectedDate);\n }\n };\n })(this)\n });\n return $el.picker = new Pikaday(datePickerConfig);\n }\n } else {\n html = template(ctx);\n html = $compile(html)($scope);\n return $el.html(html);\n }\n };\n isEditable = function() {\n var permissions, requiredEditionPerm;\n permissions = $scope.project.my_permissions;\n requiredEditionPerm = $attrs.requiredEditionPerm;\n return permissions.indexOf(requiredEditionPerm) > -1;\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n event.preventDefault();\n attributeValue.value = $el.find(\"input[name=value], textarea[name='value']\").val();\n if (attributeValue.type === DATE_TYPE) {\n if (moment(attributeValue.value, prettyDate).isValid()) {\n attributeValue.value = moment(attributeValue.value, prettyDate).format(\"YYYY-MM-DD\");\n } else {\n attributeValue.value = \"\";\n }\n }\n return $scope.$apply(function() {\n return $ctrl.updateAttributeValue(attributeValue).then(function() {\n return render(attributeValue, false);\n });\n });\n };\n })(this));\n setFocusAndSelectOnInputField = function() {\n return $el.find(\"input[name='value'], textarea[name='value']\").focus().select();\n };\n attributeValue = $scope.$eval($attrs.tgCustomAttributeValue);\n render(attributeValue);\n $el.on(\"click\", \".js-value-view-mode\", function() {\n if (!isEditable()) {\n return;\n }\n if ($selectedText.get().length) {\n return;\n }\n render(attributeValue, true);\n return setFocusAndSelectOnInputField();\n });\n $el.on(\"click\", \"a.icon-edit\", function(event) {\n event.preventDefault();\n render(attributeValue, true);\n return setFocusAndSelectOnInputField();\n });\n $el.on(\"keyup\", \"input[name=value], textarea[name='value']\", function(event) {\n if (event.keyCode === 13 && event.currentTarget.type !== \"textarea\") {\n return submit(event);\n } else if (event.keyCode === 27) {\n return render(attributeValue, false);\n }\n });\n $el.on(\"submit\", \"form\", submit);\n $el.on(\"click\", \"a.icon-floppy\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"^tgCustomAttributesValues\",\n restrict: \"AE\"\n };\n };\n\n module.directive(\"tgCustomAttributeValue\", [\"$tgTemplate\", \"$selectedText\", \"$compile\", \"$translate\", \"tgDatePickerConfigService\", CustomAttributeValueDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/estimation.coffee\n */\n\n(function() {\n var EstimationsService, LbUsEstimationDirective, UsEstimationDirective, groupBy, module, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n module = angular.module(\"taigaCommon\");\n\n LbUsEstimationDirective = function($tgEstimationsService, $rootScope, $repo, $template, $compile) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n $scope.$watch($attrs.ngModel, function(us) {\n var estimationProcess;\n if (us) {\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project);\n estimationProcess.onSelectedPointForRole = function(roleId, pointId) {\n return $scope.$apply(function() {\n return $model.$setViewValue(us);\n });\n };\n estimationProcess.render = function() {\n var ctx, html, mainTemplate, template;\n ctx = {\n totalPoints: this.calculateTotalPoints(),\n roles: this.calculateRoles(),\n editable: this.isEditable\n };\n mainTemplate = \"common/estimation/us-estimation-points-per-role.html\";\n template = $template.get(mainTemplate, true);\n html = template(ctx);\n html = $compile(html)($scope);\n return this.$el.html(html);\n };\n return estimationProcess.render();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgLbUsEstimation\", [\"$tgEstimationsService\", \"$rootScope\", \"$tgRepo\", \"$tgTemplate\", \"$compile\", LbUsEstimationDirective]);\n\n UsEstimationDirective = function($tgEstimationsService, $rootScope, $repo, $qqueue, $template, $compile) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n $scope.$watch($attrs.ngModel, function(us) {\n var estimationProcess;\n if (us) {\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project);\n estimationProcess.onSelectedPointForRole = function(roleId, pointId) {\n return this.save(roleId, pointId).then(function() {\n return $rootScope.$broadcast(\"object:updated\");\n });\n };\n estimationProcess.render = function() {\n var ctx, html, mainTemplate, template;\n ctx = {\n totalPoints: this.calculateTotalPoints(),\n roles: this.calculateRoles(),\n editable: this.isEditable\n };\n mainTemplate = \"common/estimation/us-estimation-points-per-role.html\";\n template = $template.get(mainTemplate, true);\n html = template(ctx);\n html = $compile(html)($scope);\n return this.$el.html(html);\n };\n return estimationProcess.render();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsEstimation\", [\"$tgEstimationsService\", \"$rootScope\", \"$tgRepo\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", UsEstimationDirective]);\n\n EstimationsService = function($template, $qqueue, $repo, $confirm, $q) {\n var EstimationProcess, create, pointsTemplate;\n pointsTemplate = $template.get(\"common/estimation/us-estimation-points.html\", true);\n EstimationProcess = (function() {\n function EstimationProcess($el1, us1, project1) {\n this.$el = $el1;\n this.us = us1;\n this.project = project1;\n this.bindClickEvents = bind(this.bindClickEvents, this);\n this.isEditable = this.project.my_permissions.indexOf(\"modify_us\") !== -1;\n this.roles = this.project.roles;\n this.points = this.project.points;\n this.pointsById = groupBy(this.points, function(x) {\n return x.id;\n });\n this.onSelectedPointForRole = function(roleId, pointId) {};\n this.render = function() {};\n }\n\n EstimationProcess.prototype.save = function(roleId, pointId) {\n var deferred;\n deferred = $q.defer();\n $qqueue.add((function(_this) {\n return function() {\n var onError, onSuccess;\n onSuccess = function() {\n return deferred.resolve();\n };\n onError = function() {\n $confirm.notify(\"error\");\n _this.us.revert();\n _this.render();\n return deferred.reject();\n };\n return $repo.save(_this.us).then(onSuccess, onError);\n };\n })(this));\n return deferred.promise;\n };\n\n EstimationProcess.prototype.calculateTotalPoints = function() {\n var notNullValues, values;\n values = _.map(this.us.points, (function(_this) {\n return function(v, k) {\n var ref;\n return (ref = _this.pointsById[v]) != null ? ref.value : void 0;\n };\n })(this));\n if (values.length === 0) {\n return \"0\";\n }\n notNullValues = _.filter(values, function(v) {\n return v != null;\n });\n if (notNullValues.length === 0) {\n return \"?\";\n }\n return _.reduce(notNullValues, function(acc, num) {\n return acc + num;\n });\n };\n\n EstimationProcess.prototype.calculateRoles = function() {\n var computableRoles, roles;\n computableRoles = _.filter(this.project.roles, \"computable\");\n roles = _.map(computableRoles, (function(_this) {\n return function(role) {\n var pointId, pointObj;\n pointId = _this.us.points[role.id];\n pointObj = _this.pointsById[pointId];\n role = _.clone(role, true);\n role.points = (pointObj != null) && (pointObj.name != null) ? pointObj.name : \"?\";\n return role;\n };\n })(this));\n return roles;\n };\n\n EstimationProcess.prototype.bindClickEvents = function() {\n this.$el.on(\"click\", \".total.clickable\", (function(_this) {\n return function(event) {\n var roleId, target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n roleId = target.data(\"role-id\");\n _this.renderPointsSelector(roleId, target);\n target.siblings().removeClass('active');\n return target.addClass('active');\n };\n })(this));\n return this.$el.on(\"click\", \".point\", (function(_this) {\n return function(event) {\n var pointId, points, roleId, target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n roleId = target.data(\"role-id\");\n pointId = target.data(\"point-id\");\n _this.$el.find(\".popover\").popover().close();\n points = _.clone(_this.us.points, true);\n points[roleId] = pointId;\n _this.us.points = points;\n _this.render();\n return _this.onSelectedPointForRole(roleId, pointId);\n };\n })(this));\n };\n\n EstimationProcess.prototype.renderPointsSelector = function(roleId, target) {\n var horizontalList, html, maxPointLength, points, pop;\n points = _.map(this.points, (function(_this) {\n return function(point) {\n point = _.clone(point, true);\n point.selected = _this.us.points[roleId] === point.id ? false : true;\n return point;\n };\n })(this));\n maxPointLength = 5;\n horizontalList = _.some(points, (function(_this) {\n return function(point) {\n return point.name.length > maxPointLength;\n };\n })(this));\n html = pointsTemplate({\n \"points\": points,\n roleId: roleId,\n horizontal: horizontalList\n });\n this.$el.find(\".popover\").popover().close();\n this.$el.find(\".pop-points-open\").remove();\n if (target != null) {\n this.$el.find(target).append(html);\n } else {\n this.$el.append(html);\n }\n this.$el.find(\".pop-points-open\").popover().open(function() {\n return $(this).removeClass(\"active\").closest(\"li\").removeClass(\"active\");\n });\n this.$el.find(\".pop-points-open\").show();\n pop = this.$el.find(\".pop-points-open\");\n if (pop.offset().top + pop.height() > document.body.clientHeight) {\n return pop.addClass('pop-bottom');\n }\n };\n\n return EstimationProcess;\n\n })();\n create = function($el, us, project) {\n var estimationProcess;\n $el.unbind(\"click\");\n estimationProcess = new EstimationProcess($el, us, project);\n if (estimationProcess.isEditable) {\n estimationProcess.bindClickEvents();\n }\n return estimationProcess;\n };\n return {\n create: create\n };\n };\n\n module.factory(\"$tgEstimationsService\", [\"$tgTemplate\", \"$tgQqueue\", \"$tgRepo\", \"$tgConfirm\", \"$q\", EstimationsService]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/filters.coffee\n */\n\n(function() {\n var defaultFilter, module, momentFormat, momentFromNow, sizeFormat, taiga, unslugify, yesNoFilter;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\");\n\n defaultFilter = function() {\n return function(value, defaultValue) {\n if (value === [null, void 0]) {\n return defaultValue;\n }\n return value;\n };\n };\n\n module.filter(\"default\", defaultFilter);\n\n yesNoFilter = function($translate) {\n return function(value) {\n if (value) {\n return $translate.instant(\"COMMON.YES\");\n }\n return $translate.instant(\"COMMON.NO\");\n };\n };\n\n module.filter(\"yesNo\", [\"$translate\", yesNoFilter]);\n\n unslugify = function() {\n return taiga.unslugify;\n };\n\n module.filter(\"unslugify\", unslugify);\n\n momentFormat = function() {\n return function(input, format) {\n if (input) {\n return moment(input).format(format);\n }\n return \"\";\n };\n };\n\n module.filter(\"momentFormat\", momentFormat);\n\n momentFromNow = function() {\n return function(input, without_suffix) {\n if (input) {\n return moment(input).fromNow(without_suffix || false);\n }\n return \"\";\n };\n };\n\n module.filter(\"momentFromNow\", momentFromNow);\n\n sizeFormat = (function(_this) {\n return function() {\n return _this.taiga.sizeFormat;\n };\n })(this);\n\n module.filter(\"sizeFormat\", sizeFormat);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/history.coffee\n */\n\n(function() {\n var HistoryController, HistoryDirective, IGNORED_FIELDS, bindOnce, debounce, module, taiga, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n trim = this.taiga.trim;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaCommon\");\n\n IGNORED_FIELDS = {\n \"userstories.userstory\": [\"watchers\", \"kanban_order\", \"backlog_order\", \"sprint_order\", \"finish_date\", \"tribe_gig\"],\n \"tasks.task\": [\"watchers\", \"us_order\", \"taskboard_order\"],\n \"issues.issue\": [\"watchers\"]\n };\n\n HistoryController = (function(superClass) {\n extend(HistoryController, superClass);\n\n HistoryController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\"];\n\n function HistoryController(scope, repo, rs) {\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n }\n\n HistoryController.prototype.initialize = function(type, objectId) {\n this.type = type;\n return this.objectId = objectId;\n };\n\n HistoryController.prototype.loadHistory = function(type, objectId) {\n return this.rs.history.get(type, objectId).then((function(_this) {\n return function(history) {\n var changeModel, historyEntry, historyResult, i, j, len, len1;\n for (i = 0, len = history.length; i < len; i++) {\n historyResult = history[i];\n if (historyResult.values_diff.description_diff != null) {\n historyResult.values_diff.description = historyResult.values_diff.description_diff;\n }\n delete historyResult.values_diff.description_html;\n delete historyResult.values_diff.description_diff;\n if (historyResult.values_diff.blocked_note_diff != null) {\n historyResult.values_diff.blocked_note = historyResult.values_diff.blocked_note_diff;\n }\n delete historyResult.values_diff.blocked_note_html;\n delete historyResult.values_diff.blocked_note_diff;\n }\n for (j = 0, len1 = history.length; j < len1; j++) {\n historyEntry = history[j];\n changeModel = historyEntry.key.split(\":\")[0];\n if (IGNORED_FIELDS[changeModel] != null) {\n historyEntry.values_diff = _.removeKeys(historyEntry.values_diff, IGNORED_FIELDS[changeModel]);\n }\n }\n _this.scope.history = _.filter(history, function(item) {\n return Object.keys(item.values_diff).length > 0;\n });\n return _this.scope.comments = _.filter(history, function(item) {\n return item.comment !== \"\";\n });\n };\n })(this));\n };\n\n HistoryController.prototype.deleteComment = function(type, objectId, activityId) {\n return this.rs.history.deleteComment(type, objectId, activityId).then((function(_this) {\n return function() {\n return _this.loadHistory(type, objectId);\n };\n })(this));\n };\n\n HistoryController.prototype.undeleteComment = function(type, objectId, activityId) {\n return this.rs.history.undeleteComment(type, objectId, activityId).then((function(_this) {\n return function() {\n return _this.loadHistory(type, objectId);\n };\n })(this));\n };\n\n return HistoryController;\n\n })(taiga.Controller);\n\n HistoryDirective = function($log, $loading, $qqueue, $template, $confirm, $translate, $compile, $navUrls, $rootScope) {\n var link, templateActivity, templateBase, templateBaseEntries, templateChangeAttachment, templateChangeDiff, templateChangeGeneric, templateChangeList, templateChangePoints, templateDeletedComment, templateFn;\n templateChangeDiff = $template.get(\"common/history/history-change-diff.html\", true);\n templateChangePoints = $template.get(\"common/history/history-change-points.html\", true);\n templateChangeGeneric = $template.get(\"common/history/history-change-generic.html\", true);\n templateChangeAttachment = $template.get(\"common/history/history-change-attachment.html\", true);\n templateChangeList = $template.get(\"common/history/history-change-list.html\", true);\n templateDeletedComment = $template.get(\"common/history/history-deleted-comment.html\", true);\n templateActivity = $template.get(\"common/history/history-activity.html\", true);\n templateBaseEntries = $template.get(\"common/history/history-base-entries.html\", true);\n templateBase = $template.get(\"common/history/history-base.html\", true);\n link = function($scope, $el, $attrs, $ctrl) {\n var countChanges, formatChange, getHumanizedFieldName, getPrettyDateFormat, objectId, renderActivity, renderAttachmentEntry, renderChange, renderChangeEntries, renderChangeEntry, renderChangesHelperText, renderComment, renderComments, renderCustomAttributesEntry, renderHistory, save, showAllActivity, showAllComments, type;\n type = $attrs.type;\n objectId = null;\n showAllComments = false;\n showAllActivity = false;\n getPrettyDateFormat = function() {\n return $translate.instant(\"ACTIVITY.DATETIME\");\n };\n bindOnce($scope, $attrs.ngModel, function(model) {\n type = $attrs.type;\n objectId = model.id;\n $ctrl.initialize(type, objectId);\n return $ctrl.loadHistory(type, objectId);\n });\n getHumanizedFieldName = function(field) {\n var humanizedFieldNames;\n humanizedFieldNames = {\n subject: $translate.instant(\"ACTIVITY.FIELDS.SUBJECT\"),\n name: $translate.instant(\"ACTIVITY.FIELDS.NAME\"),\n description: $translate.instant(\"ACTIVITY.FIELDS.DESCRIPTION\"),\n content: $translate.instant(\"ACTIVITY.FIELDS.CONTENT\"),\n status: $translate.instant(\"ACTIVITY.FIELDS.STATUS\"),\n is_closed: $translate.instant(\"ACTIVITY.FIELDS.IS_CLOSED\"),\n finish_date: $translate.instant(\"ACTIVITY.FIELDS.FINISH_DATE\"),\n type: $translate.instant(\"ACTIVITY.FIELDS.TYPE\"),\n priority: $translate.instant(\"ACTIVITY.FIELDS.PRIORITY\"),\n severity: $translate.instant(\"ACTIVITY.FIELDS.SEVERITY\"),\n assigned_to: $translate.instant(\"ACTIVITY.FIELDS.ASSIGNED_TO\"),\n watchers: $translate.instant(\"ACTIVITY.FIELDS.WATCHERS\"),\n milestone: $translate.instant(\"ACTIVITY.FIELDS.MILESTONE\"),\n user_story: $translate.instant(\"ACTIVITY.FIELDS.USER_STORY\"),\n project: $translate.instant(\"ACTIVITY.FIELDS.PROJECT\"),\n is_blocked: $translate.instant(\"ACTIVITY.FIELDS.IS_BLOCKED\"),\n blocked_note: $translate.instant(\"ACTIVITY.FIELDS.BLOCKED_NOTE\"),\n points: $translate.instant(\"ACTIVITY.FIELDS.POINTS\"),\n client_requirement: $translate.instant(\"ACTIVITY.FIELDS.CLIENT_REQUIREMENT\"),\n team_requirement: $translate.instant(\"ACTIVITY.FIELDS.TEAM_REQUIREMENT\"),\n is_iocaine: $translate.instant(\"ACTIVITY.FIELDS.IS_IOCAINE\"),\n tags: $translate.instant(\"ACTIVITY.FIELDS.TAGS\"),\n attachments: $translate.instant(\"ACTIVITY.FIELDS.ATTACHMENTS\"),\n is_deprecated: $translate.instant(\"ACTIVITY.FIELDS.IS_DEPRECATED\"),\n blocked_note: $translate.instant(\"ACTIVITY.FIELDS.BLOCKED_NOTE\"),\n is_blocked: $translate.instant(\"ACTIVITY.FIELDS.IS_BLOCKED\"),\n order: $translate.instant(\"ACTIVITY.FIELDS.ORDER\"),\n backlog_order: $translate.instant(\"ACTIVITY.FIELDS.BACKLOG_ORDER\"),\n sprint_order: $translate.instant(\"ACTIVITY.FIELDS.SPRINT_ORDER\"),\n kanban_order: $translate.instant(\"ACTIVITY.FIELDS.KANBAN_ORDER\"),\n taskboard_order: $translate.instant(\"ACTIVITY.FIELDS.TASKBOARD_ORDER\"),\n us_order: $translate.instant(\"ACTIVITY.FIELDS.US_ORDER\")\n };\n return humanizedFieldNames[field] || field;\n };\n countChanges = function(comment) {\n return _.keys(comment.values_diff).length;\n };\n formatChange = function(change) {\n if (_.isArray(change)) {\n if (change.length === 0) {\n return $translate.instant(\"ACTIVITY.VALUES.EMPTY\");\n }\n return change.join(\", \");\n }\n if (change === \"\") {\n return $translate.instant(\"ACTIVITY.VALUES.EMPTY\");\n }\n if ((change == null) || change === false) {\n return $translate.instant(\"ACTIVITY.VALUES.NO\");\n }\n if (change === true) {\n return $translate.instant(\"ACTIVITY.VALUES.YES\");\n }\n return change;\n };\n renderAttachmentEntry = function(value) {\n var attachments;\n attachments = _.map(value, function(changes, type) {\n if (type === \"new\") {\n return _.map(changes, function(change) {\n return templateChangeDiff({\n name: $translate.instant(\"ACTIVITY.NEW_ATTACHMENT\"),\n diff: change.filename\n });\n });\n } else if (type === \"deleted\") {\n return _.map(changes, function(change) {\n return templateChangeDiff({\n name: $translate.instant(\"ACTIVITY.DELETED_ATTACHMENT\"),\n diff: change.filename\n });\n });\n } else {\n return _.map(changes, function(change) {\n var diff, name;\n name = $translate.instant(\"ACTIVITY.UPDATED_ATTACHMENT\", {\n filename: change.filename\n });\n diff = _.map(change.changes, function(values, name) {\n return {\n name: getHumanizedFieldName(name),\n from: formatChange(values[0]),\n to: formatChange(values[1])\n };\n });\n return templateChangeAttachment({\n name: name,\n diff: diff\n });\n });\n }\n });\n return _.flatten(attachments).join(\"\\n\");\n };\n renderCustomAttributesEntry = function(value) {\n var customAttributes;\n customAttributes = _.map(value, function(changes, type) {\n if (type === \"new\") {\n return _.map(changes, function(change) {\n var html;\n html = templateChangeGeneric({\n name: change.name,\n from: formatChange(\"\"),\n to: formatChange(change.value)\n });\n html = $compile(html)($scope);\n return html[0].outerHTML;\n });\n } else if (type === \"deleted\") {\n return _.map(changes, function(change) {\n return templateChangeDiff({\n name: $translate.instant(\"ACTIVITY.DELETED_CUSTOM_ATTRIBUTE\"),\n diff: change.name\n });\n });\n } else {\n return _.map(changes, function(change) {\n var customAttrsChanges;\n customAttrsChanges = _.map(change.changes, function(values) {\n return templateChangeGeneric({\n name: change.name,\n from: formatChange(values[0]),\n to: formatChange(values[1])\n });\n });\n return _.flatten(customAttrsChanges).join(\"\\n\");\n });\n }\n });\n return _.flatten(customAttributes).join(\"\\n\");\n };\n renderChangeEntry = function(field, value) {\n var added, from, html, name, removed, to;\n if (field === \"description\") {\n return templateChangeDiff({\n name: getHumanizedFieldName(\"description\"),\n diff: value[1]\n });\n } else if (field === \"blocked_note\") {\n return templateChangeDiff({\n name: getHumanizedFieldName(\"blocked_note\"),\n diff: value[1]\n });\n } else if (field === \"points\") {\n html = templateChangePoints({\n points: value\n });\n html = $compile(html)($scope);\n return html[0].outerHTML;\n } else if (field === \"attachments\") {\n return renderAttachmentEntry(value);\n } else if (field === \"custom_attributes\") {\n return renderCustomAttributesEntry(value);\n } else if (field === \"tags\" || field === \"watchers\") {\n name = getHumanizedFieldName(field);\n removed = _.difference(value[0], value[1]);\n added = _.difference(value[1], value[0]);\n html = templateChangeList({\n name: name,\n removed: removed,\n added: added\n });\n html = $compile(html)($scope);\n return html[0].outerHTML;\n } else if (field === \"assigned_to\") {\n name = getHumanizedFieldName(field);\n from = formatChange(value[0] || $translate.instant(\"ACTIVITY.VALUES.UNASSIGNED\"));\n to = formatChange(value[1] || $translate.instant(\"ACTIVITY.VALUES.UNASSIGNED\"));\n return templateChangeGeneric({\n name: name,\n from: from,\n to: to\n });\n } else {\n name = getHumanizedFieldName(field);\n from = formatChange(value[0]);\n to = formatChange(value[1]);\n return templateChangeGeneric({\n name: name,\n from: from,\n to: to\n });\n }\n };\n renderChangeEntries = function(change) {\n return _.map(change.values_diff, function(value, field) {\n return renderChangeEntry(field, value);\n });\n };\n renderChangesHelperText = function(change) {\n var size;\n size = countChanges(change);\n return $translate.instant(\"ACTIVITY.SIZE_CHANGE\", {\n size: size\n }, 'messageformat');\n };\n renderComment = function(comment) {\n var html, ref, ref1, ref2;\n if (comment.delete_comment_date || ((ref = comment.delete_comment_user) != null ? ref.name : void 0)) {\n html = templateDeletedComment({\n deleteCommentDate: comment.delete_comment_date ? moment(comment.delete_comment_date).format(getPrettyDateFormat()) : void 0,\n deleteCommentUser: comment.delete_comment_user.name,\n deleteComment: comment.comment_html,\n activityId: comment.id,\n canRestoreComment: $scope.user && (comment.delete_comment_user.pk === $scope.user.id || $scope.project.my_permissions.indexOf(\"modify_project\") > -1)\n });\n html = $compile(html)($scope);\n return html[0].outerHTML;\n }\n html = templateActivity({\n avatar: comment.user.photo,\n userFullName: comment.user.name,\n userProfileUrl: comment.user.is_active ? $navUrls.resolve(\"user-profile\", {\n username: comment.user.username\n }) : \"\",\n creationDate: moment(comment.created_at).format(getPrettyDateFormat()),\n comment: comment.comment_html,\n changesText: renderChangesHelperText(comment),\n changes: renderChangeEntries(comment),\n mode: \"comment\",\n deleteCommentActionTitle: $translate.instant(\"COMMENTS.DELETE\"),\n deleteCommentDate: comment.delete_comment_date ? moment(comment.delete_comment_date).format(getPrettyDateFormat()) : void 0,\n deleteCommentUser: ((ref1 = comment.delete_comment_user) != null ? ref1.name : void 0) ? comment.delete_comment_user.name : void 0,\n activityId: comment.id,\n canDeleteComment: comment.user.pk === ((ref2 = $scope.user) != null ? ref2.id : void 0) || $scope.project.my_permissions.indexOf(\"modify_project\") > -1\n });\n html = $compile(html)($scope);\n return html[0].outerHTML;\n };\n renderChange = function(change) {\n var ref;\n return templateActivity({\n avatar: change.user.photo,\n userFullName: change.user.name,\n userProfileUrl: change.user.is_active ? $navUrls.resolve(\"user-profile\", {\n username: change.user.username\n }) : \"\",\n creationDate: moment(change.created_at).format(getPrettyDateFormat()),\n comment: change.comment_html,\n changes: renderChangeEntries(change),\n changesText: \"\",\n mode: \"activity\",\n deleteCommentDate: change.delete_comment_date ? moment(change.delete_comment_date).format(getPrettyDateFormat()) : void 0,\n deleteCommentUser: ((ref = change.delete_comment_user) != null ? ref.name : void 0) ? change.delete_comment_user.name : void 0,\n activityId: change.id\n });\n };\n renderHistory = function(entries, totalEntries) {\n var html, showMore;\n if (entries.length === totalEntries) {\n showMore = 0;\n } else {\n showMore = totalEntries - entries.length;\n }\n html = templateBaseEntries({\n entries: entries,\n showMore: showMore\n });\n html = $compile(html)($scope);\n return html;\n };\n renderComments = function() {\n var comments, html, totalComments;\n comments = $scope.comments || [];\n totalComments = comments.length;\n if (!showAllComments) {\n comments = _.last(comments, 4);\n }\n comments = _.map(comments, function(x) {\n return renderComment(x);\n });\n html = renderHistory(comments, totalComments);\n return $el.find(\".comments-list\").html(html);\n };\n renderActivity = function() {\n var changes, html, totalChanges;\n changes = $scope.history || [];\n totalChanges = changes.length;\n if (!showAllActivity) {\n changes = _.last(changes, 4);\n }\n changes = _.map(changes, function(x) {\n return renderChange(x);\n });\n html = renderHistory(changes, totalChanges);\n return $el.find(\".changes-list\").html(html);\n };\n save = $qqueue.bindAdd((function(_this) {\n return function(target) {\n var currentLoading, model, onError, onSuccess;\n $scope.$broadcast(\"markdown-editor:submit\");\n $el.find(\".comment-list\").addClass(\"activeanimation\");\n currentLoading = $loading().target(target).start();\n onSuccess = function() {\n $rootScope.$broadcast(\"comment:new\");\n return $ctrl.loadHistory(type, objectId)[\"finally\"](function() {\n return currentLoading.finish();\n });\n };\n onError = function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n };\n model = $scope.$eval($attrs.ngModel);\n return $ctrl.repo.save(model).then(onSuccess, onError);\n };\n })(this));\n $scope.$watch(\"comments\", renderComments);\n $scope.$watch(\"history\", renderActivity);\n $scope.$on(\"object:updated\", function() {\n return $ctrl.loadHistory(type, objectId);\n });\n $el.on(\"click\", \".add-comment button.button-green\", debounce(2000, function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return save(target);\n }));\n $el.on(\"click\", \"a\", function(event) {\n var href, target;\n target = angular.element(event.target);\n href = target.attr('href');\n if (href && href.indexOf(\"#\") === 0) {\n event.preventDefault();\n return $('body').scrollTop($(href).offset().top);\n }\n });\n $el.on(\"click\", \".show-more\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n if (target.parent().is(\".changes-list\")) {\n showAllActivity = !showAllActivity;\n return renderActivity();\n } else {\n showAllComments = !showAllComments;\n return renderComments();\n }\n });\n $el.on(\"click\", \".show-deleted-comment\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n target.parents('.activity-single').find('.hide-deleted-comment').show();\n target.parents('.activity-single').find('.show-deleted-comment').hide();\n return target.parents('.activity-single').find('.comment-body').show();\n });\n $el.on(\"click\", \".hide-deleted-comment\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n target.parents('.activity-single').find('.hide-deleted-comment').hide();\n target.parents('.activity-single').find('.show-deleted-comment').show();\n return target.parents('.activity-single').find('.comment-body').hide();\n });\n $el.on(\"click\", \".changes-title\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return target.parent().find(\".change-entry\").toggleClass(\"active\");\n });\n $el.on(\"focus\", \".add-comment textarea\", function(event) {\n return $(this).addClass('active');\n });\n $el.on(\"click\", \".history-tabs li a\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n $el.find(\".history-tabs li a\").removeClass(\"active\");\n target.addClass(\"active\");\n $el.find(\".history section\").addClass(\"hidden\");\n return $el.find(\".history section.\" + (target.data('section-class'))).removeClass(\"hidden\");\n });\n $el.on(\"click\", \".comment-delete\", debounce(2000, function(event) {\n var activityId, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n activityId = target.data('activity-id');\n return $ctrl.deleteComment(type, objectId, activityId);\n }));\n $el.on(\"click\", \".comment-restore\", debounce(2000, function(event) {\n var activityId, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n activityId = target.data('activity-id');\n return $ctrl.undeleteComment(type, objectId, activityId);\n }));\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n templateFn = function($el, $attrs) {\n var html;\n html = templateBase({\n ngmodel: $attrs.ngModel,\n type: $attrs.type,\n mode: $attrs.mode\n });\n return html;\n };\n return {\n controller: HistoryController,\n template: templateFn,\n restrict: \"AE\",\n link: link\n };\n };\n\n module.directive(\"tgHistory\", [\"$log\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$tgConfirm\", \"$translate\", \"$compile\", \"$tgNavUrls\", \"$rootScope\", HistoryDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/importer.coffee\n */\n\n(function() {\n var ImportProjectButtonDirective, module;\n\n module = angular.module(\"taigaCommon\");\n\n ImportProjectButtonDirective = function($rs, $confirm, $location, $navUrls, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n $el.on(\"click\", \".import-project-button\", function(event) {\n event.preventDefault();\n $el.find(\"input.import-file\").val(\"\");\n return $el.find(\"input.import-file\").trigger(\"click\");\n });\n return $el.on(\"change\", \"input.import-file\", function(event) {\n var file, loader, onError, onSuccess;\n event.preventDefault();\n file = event.target.files[0];\n if (!file) {\n return;\n }\n loader = $confirm.loader($translate.instant(\"PROJECT.IMPORT.UPLOADING_FILE\"));\n onSuccess = function(result) {\n var ctx, message, msg, title;\n loader.stop();\n if (result.status === 202) {\n title = $translate.instant(\"PROJECT.IMPORT.ASYNC_IN_PROGRESS_TITLE\");\n message = $translate.instant(\"PROJECT.IMPORT.ASYNC_IN_PROGRESS_MESSAGE\");\n return $confirm.success(title, message);\n } else {\n ctx = {\n project: result.data.slug\n };\n $location.path($navUrls.resolve(\"project-admin-project-profile-details\", ctx));\n msg = $translate.instant(\"PROJECT.IMPORT.SYNC_SUCCESS\");\n return $confirm.notify(\"success\", msg);\n }\n };\n onError = function(result) {\n var errorMsg, ref;\n loader.stop();\n errorMsg = $translate.instant(\"PROJECT.IMPORT.ERROR\");\n if (result.status === 429) {\n errorMsg = $translate.instant(\"PROJECT.IMPORT.ERROR_TOO_MANY_REQUEST\");\n } else if ((ref = result.data) != null ? ref._error_message : void 0) {\n errorMsg = $translate.instant(\"PROJECT.IMPORT.ERROR_MESSAGE\", {\n error_message: result.data._error_message\n });\n }\n return $confirm.notify(\"error\", errorMsg);\n };\n loader.start();\n return $rs.projects[\"import\"](file, loader.update).then(onSuccess, onError);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgImportProjectButton\", [\"$tgResources\", \"$tgConfirm\", \"$location\", \"$tgNavUrls\", \"$translate\", ImportProjectButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/lightboxes.coffee\n */\n\n(function() {\n var AssignedToLightboxDirective, AttachmentPreviewLightboxDirective, BlockLightboxDirective, BlockingMessageInputDirective, CreateBulkUserstoriesDirective, CreateEditUserstoryDirective, LightboxDirective, LightboxKeyboardNavigationService, LightboxService, WatchersLightboxDirective, bindOnce, debounce, module, sizeFormat, timeout,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n module = angular.module(\"taigaCommon\");\n\n bindOnce = this.taiga.bindOnce;\n\n timeout = this.taiga.timeout;\n\n debounce = this.taiga.debounce;\n\n sizeFormat = this.taiga.sizeFormat;\n\n LightboxService = (function(superClass) {\n extend(LightboxService, superClass);\n\n function LightboxService(animationFrame, q) {\n this.animationFrame = animationFrame;\n this.q = q;\n }\n\n LightboxService.prototype.open = function($el) {\n var defered, docEl, lightboxContent;\n defered = this.q.defer();\n lightboxContent = $el.children().not(\".close\");\n lightboxContent.hide();\n this.animationFrame.add(function() {\n return $el.css('display', 'flex');\n });\n this.animationFrame.add(function() {\n $el.addClass(\"open\");\n return $el.one(\"transitionend\", (function(_this) {\n return function() {\n return $el.find('input,textarea').first().focus();\n };\n })(this));\n });\n this.animationFrame.add((function(_this) {\n return function() {\n lightboxContent.show();\n return defered.resolve();\n };\n })(this));\n docEl = angular.element(document);\n docEl.on(\"keydown.lightbox\", (function(_this) {\n return function(e) {\n var code;\n code = e.keyCode ? e.keyCode : e.which;\n if (code === 27) {\n return _this.close($el);\n }\n };\n })(this));\n return defered.promise;\n };\n\n LightboxService.prototype.close = function($el) {\n var docEl, scope;\n docEl = angular.element(document);\n docEl.off(\".lightbox\");\n docEl.off(\".keyboard-navigation\");\n $el.one(\"transitionend\", (function(_this) {\n return function() {\n $el.removeAttr('style');\n return $el.removeClass(\"open\").removeClass('close');\n };\n })(this));\n $el.addClass('close');\n if ($el.hasClass(\"remove-on-close\")) {\n scope = $el.data(\"scope\");\n scope.$destroy();\n return $el.remove();\n }\n };\n\n LightboxService.prototype.closeAll = function() {\n var docEl, i, len, lightboxEl, ref, results;\n docEl = angular.element(document);\n ref = docEl.find(\".lightbox.open\");\n results = [];\n for (i = 0, len = ref.length; i < len; i++) {\n lightboxEl = ref[i];\n results.push(this.close($(lightboxEl)));\n }\n return results;\n };\n\n return LightboxService;\n\n })(taiga.Service);\n\n module.service(\"lightboxService\", [\"animationFrame\", \"$q\", LightboxService]);\n\n LightboxKeyboardNavigationService = (function(superClass) {\n extend(LightboxKeyboardNavigationService, superClass);\n\n function LightboxKeyboardNavigationService() {\n return LightboxKeyboardNavigationService.__super__.constructor.apply(this, arguments);\n }\n\n LightboxKeyboardNavigationService.prototype.stop = function() {\n var docEl;\n docEl = angular.element(document);\n return docEl.off(\".keyboard-navigation\");\n };\n\n LightboxKeyboardNavigationService.prototype.dispatch = function($el, code) {\n var activeElement, next, prev;\n activeElement = $el.find(\".selected\");\n if (code === 13) {\n if ($el.find(\".user-list-single\").length === 1) {\n return $el.find('.user-list-single:first').trigger(\"click\");\n } else {\n return activeElement.trigger(\"click\");\n }\n } else if (code === 40) {\n if (!activeElement.length) {\n return $el.find('.user-list-single:not(\".is-active\"):first').addClass('selected');\n } else {\n next = activeElement.next('.user-list-single');\n if (next.length) {\n activeElement.removeClass('selected');\n return next.addClass('selected');\n }\n }\n } else if (code === 38) {\n if (!activeElement.length) {\n return $el.find('.user-list-single:last').addClass('selected');\n } else {\n prev = activeElement.prev('.user-list-single:not(\".is-active\")');\n if (prev.length) {\n activeElement.removeClass('selected');\n return prev.addClass('selected');\n }\n }\n }\n };\n\n LightboxKeyboardNavigationService.prototype.init = function($el) {\n var docEl;\n this.stop();\n docEl = angular.element(document);\n return docEl.on(\"keydown.keyboard-navigation\", (function(_this) {\n return function(event) {\n var code;\n code = event.keyCode ? event.keyCode : event.which;\n if (code === 40 || code === 38 || code === 13) {\n event.preventDefault();\n return _this.dispatch($el, code);\n }\n };\n })(this));\n };\n\n return LightboxKeyboardNavigationService;\n\n })(taiga.Service);\n\n module.service(\"lightboxKeyboardNavigationService\", LightboxKeyboardNavigationService);\n\n LightboxDirective = function(lightboxService) {\n var link;\n link = function($scope, $el, $attrs) {\n return $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n return lightboxService.close($el);\n });\n };\n return {\n restrict: \"C\",\n link: link\n };\n };\n\n module.directive(\"lightbox\", [\"lightboxService\", LightboxDirective]);\n\n BlockLightboxDirective = function($rootscope, $tgrepo, $confirm, lightboxService, $loading, $qqueue, $translate) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var block, title, unblock;\n title = $translate.instant($attrs.title);\n $el.find(\"h2.title\").text(title);\n unblock = $qqueue.bindAdd((function(_this) {\n return function(item, finishCallback) {\n var promise;\n promise = $tgrepo.save(item);\n promise.then(function() {\n $confirm.notify(\"success\");\n $rootscope.$broadcast(\"object:updated\");\n $model.$setViewValue(item);\n return finishCallback();\n });\n promise.then(null, function() {\n $confirm.notify(\"error\");\n item.revert();\n return $model.$setViewValue(item);\n });\n promise[\"finally\"](function() {\n return finishCallback();\n });\n return promise;\n };\n })(this));\n block = $qqueue.bindAdd((function(_this) {\n return function(item) {\n var currentLoading, promise;\n $model.$setViewValue(item);\n currentLoading = $loading().target($el.find(\".button-green\")).start();\n promise = $tgrepo.save($model.$modelValue);\n promise.then(function() {\n $confirm.notify(\"success\");\n return $rootscope.$broadcast(\"object:updated\");\n });\n promise.then(null, function() {\n $confirm.notify(\"error\");\n item.revert();\n return $model.$setViewValue(item);\n });\n return promise[\"finally\"](function() {\n currentLoading.finish();\n return lightboxService.close($el);\n });\n };\n })(this));\n $scope.$on(\"block\", function() {\n $el.find(\".reason\").val($model.$modelValue.blocked_note);\n return lightboxService.open($el);\n });\n $scope.$on(\"unblock\", (function(_this) {\n return function(event, model, finishCallback) {\n var item;\n item = $model.$modelValue.clone();\n item.is_blocked = false;\n item.blocked_note = \"\";\n return unblock(item, finishCallback);\n };\n })(this));\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return $el.on(\"click\", \".button-green\", function(event) {\n var item;\n event.preventDefault();\n item = $model.$modelValue.clone();\n item.is_blocked = true;\n item.blocked_note = $el.find(\".reason\").val();\n return block(item);\n });\n };\n return {\n templateUrl: \"common/lightbox/lightbox-block.html\",\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgLbBlock\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"lightboxService\", \"$tgLoading\", \"$tgQqueue\", \"$translate\", BlockLightboxDirective]);\n\n BlockingMessageInputDirective = function($log, $template, $compile) {\n var link, template, templateFn;\n template = $template.get(\"common/lightbox/lightbox-blocking-message-input.html\", true);\n link = function($scope, $el, $attrs, $model) {\n if (!$attrs.watch) {\n return $log.error(\"No watch attribute on tg-blocking-message-input directive\");\n }\n return $scope.$watch($attrs.watch, function(value) {\n if (value === !void 0 && value === true) {\n return $el.find(\".blocked-note\").removeClass(\"hidden\");\n } else {\n return $el.find(\".blocked-note\").addClass(\"hidden\");\n }\n });\n };\n templateFn = function($el, $attrs) {\n return template({\n ngmodel: $attrs.ngModel\n });\n };\n return {\n template: templateFn,\n link: link,\n require: \"ngModel\",\n restrict: \"EA\"\n };\n };\n\n module.directive(\"tgBlockingMessageInput\", [\"$log\", \"$tgTemplate\", \"$compile\", BlockingMessageInputDirective]);\n\n CreateEditUserstoryDirective = function($repo, $model, $rs, $rootScope, lightboxService, $loading, $translate, $confirm, $q, attachmentsService) {\n var link;\n link = function($scope, $el, attrs) {\n var attachmentsToAdd, attachmentsToDelete, createAttachments, deleteAttachments, resetAttachments, submit, submitButton;\n $scope.createEditUs = {};\n $scope.isNew = true;\n attachmentsToAdd = Immutable.List();\n attachmentsToDelete = Immutable.List();\n resetAttachments = function() {\n attachmentsToAdd = Immutable.List();\n return attachmentsToDelete = Immutable.List();\n };\n $scope.addAttachment = function(attachment) {\n return attachmentsToAdd = attachmentsToAdd.push(attachment);\n };\n $scope.deleteAttachment = function(attachment) {\n return attachmentsToDelete = attachmentsToDelete.push(attachment);\n };\n $scope.$on(\"usform:new\", function(ctx, projectId, status, statusList) {\n $scope.isNew = true;\n $scope.usStatusList = statusList;\n $scope.attachments = Immutable.List();\n resetAttachments();\n $scope.us = $model.make_model(\"userstories\", {\n project: projectId,\n points: {},\n status: status,\n is_archived: false,\n tags: []\n });\n $el.find(\".button-green\").html($translate.instant(\"COMMON.CREATE\"));\n $el.find(\".title\").html($translate.instant(\"LIGHTBOX.CREATE_EDIT_US.NEW_US\"));\n $el.find(\".tag-input\").val(\"\");\n $el.find(\".blocked-note\").addClass(\"hidden\");\n $el.find(\"label.blocked\").removeClass(\"selected\");\n $el.find(\"label.team-requirement\").removeClass(\"selected\");\n $el.find(\"label.client-requirement\").removeClass(\"selected\");\n return lightboxService.open($el);\n });\n $scope.$on(\"usform:edit\", function(ctx, us, attachments) {\n $scope.us = us;\n $scope.attachments = Immutable.fromJS(attachments);\n $scope.isNew = false;\n resetAttachments();\n $el.find(\".button-green\").html($translate.instant(\"COMMON.SAVE\"));\n $el.find(\".title\").html($translate.instant(\"LIGHTBOX.CREATE_EDIT_US.EDIT_US\"));\n $el.find(\".tag-input\").val(\"\");\n if (us.is_blocked) {\n $el.find(\".blocked-note\").removeClass(\"hidden\");\n $el.find(\"label.blocked\").addClass(\"selected\");\n } else {\n $el.find(\".blocked-note\").addClass(\"hidden\");\n $el.find(\"label.blocked\").removeClass(\"selected\");\n }\n if (us.team_requirement) {\n $el.find(\"label.team-requirement\").addClass(\"selected\");\n } else {\n $el.find(\"label.team-requirement\").removeClass(\"selected\");\n }\n if (us.client_requirement) {\n $el.find(\"label.client-requirement\").addClass(\"selected\");\n } else {\n $el.find(\"label.client-requirement\").removeClass(\"selected\");\n }\n return lightboxService.open($el);\n });\n createAttachments = function(obj) {\n var promises;\n promises = _.map(attachmentsToAdd.toJS(), function(attachment) {\n return attachmentsService.upload(attachment.file, obj.id, $scope.us.project, 'us');\n });\n return $q.all(promises);\n };\n deleteAttachments = function(obj) {\n var promises;\n promises = _.map(attachmentsToDelete.toJS(), function(attachment) {\n return attachmentsService[\"delete\"](\"us\", attachment.id);\n });\n return $q.all(promises);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var broadcastEvent, currentLoading, form, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n if ($scope.isNew) {\n promise = $repo.create(\"userstories\", $scope.us);\n broadcastEvent = \"usform:new:success\";\n } else {\n promise = $repo.save($scope.us);\n broadcastEvent = \"usform:edit:success\";\n }\n promise.then(function(data) {\n deleteAttachments(data).then((function(_this) {\n return function() {\n return createAttachments(data);\n };\n })(this));\n return data;\n });\n promise.then(function(data) {\n currentLoading.finish();\n lightboxService.close($el);\n return $rootScope.$broadcast(broadcastEvent, data);\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n $scope.$apply(function() {\n return $scope.us.revert();\n });\n return lightboxService.close($el);\n });\n $el.keydown(function(event) {\n var code;\n code = event.keyCode ? event.keyCode : event.which;\n if (code === 27) {\n lightboxService.close($el);\n return $scope.$apply(function() {\n return $scope.us.revert();\n });\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateEditUserstory\", [\"$tgRepo\", \"$tgModel\", \"$tgResources\", \"$rootScope\", \"lightboxService\", \"$tgLoading\", \"$translate\", \"$tgConfirm\", \"$q\", \"tgAttachmentsService\", CreateEditUserstoryDirective]);\n\n CreateBulkUserstoriesDirective = function($repo, $rs, $rootscope, lightboxService, $loading) {\n var link;\n link = function($scope, $el, attrs) {\n var submit, submitButton;\n $scope.$on(\"usform:bulk\", function(ctx, projectId, status) {\n $scope[\"new\"] = {\n projectId: projectId,\n statusId: status,\n bulk: \"\"\n };\n return lightboxService.open($el);\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, form, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley({\n onlyOneErrorElement: true\n });\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $rs.userstories.bulkCreate($scope[\"new\"].projectId, $scope[\"new\"].statusId, $scope[\"new\"].bulk);\n promise.then(function(result) {\n currentLoading.finish();\n $rootscope.$broadcast(\"usform:bulk:success\", result);\n return lightboxService.close($el);\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateBulkUserstories\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", \"lightboxService\", \"$tgLoading\", CreateBulkUserstoriesDirective]);\n\n AssignedToLightboxDirective = function(lightboxService, lightboxKeyboardNavigationService, $template, $compile) {\n var link;\n link = function($scope, $el, $attrs) {\n var closeLightbox, filterUsers, normalizeString, render, selectedItem, selectedUser, usersTemplate;\n selectedUser = null;\n selectedItem = null;\n usersTemplate = $template.get(\"common/lightbox/lightbox-assigned-to-users.html\", true);\n normalizeString = function(string) {\n var normalizedString;\n normalizedString = string;\n normalizedString = normalizedString.replace(\"Á\", \"A\").replace(\"Ä\", \"A\").replace(\"À\", \"A\");\n normalizedString = normalizedString.replace(\"É\", \"E\").replace(\"Ë\", \"E\").replace(\"È\", \"E\");\n normalizedString = normalizedString.replace(\"Í\", \"I\").replace(\"Ï\", \"I\").replace(\"Ì\", \"I\");\n normalizedString = normalizedString.replace(\"Ó\", \"O\").replace(\"Ö\", \"O\").replace(\"Ò\", \"O\");\n normalizedString = normalizedString.replace(\"Ú\", \"U\").replace(\"Ü\", \"U\").replace(\"Ù\", \"U\");\n return normalizedString;\n };\n filterUsers = function(text, user) {\n var username;\n username = user.full_name_display.toUpperCase();\n username = normalizeString(username);\n text = text.toUpperCase();\n text = normalizeString(text);\n return _.contains(username, text);\n };\n render = function(selected, text) {\n var ctx, html, users;\n users = _.clone($scope.activeUsers, true);\n if (selected != null) {\n users = _.reject(users, {\n \"id\": selected.id\n });\n }\n if (text != null) {\n users = _.filter(users, _.partial(filterUsers, text));\n }\n ctx = {\n selected: selected,\n users: _.first(users, 5),\n showMore: users.length > 5\n };\n html = usersTemplate(ctx);\n html = $compile(html)($scope);\n return $el.find(\".assigned-to-list\").html(html);\n };\n closeLightbox = function() {\n lightboxKeyboardNavigationService.stop();\n return lightboxService.close($el);\n };\n $scope.$on(\"assigned-to:add\", function(ctx, item) {\n var assignedToId;\n selectedItem = item;\n assignedToId = item.assigned_to;\n selectedUser = $scope.usersById[assignedToId];\n render(selectedUser);\n return lightboxService.open($el).then(function() {\n $el.find('input').focus();\n return lightboxKeyboardNavigationService.init($el);\n });\n });\n $scope.$watch(\"usersSearch\", function(searchingText) {\n if (searchingText != null) {\n render(selectedUser, searchingText);\n return $el.find('input').focus();\n }\n });\n $el.on(\"click\", \".user-list-single\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n closeLightbox();\n return $scope.$apply(function() {\n $scope.$broadcast(\"assigned-to:added\", target.data(\"user-id\"), selectedItem);\n return $scope.usersSearch = null;\n });\n });\n $el.on(\"click\", \".remove-assigned-to\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n closeLightbox();\n return $scope.$apply(function() {\n $scope.usersSearch = null;\n return $scope.$broadcast(\"assigned-to:added\", null, selectedItem);\n });\n });\n $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n closeLightbox();\n return $scope.$apply(function() {\n return $scope.usersSearch = null;\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n templateUrl: \"common/lightbox/lightbox-assigned-to.html\",\n link: link\n };\n };\n\n module.directive(\"tgLbAssignedto\", [\"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", AssignedToLightboxDirective]);\n\n WatchersLightboxDirective = function($repo, lightboxService, lightboxKeyboardNavigationService, $template, $compile) {\n var link;\n link = function($scope, $el, $attrs) {\n var closeLightbox, getFilteredUsers, render, selectedItem, usersTemplate;\n selectedItem = null;\n usersTemplate = $template.get(\"common/lightbox/lightbox-assigned-to-users.html\", true);\n getFilteredUsers = function(text) {\n var _filterUsers, users;\n if (text == null) {\n text = \"\";\n }\n _filterUsers = function(text, user) {\n var username;\n if (selectedItem && _.find(selectedItem.watchers, function(x) {\n return x === user.id;\n })) {\n return false;\n }\n username = user.full_name_display.toUpperCase();\n text = text.toUpperCase();\n return _.contains(username, text);\n };\n users = _.clone($scope.activeUsers, true);\n users = _.filter(users, _.partial(_filterUsers, text));\n return users;\n };\n render = function(users) {\n var ctx, html;\n ctx = {\n selected: false,\n users: _.first(users, 5),\n showMore: users.length > 5\n };\n html = usersTemplate(ctx);\n html = $compile(html)($scope);\n return $el.find(\".ticket-watchers\").html(html);\n };\n closeLightbox = function() {\n lightboxKeyboardNavigationService.stop();\n return lightboxService.close($el);\n };\n $scope.$on(\"watcher:add\", function(ctx, item) {\n var users;\n selectedItem = item;\n users = getFilteredUsers();\n render(users);\n return lightboxService.open($el).then(function() {\n $el.find(\"input\").focus();\n return lightboxKeyboardNavigationService.init($el);\n });\n });\n $scope.$watch(\"usersSearch\", function(searchingText) {\n var users;\n if (searchingText == null) {\n return;\n }\n users = getFilteredUsers(searchingText);\n render(users);\n return $el.find(\"input\").focus();\n });\n $el.on(\"click\", \".user-list-single\", debounce(2000, function(event) {\n var target;\n closeLightbox();\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return $scope.$apply(function() {\n $scope.usersSearch = null;\n return $scope.$broadcast(\"watcher:added\", target.data(\"user-id\"));\n });\n }));\n $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n closeLightbox();\n return $scope.$apply(function() {\n return $scope.usersSearch = null;\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n templateUrl: \"common/lightbox/lightbox-users.html\",\n link: link\n };\n };\n\n module.directive(\"tgLbWatchers\", [\"$tgRepo\", \"lightboxService\", \"lightboxKeyboardNavigationService\", \"$tgTemplate\", \"$compile\", WatchersLightboxDirective]);\n\n AttachmentPreviewLightboxDirective = function(lightboxService, $template, $compile) {\n var link;\n link = function($scope, $el, attrs) {\n return lightboxService.open($el);\n };\n return {\n templateUrl: 'common/lightbox/lightbox-attachment-preview.html',\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgLbAttachmentPreview\", [\"lightboxService\", \"$tgTemplate\", \"$compile\", AttachmentPreviewLightboxDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/loader.coffee\n */\n\n(function() {\n var Loader, LoaderDirective, module, sizeFormat, taiga, timeout;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n timeout = this.taiga.timeout;\n\n module = angular.module(\"taigaCommon\");\n\n LoaderDirective = function(tgLoader, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n tgLoader.onStart(function() {\n $(document.body).addClass(\"loader-active\");\n return $el.addClass(\"active\");\n });\n return tgLoader.onEnd(function() {\n $(document.body).removeClass(\"loader-active\");\n return $el.removeClass(\"active\");\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLoader\", [\"tgLoader\", \"$rootScope\", LoaderDirective]);\n\n Loader = function($rootscope) {\n var autoClose, config, lastResponseDate, open, pageLoaded, requestCount, start, startLoadTime;\n config = {\n minTime: 300\n };\n open = false;\n startLoadTime = 0;\n requestCount = 0;\n lastResponseDate = 0;\n pageLoaded = function(force) {\n var diff, endTime, timeoutValue;\n if (force == null) {\n force = false;\n }\n if (startLoadTime) {\n timeoutValue = 0;\n if (!force) {\n endTime = new Date().getTime();\n diff = endTime - startLoadTime;\n if (diff < config.minTime) {\n timeoutValue = config.minTime - diff;\n }\n }\n timeout(timeoutValue, function() {\n $rootscope.$broadcast(\"loader:end\");\n open = false;\n return window.prerenderReady = true;\n });\n }\n startLoadTime = 0;\n requestCount = 0;\n return lastResponseDate = 0;\n };\n autoClose = function() {\n var intervalAuto;\n return intervalAuto = setInterval((function() {\n if (lastResponseDate && requestCount === 0) {\n pageLoaded();\n return clearInterval(intervalAuto);\n }\n }), 50);\n };\n start = function() {\n startLoadTime = new Date().getTime();\n $rootscope.$broadcast(\"loader:start\");\n return open = true;\n };\n return {\n pageLoaded: pageLoaded,\n start: function(auto) {\n if (auto == null) {\n auto = false;\n }\n if (!open) {\n start();\n if (auto) {\n return autoClose();\n }\n }\n },\n onStart: function(fn) {\n return $rootscope.$on(\"loader:start\", fn);\n },\n onEnd: function(fn) {\n return $rootscope.$on(\"loader:end\", fn);\n },\n logRequest: function() {\n return requestCount++;\n },\n logResponse: function() {\n requestCount--;\n return lastResponseDate = new Date().getTime();\n }\n };\n };\n\n Loader.$inject = [\"$rootScope\"];\n\n module.factory(\"tgLoader\", Loader);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/lightboxes.coffee\n */\n\n(function() {\n var LoadingDirective, TgLoadingService, module,\n slice = [].slice;\n\n module = angular.module(\"taigaCommon\");\n\n TgLoadingService = function($compile) {\n var spinner;\n spinner = \"loading...\";\n return function() {\n var service;\n service = {\n settings: {\n target: null,\n scope: null,\n classes: [],\n timeout: 0,\n template: null\n },\n target: function(target) {\n service.settings.target = target;\n return service;\n },\n scope: function(scope) {\n service.settings.scope = scope;\n return service;\n },\n template: function(template) {\n service.settings.template = template;\n return service;\n },\n removeClasses: function() {\n var classess;\n classess = 1 <= arguments.length ? slice.call(arguments, 0) : [];\n service.settings.classes = classess;\n return service;\n },\n timeout: function(timeout) {\n service.settings.timeout = timeout;\n return service;\n },\n start: function() {\n var target, timeoutId;\n target = service.settings.target;\n service.settings.classes.map(function(className) {\n return target.removeClass(className);\n });\n timeoutId = setTimeout((function() {\n if (!target.hasClass('loading')) {\n if (!service.settings.template) {\n service.settings.template = target.html();\n }\n target.addClass('loading');\n return target.html(spinner);\n }\n }), service.settings.timeout);\n service.settings.timeoutId = timeoutId;\n return service;\n },\n finish: function() {\n var removeClasses, target, timeoutId;\n target = service.settings.target;\n timeoutId = service.settings.timeoutId;\n if (timeoutId) {\n clearTimeout(timeoutId);\n removeClasses = service.settings.classes;\n removeClasses.map(function(className) {\n return service.settings.target.addClass(className);\n });\n target.html(service.settings.template);\n target.removeClass('loading');\n if (service.settings.scope) {\n $compile(target.contents())(service.settings.scope);\n }\n }\n return service;\n }\n };\n return service;\n };\n };\n\n TgLoadingService.$inject = [\"$compile\"];\n\n module.factory(\"$tgLoading\", TgLoadingService);\n\n LoadingDirective = function($loading) {\n var link;\n link = function($scope, $el, attr) {\n var currentLoading, template;\n currentLoading = null;\n template = $el.html();\n return $scope.$watch(attr.tgLoading, (function(_this) {\n return function(showLoading) {\n if (showLoading) {\n return currentLoading = $loading().target($el).timeout(100).template(template).scope($scope).start();\n } else if (currentLoading) {\n return currentLoading.finish();\n }\n };\n })(this));\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLoading\", [\"$tgLoading\", LoadingDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/popovers.coffee\n */\n\n(function() {\n var RelatedTaskStatusDirective, UsStatusDirective, bindOnce, debounce, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaCommon\");\n\n UsStatusDirective = function($repo, $template) {\n\n /*\n Print the status of a US and a popover to change it.\n - tg-us-status: The user story\n - on-update: Method call after US is updated\n \n Example:\n \n div.status(tg-us-status=\"us\" on-update=\"ctrl.loadSprintState()\")\n a.us-status(href=\"\", title=\"Status Name\")\n \n NOTE: This directive need 'usStatusById' and 'project'.\n */\n var link, template;\n template = $template.get(\"common/popover/popover-us-status.html\", true);\n link = function($scope, $el, $attrs) {\n var $ctrl, render, us;\n $ctrl = $el.controller();\n render = function(us) {\n var usStatusById, usStatusDom, usStatusDomParent;\n usStatusDomParent = $el.find(\".us-status\");\n usStatusDom = $el.find(\".us-status .us-status-bind\");\n usStatusById = $scope.usStatusById;\n if (usStatusById[us.status]) {\n usStatusDom.text(usStatusById[us.status].name);\n return usStatusDomParent.css(\"color\", usStatusById[us.status].color);\n }\n };\n $el.on(\"click\", \".us-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", debounce(2000, function(event) {\n var target, us;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n us = $scope.$eval($attrs.tgUsStatus);\n us.status = target.data(\"status-id\");\n render(us);\n $el.find(\".pop-status\").popover().close();\n return $scope.$apply(function() {\n return $repo.save(us).then(function() {\n return $scope.$eval($attrs.onUpdate);\n });\n });\n }));\n $scope.$on(\"userstories:loaded\", function() {\n return render($scope.$eval($attrs.tgUsStatus));\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n us = $scope.$eval($attrs.tgUsStatus);\n render(us);\n return bindOnce($scope, \"project\", function(project) {\n var html;\n html = template({\n \"statuses\": project.us_statuses\n });\n $el.append(html);\n if ($scope.project.my_permissions.indexOf(\"modify_us\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUsStatus\", [\"$tgRepo\", \"$tgTemplate\", UsStatusDirective]);\n\n RelatedTaskStatusDirective = function($repo, $template) {\n\n /*\n Print the status of a related task and a popover to change it.\n - tg-related-task-status: The related task\n - on-update: Method call after US is updated\n \n Example:\n \n div.status(tg-related-task-status=\"task\" on-update=\"ctrl.loadSprintState()\")\n a.task-status(href=\"\", title=\"Status Name\")\n \n NOTE: This directive need 'taskStatusById' and 'project'.\n */\n var link, selectionTemplate, updateTaskStatus;\n selectionTemplate = $template.get(\"common/popover/popover-related-task-status.html\", true);\n updateTaskStatus = function($el, task, taskStatusById) {\n var taskStatusDom, taskStatusDomParent;\n taskStatusDomParent = $el.find(\".us-status\");\n taskStatusDom = $el.find(\".task-status .task-status-bind\");\n if (taskStatusById[task.status]) {\n taskStatusDom.text(taskStatusById[task.status].name);\n return taskStatusDomParent.css('color', taskStatusById[task.status].color);\n }\n };\n link = function($scope, $el, $attrs) {\n var $ctrl, autoSave, notAutoSave, task;\n $ctrl = $el.controller();\n task = $scope.$eval($attrs.tgRelatedTaskStatus);\n notAutoSave = $scope.$eval($attrs.notAutoSave);\n autoSave = !notAutoSave;\n $el.on(\"click\", \".task-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", debounce(2000, function(event) {\n var target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n task.status = target.data(\"status-id\");\n $el.find(\".pop-status\").popover().close();\n updateTaskStatus($el, task, $scope.taskStatusById);\n if (autoSave) {\n return $scope.$apply(function() {\n return $repo.save(task).then(function() {\n $scope.$eval($attrs.onUpdate);\n return $scope.$emit(\"related-tasks:status-changed\");\n });\n });\n }\n }));\n taiga.bindOnce($scope, \"project\", function(project) {\n $el.append(selectionTemplate({\n 'statuses': project.task_statuses\n }));\n updateTaskStatus($el, task, $scope.taskStatusById);\n if (project.my_permissions.indexOf(\"modify_task\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRelatedTaskStatus\", [\"$tgRepo\", \"$tgTemplate\", RelatedTaskStatusDirective]);\n\n $.fn.popover = function() {\n var $el, close, closeAll, closePopover, isVisible, open;\n $el = this;\n isVisible = (function(_this) {\n return function() {\n var docViewBottom, docViewLeft, docViewRight, docViewTop, docViewWidth, elemBottom, elemLeft, elemRight, elemTop, elemWidth;\n $el.css({\n \"display\": \"block\",\n \"visibility\": \"hidden\"\n });\n docViewTop = $(window).scrollTop();\n docViewBottom = docViewTop + $(window).height();\n docViewWidth = $(window).width();\n docViewRight = docViewWidth;\n docViewLeft = 0;\n elemTop = $el.offset().top;\n elemBottom = elemTop + $el.height();\n elemWidth = $el.width();\n elemLeft = $el.offset().left;\n elemRight = $el.offset().left + elemWidth;\n $el.css({\n \"display\": \"none\",\n \"visibility\": \"visible\"\n });\n return (elemBottom <= docViewBottom) && (elemTop >= docViewTop) && (elemLeft >= docViewLeft) && (elemRight <= docViewRight);\n };\n })(this);\n closePopover = (function(_this) {\n return function(onClose) {\n if (onClose) {\n onClose.call($el);\n }\n $el.fadeOut(function() {\n return $el.removeClass(\"active\").removeClass(\"fix\");\n });\n return $el.off(\"popup:close\");\n };\n })(this);\n closeAll = (function(_this) {\n return function() {\n return $(\".popover.active\").each(function() {\n return $(this).trigger(\"popup:close\");\n });\n };\n })(this);\n open = (function(_this) {\n return function(onClose) {\n if ($el.hasClass(\"active\")) {\n return close();\n } else {\n closeAll();\n if (!isVisible()) {\n $el.addClass(\"fix\");\n }\n $el.fadeIn(function() {\n $el.addClass(\"active\");\n $(document.body).off(\"popover\");\n return $(document.body).one(\"click.popover\", function() {\n return closeAll();\n });\n });\n return $el.on(\"popup:close\", function(e) {\n return closePopover(onClose);\n });\n }\n };\n })(this);\n close = (function(_this) {\n return function() {\n return $el.trigger(\"popup:close\");\n };\n })(this);\n return {\n open: open,\n close: close,\n closeAll: closeAll\n };\n };\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/raven-logger.coffee\n */\n\n(function() {\n var ExceptionHandlerFactory, module, taiga;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaCommon\");\n\n ExceptionHandlerFactory = function($log, config) {\n var ravenConfig;\n this.config = config;\n ravenConfig = this.config.get(\"ravenConfig\", null);\n if (ravenConfig) {\n $log.debug(\"Using the RavenJS exception handler.\");\n Raven.config(ravenConfig).install();\n return function(exception, cause) {\n $log.error.apply($log, arguments);\n return Raven.captureException(exception);\n };\n } else {\n $log.debug(\"Using the default logging exception handler.\");\n return function(exception, cause) {\n return $log.error.apply($log, arguments);\n };\n }\n };\n\n module.factory(\"$exceptionHandler\", [\"$log\", \"$tgConfig\", ExceptionHandlerFactory]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/tags.coffee\n */\n\n(function() {\n var ColorizeTagsDirective, LbTagLineDirective, TagLineDirective, TagsDirective, bindOnce, module, taiga, trim,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n taiga = this.taiga;\n\n trim = this.taiga.trim;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaCommon\");\n\n TagsDirective = function() {\n var formatter, link, parser;\n formatter = function(v) {\n if (_.isArray(v)) {\n return v.join(\", \");\n }\n return \"\";\n };\n parser = function(v) {\n var result;\n if (!v) {\n return [];\n }\n result = _(v.split(\",\")).map(function(x) {\n return _.str.trim(x);\n });\n return result.value();\n };\n link = function($scope, $el, $attrs, $ctrl) {\n $ctrl.$formatters.push(formatter);\n $ctrl.$parsers.push(parser);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n require: \"ngModel\",\n link: link\n };\n };\n\n module.directive(\"tgTags\", TagsDirective);\n\n ColorizeTagsDirective = function() {\n var link, templates;\n templates = {\n backlog: _.template(\"<% _.each(tags, function(tag) { %>\\n \\\"><%- tag.name %>\\n<% }) %>\"),\n kanban: _.template(\"<% _.each(tags, function(tag) { %>\\n
\\\" title=\\\"<%- tag.name %>\\\" />\\n<% }) %>\"),\n taskboard: _.template(\"<% _.each(tags, function(tag) { %>\\n \\\" title=\\\"<%- tag.name %>\\\" />\\n<% }) %>\")\n };\n link = function($scope, $el, $attrs, $ctrl) {\n var render;\n render = function(srcTags) {\n var html, tags, template;\n template = templates[$attrs.tgColorizeTagsType];\n srcTags.sort();\n tags = _.map(srcTags, function(tag) {\n var color;\n color = $scope.project.tags_colors[tag];\n return {\n name: tag,\n color: color\n };\n });\n html = template({\n tags: tags\n });\n return $el.html(html);\n };\n $scope.$watch($attrs.tgColorizeTags, function(tags) {\n if (tags != null) {\n return render(tags);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgColorizeTags\", ColorizeTagsDirective);\n\n LbTagLineDirective = function($rs, $template, $compile) {\n var COMMA_KEY, ENTER_KEY, link, templateTags;\n ENTER_KEY = 13;\n COMMA_KEY = 188;\n templateTags = $template.get(\"common/tag/lb-tag-line-tags.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var addValue, deleteValue, hideSaveButton, renderTags, resetInput, saveInputTag, showSaveButton;\n renderTags = function(tags, tagsColors) {\n var ctx, html;\n ctx = {\n tags: _.map(tags, function(t) {\n return {\n name: t,\n color: tagsColors[t]\n };\n })\n };\n _.map(ctx.tags, (function(_this) {\n return function(tag) {\n if (tag.color) {\n return tag.style = \"border-left: 5px solid \" + tag.color;\n }\n };\n })(this));\n html = $compile(templateTags(ctx))($scope);\n return $el.find(\"div.tags-container\").html(html);\n };\n showSaveButton = function() {\n return $el.find(\".save\").removeClass(\"hidden\");\n };\n hideSaveButton = function() {\n return $el.find(\".save\").addClass(\"hidden\");\n };\n resetInput = function() {\n $el.find(\"input\").val(\"\");\n return $el.find(\"input\").autocomplete(\"close\");\n };\n addValue = function(value) {\n var tags;\n value = trim(value.toLowerCase());\n if (value.length === 0) {\n return;\n }\n tags = _.clone($model.$modelValue, false);\n if (tags == null) {\n tags = [];\n }\n if (indexOf.call(tags, value) < 0) {\n tags.push(value);\n }\n $scope.$apply(function() {\n return $model.$setViewValue(tags);\n });\n return hideSaveButton();\n };\n deleteValue = function(value) {\n var tags;\n value = trim(value.toLowerCase());\n if (value.length === 0) {\n return;\n }\n tags = _.clone($model.$modelValue, false);\n tags = _.pull(tags, value);\n return $scope.$apply(function() {\n return $model.$setViewValue(tags);\n });\n };\n saveInputTag = function() {\n var value;\n value = $el.find(\"input\").val();\n addValue(value);\n return resetInput();\n };\n $el.on(\"keypress\", \"input\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n if (event.keyCode === ENTER_KEY) {\n event.preventDefault();\n return saveInputTag();\n } else if (String.fromCharCode(event.keyCode) === ',') {\n event.preventDefault();\n return saveInputTag();\n } else {\n if (target.val().length) {\n return showSaveButton();\n } else {\n return hideSaveButton();\n }\n }\n });\n $el.on(\"click\", \".save\", function(event) {\n event.preventDefault();\n return saveInputTag();\n });\n $el.on(\"click\", \".icon-delete\", function(event) {\n var target, value;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n value = target.siblings(\".tag-name\").text();\n return deleteValue(value);\n });\n bindOnce($scope, \"project\", function(project) {\n var positioningFunction;\n positioningFunction = function(position, elements) {\n var menu;\n menu = elements.element.element;\n menu.css(\"width\", elements.target.width);\n menu.css(\"top\", position.top);\n return menu.css(\"left\", position.left);\n };\n return $el.find(\"input\").autocomplete({\n source: _.keys(project.tags_colors),\n position: {\n my: \"left top\",\n using: positioningFunction\n },\n select: function(event, ui) {\n addValue(ui.item.value);\n return ui.item.value = \"\";\n }\n });\n });\n $scope.$watch($attrs.ngModel, function(tags) {\n var ref, tagsColors;\n tagsColors = ((ref = $scope.project) != null ? ref.tags_colors : void 0) || [];\n return renderTags(tags, tagsColors);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\",\n templateUrl: \"common/tag/lb-tag-line.html\"\n };\n };\n\n module.directive(\"tgLbTagLine\", [\"$tgResources\", \"$tgTemplate\", \"$compile\", LbTagLineDirective]);\n\n TagLineDirective = function($rootScope, $repo, $rs, $confirm, $qqueue, $template, $compile) {\n var COMMA_KEY, ENTER_KEY, ESC_KEY, link, templateTags;\n ENTER_KEY = 13;\n ESC_KEY = 27;\n COMMA_KEY = 188;\n templateTags = $template.get(\"common/tag/tags-line-tags.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var addValue, deleteValue, hideAddTagButton, hideAddTagButtonText, hideInput, hideSaveButton, isEditable, renderInReadModeOnly, renderTags, resetInput, saveInputTag, showAddTagButton, showAddTagButtonText, showInput, showSaveButton;\n isEditable = function() {\n if ($attrs.requiredPerm != null) {\n return $scope.project.my_permissions.indexOf($attrs.requiredPerm) !== -1;\n }\n return true;\n };\n renderTags = function(tags, tagsColors) {\n var ctx, html;\n ctx = {\n tags: _.map(tags, function(t) {\n return {\n name: t,\n color: tagsColors[t]\n };\n }),\n isEditable: isEditable()\n };\n html = $compile(templateTags(ctx))($scope);\n return $el.find(\"div.tags-container\").html(html);\n };\n renderInReadModeOnly = function() {\n $el.find(\".add-tag\").remove();\n $el.find(\"input\").remove();\n return $el.find(\".save\").remove();\n };\n showAddTagButton = function() {\n return $el.find(\".add-tag\").removeClass(\"hidden\");\n };\n hideAddTagButton = function() {\n return $el.find(\".add-tag\").addClass(\"hidden\");\n };\n showAddTagButtonText = function() {\n return $el.find(\".add-tag-text\").removeClass(\"hidden\");\n };\n hideAddTagButtonText = function() {\n return $el.find(\".add-tag-text\").addClass(\"hidden\");\n };\n showSaveButton = function() {\n return $el.find(\".save\").removeClass(\"hidden\");\n };\n hideSaveButton = function() {\n return $el.find(\".save\").addClass(\"hidden\");\n };\n showInput = function() {\n return $el.find(\"input\").removeClass(\"hidden\").focus();\n };\n hideInput = function() {\n return $el.find(\"input\").addClass(\"hidden\").blur();\n };\n resetInput = function() {\n $el.find(\"input\").val(\"\");\n return $el.find(\"input\").autocomplete(\"close\");\n };\n addValue = $qqueue.bindAdd(function(value) {\n var model, onError, onSuccess, tags;\n value = trim(value.toLowerCase());\n if (value.length === 0) {\n return;\n }\n tags = _.clone($model.$modelValue.tags, false);\n if (tags == null) {\n tags = [];\n }\n if (indexOf.call(tags, value) < 0) {\n tags.push(value);\n }\n model = $model.$modelValue.clone();\n model.tags = tags;\n $model.$setViewValue(model);\n onSuccess = function() {\n return $rootScope.$broadcast(\"object:updated\");\n };\n onError = function() {\n $confirm.notify(\"error\");\n model.revert();\n return $model.$setViewValue(model);\n };\n hideSaveButton();\n return $repo.save(model).then(onSuccess, onError);\n });\n deleteValue = $qqueue.bindAdd(function(value) {\n var model, onError, onSuccess, tags;\n value = trim(value.toLowerCase());\n if (value.length === 0) {\n return;\n }\n tags = _.clone($model.$modelValue.tags, false);\n tags = _.pull(tags, value);\n model = $model.$modelValue.clone();\n model.tags = tags;\n $model.$setViewValue(model);\n onSuccess = function() {\n return $rootScope.$broadcast(\"object:updated\");\n };\n onError = function() {\n $confirm.notify(\"error\");\n model.revert();\n return $model.$setViewValue(model);\n };\n return $repo.save(model).then(onSuccess, onError);\n });\n saveInputTag = function() {\n var value;\n value = $el.find(\"input\").val();\n addValue(value);\n return resetInput();\n };\n $el.on(\"keypress\", \"input\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n if (event.keyCode === ENTER_KEY) {\n return saveInputTag();\n } else if (String.fromCharCode(event.keyCode) === ',') {\n event.preventDefault();\n return saveInputTag();\n } else {\n if (target.val().length) {\n return showSaveButton();\n } else {\n return hideSaveButton();\n }\n }\n });\n $el.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === ESC_KEY) {\n resetInput();\n hideInput();\n hideSaveButton();\n return showAddTagButton();\n }\n });\n $el.on(\"click\", \".save\", function(event) {\n event.preventDefault();\n return saveInputTag();\n });\n $el.on(\"click\", \".add-tag\", function(event) {\n event.preventDefault();\n hideAddTagButton();\n return showInput();\n });\n $el.on(\"click\", \".icon-delete\", function(event) {\n var target, value;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n value = target.siblings(\".tag-name\").text();\n return deleteValue(value);\n });\n bindOnce($scope, \"project.tags_colors\", function(tags_colors) {\n var positioningFunction;\n if (!isEditable()) {\n renderInReadModeOnly();\n return;\n }\n showAddTagButton();\n positioningFunction = function(position, elements) {\n var menu;\n menu = elements.element.element;\n menu.css(\"width\", elements.target.width);\n menu.css(\"top\", position.top);\n return menu.css(\"left\", position.left);\n };\n return $el.find(\"input\").autocomplete({\n source: _.keys(tags_colors),\n position: {\n my: \"left top\",\n using: positioningFunction\n },\n select: function(event, ui) {\n addValue(ui.item.value);\n return ui.item.value = \"\";\n }\n });\n });\n $scope.$watch($attrs.ngModel, function(model) {\n var ref, ref1, tagsColors;\n if (!model) {\n return;\n }\n if ((ref = model.tags) != null ? ref.length : void 0) {\n hideAddTagButtonText();\n } else {\n showAddTagButtonText();\n }\n tagsColors = ((ref1 = $scope.project) != null ? ref1.tags_colors : void 0) || [];\n return renderTags(model.tags, tagsColors);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\",\n templateUrl: \"common/tag/tag-line.html\"\n };\n };\n\n module.directive(\"tgTagLine\", [\"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", TagLineDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/wisiwyg.coffee\n */\n\n(function() {\n var MarkitupDirective, bindOnce, module, taiga,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaCommon\");\n\n MarkitupDirective = function($rootscope, $rs, $selectedText, $template, $compile, $translate) {\n var link, previewTemplate;\n previewTemplate = $template.get(\"common/wysiwyg/wysiwyg-markitup-preview.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var addLine, cancelablePromise, closePreviewMode, element, markdownTitle, prepareUrlFormatting, preview, previewDomNode, renderMarkItUp, setCaretPosition, unbind, urlFormatting;\n element = angular.element($el);\n previewDomNode = $(\"
\", {\n \"class\": \"preview\"\n });\n closePreviewMode = function() {\n element.parents(\".markdown\").find(\".preview\").remove();\n return element.parents(\".markItUp\").show();\n };\n $scope.$on(\"markdown-editor:submit\", function() {\n return closePreviewMode();\n });\n cancelablePromise = null;\n preview = function() {\n var markItUpDomNode, markdownDomNode;\n markdownDomNode = element.parents(\".markdown\");\n markItUpDomNode = element.parents(\".markItUp\");\n return $rs.mdrender.render($scope.projectId, $model.$modelValue).then(function(data) {\n var html, markdown;\n html = previewTemplate({\n data: data.data\n });\n html = $compile(html)($scope);\n markdownDomNode.append(html);\n markItUpDomNode.hide();\n markdown = element.closest(\".markdown\");\n return markdown.on(\"mouseup.preview\", \".preview\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.target);\n if (!target.is('a') && $selectedText.get().length) {\n return;\n }\n markdown.off(\".preview\");\n return closePreviewMode();\n });\n });\n };\n setCaretPosition = function(textarea, caretPosition) {\n var line, range, scrollRelation, totalLines;\n if (textarea.createTextRange) {\n range = textarea.createTextRange();\n range.move(\"character\", caretPosition);\n range.select();\n } else if (textarea.selectionStart) {\n textarea.focus();\n textarea.setSelectionRange(caretPosition, caretPosition);\n }\n totalLines = textarea.value.split(\"\\n\").length;\n line = textarea.value.slice(0, +(caretPosition - 1) + 1 || 9e9).split(\"\\n\").length;\n scrollRelation = line / totalLines;\n return $el.scrollTop((scrollRelation * $el[0].scrollHeight) - ($el.height() / 2));\n };\n addLine = function(textarea, nline, replace) {\n var cursorPosition, j, key, len, line, lines;\n lines = textarea.value.split(\"\\n\");\n if (replace) {\n lines[nline] = replace + lines[nline];\n } else {\n lines[nline] = \"\";\n }\n cursorPosition = 0;\n for (key = j = 0, len = lines.length; j < len; key = ++j) {\n line = lines[key];\n cursorPosition += line.length + 1 || 1;\n if (key === nline) {\n break;\n }\n }\n textarea.value = lines.join(\"\\n\");\n if (replace) {\n return cursorPosition - lines[nline].length + replace.length - 1;\n } else {\n return cursorPosition;\n }\n };\n prepareUrlFormatting = function(markItUp) {\n var indices, regex, result;\n regex = /(<<<|>>>)/gi;\n result = 0;\n indices = [];\n while ((result = regex.exec(markItUp.textarea.value))) {\n indices.push(result.index);\n }\n return markItUp.donotparse = indices;\n };\n urlFormatting = function(markItUp) {\n var endIndex, ref, ref1, regex, result, startIndex, url, value;\n regex = /<<>>/gi;\n endIndex = 0;\n while (true) {\n result = regex.exec(markItUp.textarea.value);\n if (!result) {\n break;\n }\n if (ref1 = result.index, indexOf.call(markItUp.donotparse, ref1) < 0) {\n endIndex = result.index;\n break;\n }\n }\n value = markItUp.textarea.value;\n url = value.substring(startIndex, endIndex).replace('<<<', '').replace('>>>', '');\n url = url.replace('(', '%28').replace(')', '%29');\n url = url.replace('[', '%5B').replace(']', '%5D');\n value = value.substring(0, startIndex) + url + value.substring(endIndex + 3, value.length);\n markItUp.textarea.value = value;\n return markItUp.donotparse = void 0;\n };\n markdownTitle = function(markItUp, char) {\n var heading, i, j, n, ref;\n heading = \"\";\n n = $.trim(markItUp.selection || markItUp.placeHolder).length;\n for (i = j = 0, ref = n - 1; 0 <= ref ? j <= ref : j >= ref; i = 0 <= ref ? ++j : --j) {\n heading += char;\n }\n return \"\\n\" + heading + \"\\n\";\n };\n renderMarkItUp = function() {\n var markdownSettings;\n markdownSettings = {\n nameSpace: \"markdown\",\n onShiftEnter: {\n keepDefault: false,\n openWith: \"\\n\\n\"\n },\n onEnter: {\n keepDefault: false,\n replaceWith: function() {\n if (!$('.textcomplete-dropdown').is(':visible')) {\n return \"\\n\";\n }\n },\n afterInsert: function(data) {\n var cursorLine, emptyListItem, lastLine, lines, markdownCaretPositon, match, newLineContent, nline, replace;\n lines = data.textarea.value.split(\"\\n\");\n if (data.caretPosition > 0) {\n cursorLine = data.textarea.value.slice(0, +(data.caretPosition - 1) + 1 || 9e9).split(\"\\n\").length;\n } else {\n cursorLine = 1;\n }\n newLineContent = data.textarea.value.slice(data.caretPosition).split(\"\\n\")[0];\n lastLine = lines[cursorLine - 1];\n match = lastLine.match(/^(\\s*- ).*/);\n if (match) {\n emptyListItem = lastLine.match(/^(\\s*)\\-\\s$/);\n if (emptyListItem) {\n nline = cursorLine - 1;\n replace = null;\n } else {\n nline = cursorLine;\n replace = \"\" + match[1];\n }\n markdownCaretPositon = addLine(data.textarea, nline, replace);\n }\n match = lastLine.match(/^(\\s*\\* ).*/);\n if (match) {\n emptyListItem = lastLine.match(/^(\\s*\\* )$/);\n if (emptyListItem) {\n nline = cursorLine - 1;\n replace = null;\n } else {\n nline = cursorLine;\n replace = \"\" + match[1];\n }\n markdownCaretPositon = addLine(data.textarea, nline, replace);\n }\n match = lastLine.match(/^(\\s*)(\\d+)\\.\\s/);\n if (match) {\n emptyListItem = lastLine.match(/^(\\s*)(\\d+)\\.\\s$/);\n if (emptyListItem) {\n nline = cursorLine - 1;\n replace = null;\n } else {\n nline = cursorLine;\n replace = (match[1] + (parseInt(match[2], 10) + 1)) + \". \";\n }\n markdownCaretPositon = addLine(data.textarea, nline, replace);\n }\n if (markdownCaretPositon) {\n return setCaretPosition(data.textarea, markdownCaretPositon);\n }\n }\n },\n markupSet: [\n {\n name: $translate.instant(\"COMMON.WYSIWYG.H1_BUTTON\"),\n key: \"1\",\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.H1_SAMPLE_TEXT\"),\n closeWith: function(markItUp) {\n return markdownTitle(markItUp, \"=\");\n }\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.H2_BUTTON\"),\n key: \"2\",\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.H2_SAMPLE_TEXT\"),\n closeWith: function(markItUp) {\n return markdownTitle(markItUp, \"-\");\n }\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.H3_BUTTON\"),\n key: \"3\",\n openWith: \"### \",\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.H3_SAMPLE_TEXT\")\n }, {\n separator: \"---------------\"\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.BOLD_BUTTON\"),\n key: \"B\",\n openWith: \"**\",\n closeWith: \"**\",\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.BOLD_BUTTON_SAMPLE_TEXT\")\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.ITALIC_SAMPLE_TEXT\"),\n key: \"I\",\n openWith: \"_\",\n closeWith: \"_\",\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.ITALIC_SAMPLE_TEXT\")\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.STRIKE_BUTTON\"),\n key: \"S\",\n openWith: \"~~\",\n closeWith: \"~~\",\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.STRIKE_SAMPLE_TEXT\")\n }, {\n separator: \"---------------\"\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.BULLETED_LIST_BUTTON\"),\n openWith: \"- \",\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.BULLETED_LIST_SAMPLE_TEXT\")\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.NUMERIC_LIST_BUTTON\"),\n openWith: function(markItUp) {\n return markItUp.line + \". \";\n },\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.NUMERIC_LIST_SAMPLE_TEXT\")\n }, {\n separator: \"---------------\"\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.PICTURE_BUTTON\"),\n key: \"P\",\n openWith: \"![\",\n closeWith: '](<<<[![Url:!:http://]!]>>> \"[![Title]!]\")',\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.PICTURE_SAMPLE_TEXT\"),\n beforeInsert: function(markItUp) {\n return prepareUrlFormatting(markItUp);\n },\n afterInsert: function(markItUp) {\n return urlFormatting(markItUp);\n }\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.LINK_BUTTON\"),\n key: \"L\",\n openWith: \"[\",\n closeWith: '](<<<[![Url:!:http://]!]>>> \"[![Title]!]\")',\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.LINK_SAMPLE_TEXT\"),\n beforeInsert: function(markItUp) {\n return prepareUrlFormatting(markItUp);\n },\n afterInsert: function(markItUp) {\n return urlFormatting(markItUp);\n }\n }, {\n separator: \"---------------\"\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.QUOTE_BLOCK_BUTTON\"),\n openWith: \"> \",\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.QUOTE_BLOCK_SAMPLE_TEXT\")\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.CODE_BLOCK_BUTTON\"),\n openWith: \"```\\n\",\n placeHolder: $translate.instant(\"COMMON.WYSIWYG.CODE_BLOCK_SAMPLE_TEXT\"),\n closeWith: \"\\n```\"\n }, {\n separator: \"---------------\"\n }, {\n name: $translate.instant(\"COMMON.WYSIWYG.PREVIEW_BUTTON\"),\n call: preview,\n className: \"preview-icon\"\n }\n ],\n afterInsert: function(event) {\n var target;\n target = angular.element(event.textarea);\n return $model.$setViewValue(target.val());\n }\n };\n return element.markItUpRemove().markItUp(markdownSettings).textcomplete([\n {\n cache: true,\n match: /(^|\\s)#([a-z0-9]+)$/i,\n search: function(term, callback) {\n var filter, searchProps, searchTypes;\n term = taiga.slugify(term);\n searchTypes = ['issues', 'tasks', 'userstories'];\n searchProps = ['ref', 'subject'];\n filter = (function(_this) {\n return function(item) {\n var j, len, prop;\n for (j = 0, len = searchProps.length; j < len; j++) {\n prop = searchProps[j];\n if (taiga.slugify(item[prop]).indexOf(term) >= 0) {\n return true;\n }\n }\n return false;\n };\n })(this);\n if (cancelablePromise) {\n cancelablePromise.abort();\n }\n cancelablePromise = $rs.search[\"do\"]($scope.projectId, term);\n cancelablePromise.then((function(_this) {\n return function(res) {\n var j, len, results, type;\n if (res.count < 1 || res.count === res.wikipages.length) {\n return callback([]);\n } else {\n results = [];\n for (j = 0, len = searchTypes.length; j < len; j++) {\n type = searchTypes[j];\n if (res[type] && res[type].length > 0) {\n results.push(callback(res[type].filter(filter), true));\n } else {\n results.push(void 0);\n }\n }\n return results;\n }\n };\n })(this));\n return callback([]);\n },\n replace: function(res) {\n return \"$1\\#\" + res.ref + \" \";\n },\n template: function(res, term) {\n return \"\\#\" + res.ref + \" - \" + res.subject;\n }\n }, {\n cache: true,\n match: /(^|\\s)@([a-z0-9\\-\\._]{2,})$/i,\n search: function(term, callback) {\n var searchProps, username;\n username = taiga.slugify(term);\n searchProps = ['username', 'full_name', 'full_name_display'];\n if ($scope.project.members.length < 1) {\n return callback([]);\n } else {\n return callback($scope.project.members.filter((function(_this) {\n return function(user) {\n var j, len, prop;\n for (j = 0, len = searchProps.length; j < len; j++) {\n prop = searchProps[j];\n if (taiga.slugify(user[prop]).indexOf(username) >= 0) {\n return true;\n }\n }\n return false;\n };\n })(this)));\n }\n },\n replace: function(user) {\n return \"$1@\" + user.username + \" \";\n },\n template: function(user) {\n return user.username + \" - \" + user.full_name_display;\n }\n }, {\n cache: true,\n match: /(^|\\s)\\[\\[([a-z0-9\\-]+)$/i,\n search: function(term, callback) {\n term = taiga.slugify(term);\n return $rs.search[\"do\"]($scope.projectId, term).then((function(_this) {\n return function(res) {\n if (res.count < 1) {\n callback([]);\n }\n if (res.count < 1 || !res.wikipages || res.wikipages.length <= 0) {\n callback([]);\n } else {\n callback(res.wikipages.filter(function(page) {\n return taiga.slugify(page['slug']).indexOf(term) >= 0;\n }), true);\n }\n return callback([]);\n };\n })(this));\n },\n replace: function(res) {\n return \"$1[[\" + res.slug + \"]]\";\n },\n template: function(res, term) {\n return res.slug;\n }\n }\n ], {\n debounce: 200\n });\n };\n renderMarkItUp();\n unbind = $rootscope.$on(\"$translateChangeEnd\", renderMarkItUp);\n element.on(\"keypress\", function(event) {\n return $scope.$apply();\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return unbind();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgMarkitup\", [\"$rootScope\", \"$tgResources\", \"$selectedText\", \"$tgTemplate\", \"$compile\", \"$translate\", MarkitupDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog/main.coffee\n */\n\n(function() {\n var BacklogFiltersDirective, bindOnce, debounceLeading, groupBy, mixOf, module, scopeDefer, taiga, toggleText;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n debounceLeading = this.taiga.debounceLeading;\n\n module = angular.module(\"taigaBacklog\");\n\n BacklogFiltersDirective = function($q, $log, $location, $templates) {\n var link, template, templateSelected;\n template = $templates.get(\"backlog/filters.html\", true);\n templateSelected = $templates.get(\"backlog/filter-selected.html\", true);\n link = function($scope, $el, $attrs) {\n var $ctrl, currentFiltersType, getFiltersType, initializeSelectedFilters, reloadUserstories, renderFilters, renderSelectedFilters, selectQFilter, selectedFilters, showCategories, showFilters, toggleFilterSelection;\n currentFiltersType = '';\n $ctrl = $el.closest(\".wrapper\").controller();\n selectedFilters = [];\n showFilters = function(title, type) {\n $el.find(\".filters-cats\").hide();\n $el.find(\".filter-list\").removeClass(\"hidden\");\n $el.find(\"h2.breadcrumb\").removeClass(\"hidden\");\n $el.find(\"h2 a.subfilter span.title\").html(title);\n $el.find(\"h2 a.subfilter span.title\").prop(\"data-type\", type);\n return currentFiltersType = getFiltersType();\n };\n showCategories = function() {\n $el.find(\".filters-cats\").show();\n $el.find(\".filter-list\").addClass(\"hidden\");\n return $el.find(\"h2.breadcrumb\").addClass(\"hidden\");\n };\n initializeSelectedFilters = function() {\n var i, len, name, ref, val, values;\n showCategories();\n selectedFilters = [];\n ref = $scope.filters;\n for (name in ref) {\n values = ref[name];\n for (i = 0, len = values.length; i < len; i++) {\n val = values[i];\n if (val.selected) {\n selectedFilters.push(val);\n }\n }\n }\n return renderSelectedFilters();\n };\n renderSelectedFilters = function() {\n var html;\n _.map(selectedFilters, (function(_this) {\n return function(f) {\n if (f.color) {\n return f.style = \"border-left: 3px solid \" + f.color;\n }\n };\n })(this));\n html = templateSelected({\n filters: selectedFilters\n });\n return $el.find(\".filters-applied\").html(html);\n };\n renderFilters = function(filters) {\n var html;\n _.map(filters, (function(_this) {\n return function(f) {\n if (f.color) {\n return f.style = \"border-left: 3px solid \" + f.color;\n }\n };\n })(this));\n html = template({\n filters: filters\n });\n return $el.find(\".filter-list\").html(html);\n };\n getFiltersType = function() {\n return $el.find(\"h2 a.subfilter span.title\").prop('data-type');\n };\n reloadUserstories = function() {\n currentFiltersType = getFiltersType();\n return $q.all([$ctrl.loadUserstories(), $ctrl.generateFilters()]).then(function() {\n var currentFilters;\n currentFilters = $scope.filters[currentFiltersType];\n return renderFilters(_.reject(currentFilters, \"selected\"));\n });\n };\n toggleFilterSelection = function(type, id) {\n var filter, filters;\n currentFiltersType = getFiltersType();\n filters = $scope.filters[type];\n filter = _.find(filters, {\n id: id\n });\n filter.selected = !filter.selected;\n if (filter.selected) {\n selectedFilters.push(filter);\n $scope.$apply(function() {\n return $ctrl.selectFilter(type, id);\n });\n } else {\n selectedFilters = _.reject(selectedFilters, function(selected) {\n return filter.type === selected.type && filter.id === selected.id;\n });\n $ctrl.unselectFilter(type, id);\n }\n renderSelectedFilters(selectedFilters);\n if (type === currentFiltersType) {\n renderFilters(_.reject(filters, \"selected\"));\n }\n return reloadUserstories();\n };\n selectQFilter = debounceLeading(100, function(value) {\n if (value === void 0) {\n return;\n }\n if (value.length === 0) {\n $ctrl.replaceFilter(\"q\", null);\n } else {\n $ctrl.replaceFilter(\"q\", value);\n }\n return reloadUserstories();\n });\n $scope.$watch(\"filtersQ\", selectQFilter);\n $scope.$on(\"backlog:loaded\", function(ctx) {\n return initializeSelectedFilters();\n });\n $scope.$on(\"filters:update\", function(ctx) {\n return $ctrl.generateFilters().then(function() {\n var filters;\n filters = $scope.filters[currentFiltersType];\n if (currentFiltersType) {\n return renderFilters(_.reject(filters, \"selected\"));\n }\n });\n });\n $el.on(\"click\", \".filters-cats > ul > li > a\", function(event) {\n var tags, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n tags = $scope.filters[target.data(\"type\")];\n renderFilters(_.reject(tags, \"selected\"));\n return showFilters(target.attr(\"title\"), target.data('type'));\n });\n $el.on(\"click\", \".filters-inner > .filters-step-cat > .breadcrumb > .back\", function(event) {\n event.preventDefault();\n return showCategories();\n });\n $el.on(\"click\", \".filters-applied a\", function(event) {\n var id, target, type;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n id = target.data(\"id\");\n type = target.data(\"type\");\n return toggleFilterSelection(type, id);\n });\n return $el.on(\"click\", \".filter-list .single-filter\", function(event) {\n var id, target, type;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n if (target.hasClass(\"active\")) {\n target.removeClass(\"active\");\n } else {\n target.addClass(\"active\");\n }\n id = target.data(\"id\");\n type = target.data(\"type\");\n return toggleFilterSelection(type, id);\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogFilters\", [\"$q\", \"$log\", \"$tgLocation\", \"$tgTemplate\", BacklogFiltersDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog/lightboxes.coffee\n */\n\n(function() {\n var CreateEditSprint, bindOnce, debounce, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaBacklog\");\n\n CreateEditSprint = function($repo, $confirm, $rs, $rootscope, lightboxService, $loading, $translate) {\n var link;\n link = function($scope, $el, attrs) {\n var createSprint, getLastSprint, hasErrors, remove, resetSprint, submit;\n hasErrors = false;\n createSprint = true;\n resetSprint = function() {\n return $scope.sprint = {\n project: null,\n name: null,\n estimated_start: null,\n estimated_finish: null\n };\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var broadcastEvent, currentLoading, form, newSprint, prettyDate, promise, submitButton, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n submitButton = $el.find(\".submit-button\");\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n hasErrors = true;\n $el.find(\".last-sprint-name\").addClass(\"disappear\");\n return;\n }\n hasErrors = false;\n newSprint = angular.copy($scope.sprint);\n broadcastEvent = null;\n if (createSprint) {\n newSprint.estimated_start = moment(newSprint.estimated_start, prettyDate).format(\"YYYY-MM-DD\");\n newSprint.estimated_finish = moment(newSprint.estimated_finish, prettyDate).format(\"YYYY-MM-DD\");\n promise = $repo.create(\"milestones\", newSprint);\n broadcastEvent = \"sprintform:create:success\";\n } else {\n newSprint.setAttr(\"estimated_start\", moment(newSprint.estimated_start, prettyDate).format(\"YYYY-MM-DD\"));\n newSprint.setAttr(\"estimated_finish\", moment(newSprint.estimated_finish, prettyDate).format(\"YYYY-MM-DD\"));\n promise = $repo.save(newSprint);\n broadcastEvent = \"sprintform:edit:success\";\n }\n currentLoading = $loading().target(submitButton).start();\n promise.then(function(data) {\n currentLoading.finish();\n if (createSprint) {\n $scope.sprintsCounter += 1;\n }\n $rootscope.$broadcast(broadcastEvent, data);\n return lightboxService.close($el);\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"light-error\", data._error_message);\n } else if (data.__all__) {\n return $confirm.notify(\"light-error\", data.__all__[0]);\n }\n });\n };\n })(this));\n remove = function() {\n var message, title;\n title = $translate.instant(\"LIGHTBOX.DELETE_SPRINT.TITLE\");\n message = $scope.sprint.name;\n return $confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var onError, onSuccess;\n onSuccess = function() {\n askResponse.finish();\n $scope.milestonesCounter -= 1;\n lightboxService.close($el);\n return $rootscope.$broadcast(\"sprintform:remove:success\", $scope.sprint);\n };\n onError = function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n };\n return $repo.remove($scope.sprint).then(onSuccess, onError);\n };\n })(this));\n };\n getLastSprint = function() {\n var openSprints, sortedSprints;\n openSprints = _.filter($scope.sprints, function(sprint) {\n return !sprint.closed;\n });\n sortedSprints = _.sortBy(openSprints, function(sprint) {\n return moment(sprint.estimated_finish, 'YYYY-MM-DD').format('X');\n });\n return sortedSprints[sortedSprints.length - 1];\n };\n $scope.$on(\"sprintform:create\", function(event, projectId) {\n var estimatedFinish, estimatedStart, form, lastSprint, lastSprintNameDom, prettyDate, text;\n resetSprint();\n form = $el.find(\"form\").checksley();\n form.reset();\n createSprint = true;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n $scope.sprint.project = projectId;\n $scope.sprint.name = null;\n $scope.sprint.slug = null;\n lastSprint = getLastSprint();\n estimatedStart = moment();\n if (lastSprint) {\n estimatedStart = moment(lastSprint.estimated_finish);\n } else if ($scope.sprint.estimated_start) {\n estimatedStart = moment($scope.sprint.estimated_start);\n }\n $scope.sprint.estimated_start = estimatedStart.format(prettyDate);\n estimatedFinish = moment().add(2, \"weeks\");\n if (lastSprint) {\n estimatedFinish = moment(lastSprint.estimated_finish).add(2, \"weeks\");\n } else if ($scope.sprint.estimated_finish) {\n estimatedFinish = moment($scope.sprint.estimated_finish);\n }\n $scope.sprint.estimated_finish = estimatedFinish.format(prettyDate);\n lastSprintNameDom = $el.find(\".last-sprint-name\");\n if ((lastSprint != null ? lastSprint.name : void 0) != null) {\n text = $translate.instant(\"LIGHTBOX.ADD_EDIT_SPRINT.LAST_SPRINT_NAME\", {\n lastSprint: lastSprint.name\n });\n lastSprintNameDom.html(text);\n }\n $el.find(\".delete-sprint\").addClass(\"hidden\");\n text = $translate.instant(\"LIGHTBOX.ADD_EDIT_SPRINT.TITLE\");\n $el.find(\".title\").text(text);\n text = $translate.instant(\"COMMON.CREATE\");\n $el.find(\".button-green\").text(text);\n lightboxService.open($el);\n $el.find(\".sprint-name\").focus();\n return $el.find(\".last-sprint-name\").removeClass(\"disappear\");\n });\n $scope.$on(\"sprintform:edit\", function(ctx, sprint) {\n var editSprint, prettyDate, save;\n resetSprint();\n createSprint = false;\n prettyDate = $translate.instant(\"COMMON.PICKERDATE.FORMAT\");\n $scope.$apply(function() {\n $scope.sprint = sprint;\n $scope.sprint.estimated_start = moment($scope.sprint.estimated_start).format(prettyDate);\n return $scope.sprint.estimated_finish = moment($scope.sprint.estimated_finish).format(prettyDate);\n });\n $el.find(\".delete-sprint\").removeClass(\"hidden\");\n editSprint = $translate.instant(\"BACKLOG.EDIT_SPRINT\");\n $el.find(\".title\").text(editSprint);\n save = $translate.instant(\"COMMON.SAVE\");\n $el.find(\".button-green\").text(save);\n lightboxService.open($el);\n $el.find(\".sprint-name\").focus().select();\n return $el.find(\".last-sprint-name\").addClass(\"disappear\");\n });\n $el.on(\"keyup\", \".sprint-name\", function(event) {\n if ($el.find(\".sprint-name\").val().length > 0 || hasErrors) {\n return $el.find(\".last-sprint-name\").addClass(\"disappear\");\n } else {\n return $el.find(\".last-sprint-name\").removeClass(\"disappear\");\n }\n });\n $el.on(\"submit\", \"form\", submit);\n $el.on(\"click\", \".delete-sprint .icon-delete\", function(event) {\n event.preventDefault();\n return remove();\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return resetSprint();\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateEditSprint\", [\"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$rootScope\", \"lightboxService\", \"$tgLoading\", \"$translate\", CreateEditSprint]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog/main.coffee\n */\n\n(function() {\n var BacklogController, BacklogDirective, BurndownBacklogGraphDirective, TgBacklogProgressBarDirective, ToggleBurndownVisibility, UsPointsDirective, UsRolePointsSelectorDirective, bindMethods, bindOnce, generateHash, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n timeout = this.taiga.timeout;\n\n bindMethods = this.taiga.bindMethods;\n\n generateHash = this.taiga.generateHash;\n\n module = angular.module(\"taigaBacklog\");\n\n BacklogController = (function(superClass) {\n extend(BacklogController, superClass);\n\n BacklogController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\", \"$tgLoading\", \"tgResources\"];\n\n function BacklogController(scope1, rootscope, repo, confirm, rs, params1, q, location, appMetaService, navUrls, events, analytics, translate, loading, rs2) {\n var promise;\n this.scope = scope1;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params1;\n this.q = q;\n this.location = location;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.events = events;\n this.analytics = analytics;\n this.translate = translate;\n this.loading = loading;\n this.rs2 = rs2;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"BACKLOG.SECTION_NAME\");\n this.showTags = false;\n this.activeFilters = false;\n this.scope.showGraphPlaceholder = null;\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"BACKLOG.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.translate.instant(\"BACKLOG.PAGE_DESCRIPTION\", {\n projectName: _this.scope.project.name,\n projectDescription: _this.scope.project.description\n });\n _this.appMetaService.setAll(title, description);\n if (_this.rs.userstories.getShowTags(_this.scope.projectId)) {\n _this.showTags = true;\n return _this.scope.$broadcast(\"showTags\", _this.showTags);\n }\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n BacklogController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"usform:bulk:success\", (function(_this) {\n return function() {\n _this.loadUserstories();\n _this.loadProjectStats();\n return _this.analytics.trackEvent(\"userstory\", \"create\", \"bulk create userstory on backlog\", 1);\n };\n })(this));\n this.scope.$on(\"sprintform:create:success\", (function(_this) {\n return function() {\n _this.loadSprints();\n _this.loadProjectStats();\n return _this.analytics.trackEvent(\"sprint\", \"create\", \"create sprint on backlog\", 1);\n };\n })(this));\n this.scope.$on(\"usform:new:success\", (function(_this) {\n return function() {\n _this.loadUserstories();\n _this.loadProjectStats();\n _this.rootscope.$broadcast(\"filters:update\");\n return _this.analytics.trackEvent(\"userstory\", \"create\", \"create userstory on backlog\", 1);\n };\n })(this));\n this.scope.$on(\"sprintform:edit:success\", (function(_this) {\n return function() {\n return _this.loadProjectStats();\n };\n })(this));\n this.scope.$on(\"sprintform:remove:success\", (function(_this) {\n return function(event, sprint) {\n _this.loadSprints();\n _this.loadProjectStats();\n _this.loadUserstories();\n if (sprint.closed) {\n _this.loadClosedSprints();\n }\n return _this.rootscope.$broadcast(\"filters:update\");\n };\n })(this));\n this.scope.$on(\"usform:edit:success\", (function(_this) {\n return function() {\n _this.loadUserstories();\n return _this.rootscope.$broadcast(\"filters:update\");\n };\n })(this));\n this.scope.$on(\"sprint:us:move\", this.moveUs);\n this.scope.$on(\"sprint:us:moved\", this.loadSprints);\n this.scope.$on(\"sprint:us:moved\", this.loadProjectStats);\n this.scope.$on(\"backlog:load-closed-sprints\", this.loadClosedSprints);\n return this.scope.$on(\"backlog:unload-closed-sprints\", this.unloadClosedSprints);\n };\n\n BacklogController.prototype.initializeSubscription = function() {\n var routingKey1, routingKey2;\n routingKey1 = \"changes.project.\" + this.scope.projectId + \".userstories\";\n this.events.subscribe(this.scope, routingKey1, (function(_this) {\n return function(message) {\n _this.loadUserstories();\n return _this.loadSprints();\n };\n })(this));\n routingKey2 = \"changes.project.\" + this.scope.projectId + \".milestones\";\n return this.events.subscribe(this.scope, routingKey2, (function(_this) {\n return function(message) {\n return _this.loadSprints();\n };\n })(this));\n };\n\n BacklogController.prototype.toggleShowTags = function() {\n return this.scope.$apply((function(_this) {\n return function() {\n _this.showTags = !_this.showTags;\n return _this.rs.userstories.storeShowTags(_this.scope.projectId, _this.showTags);\n };\n })(this));\n };\n\n BacklogController.prototype.toggleActiveFilters = function() {\n return this.activeFilters = !this.activeFilters;\n };\n\n BacklogController.prototype.loadProjectStats = function() {\n return this.rs.projects.stats(this.scope.projectId).then((function(_this) {\n return function(stats) {\n var totalPoints;\n _this.scope.stats = stats;\n totalPoints = stats.total_points ? stats.total_points : stats.defined_points;\n if (totalPoints) {\n _this.scope.stats.completedPercentage = Math.round(100 * stats.closed_points / totalPoints);\n } else {\n _this.scope.stats.completedPercentage = 0;\n }\n _this.scope.showGraphPlaceholder = !((stats.total_points != null) && (stats.total_milestones != null));\n return stats;\n };\n })(this));\n };\n\n BacklogController.prototype.unloadClosedSprints = function() {\n return this.scope.$apply((function(_this) {\n return function() {\n _this.scope.closedSprints = [];\n return _this.rootscope.$broadcast(\"closed-sprints:reloaded\", []);\n };\n })(this));\n };\n\n BacklogController.prototype.loadClosedSprints = function() {\n var params;\n params = {\n closed: true\n };\n return this.rs.sprints.list(this.scope.projectId, params).then((function(_this) {\n return function(result) {\n var j, len, sprint, sprints;\n sprints = result.milestones;\n _this.scope.totalClosedMilestones = result.closed;\n for (j = 0, len = sprints.length; j < len; j++) {\n sprint = sprints[j];\n sprint.user_stories = _.sortBy(sprint.user_stories, \"sprint_order\");\n }\n _this.scope.closedSprints = sprints;\n _this.scope.closedSprintsById = groupBy(sprints, function(x) {\n return x.id;\n });\n _this.rootscope.$broadcast(\"closed-sprints:reloaded\", sprints);\n return sprints;\n };\n })(this));\n };\n\n BacklogController.prototype.loadSprints = function() {\n var params;\n params = {\n closed: false\n };\n return this.rs.sprints.list(this.scope.projectId, params).then((function(_this) {\n return function(result) {\n var j, len, sprint, sprints;\n sprints = result.milestones;\n _this.scope.totalMilestones = sprints;\n _this.scope.totalClosedMilestones = result.closed;\n _this.scope.totalOpenMilestones = result.open;\n _this.scope.totalMilestones = _this.scope.totalOpenMilestones + _this.scope.totalClosedMilestones;\n for (j = 0, len = sprints.length; j < len; j++) {\n sprint = sprints[j];\n sprint.user_stories = _.sortBy(sprint.user_stories, \"sprint_order\");\n }\n _this.scope.sprints = sprints;\n _this.scope.openSprints = _.filter(sprints, function(sprint) {\n return !sprint.closed;\n }).reverse();\n if (!_this.scope.closedSprints) {\n _this.scope.closedSprints = [];\n }\n _this.scope.sprintsCounter = sprints.length;\n _this.scope.sprintsById = groupBy(sprints, function(x) {\n return x.id;\n });\n _this.rootscope.$broadcast(\"sprints:loaded\", sprints);\n _this.scope.currentSprint = _this.findCurrentSprint();\n return sprints;\n };\n })(this));\n };\n\n BacklogController.prototype.restoreFilters = function() {\n var selectedStatuses, selectedTags;\n selectedTags = this.scope.oldSelectedTags;\n selectedStatuses = this.scope.oldSelectedStatuses;\n if (!selectedStatuses && !selectedStatuses) {\n return;\n }\n this.scope.filtersQ = this.scope.filtersQOld;\n this.replaceFilter(\"q\", this.scope.filtersQ);\n _.each([selectedTags, selectedStatuses], (function(_this) {\n return function(filterGrp) {\n return _.each(filterGrp, function(item) {\n var filter, filters;\n filters = _this.scope.filters[item.type];\n filter = _.find(filters, {\n id: item.id\n });\n filter.selected = true;\n return _this.selectFilter(item.type, item.id);\n });\n };\n })(this));\n return this.loadUserstories();\n };\n\n BacklogController.prototype.resetFilters = function() {\n var selectedStatuses, selectedTags;\n selectedTags = _.filter(this.scope.filters.tags, \"selected\");\n selectedStatuses = _.filter(this.scope.filters.status, \"selected\");\n this.scope.oldSelectedTags = selectedTags;\n this.scope.oldSelectedStatuses = selectedStatuses;\n this.scope.filtersQOld = this.scope.filtersQ;\n this.scope.filtersQ = void 0;\n this.replaceFilter(\"q\", this.scope.filtersQ);\n _.each([selectedTags, selectedStatuses], (function(_this) {\n return function(filterGrp) {\n return _.each(filterGrp, function(item) {\n var filter, filters;\n filters = _this.scope.filters[item.type];\n filter = _.find(filters, {\n id: item.id\n });\n filter.selected = false;\n return _this.unselectFilter(item.type, item.id);\n });\n };\n })(this));\n return this.loadUserstories();\n };\n\n BacklogController.prototype.loadUserstories = function() {\n var promise;\n this.scope.httpParams = this.getUrlFilters();\n this.rs.userstories.storeQueryParams(this.scope.projectId, this.scope.httpParams);\n promise = this.rs.userstories.listUnassigned(this.scope.projectId, this.scope.httpParams);\n return promise.then((function(_this) {\n return function(userstories) {\n _this.scope.userstories = _.sortBy(userstories, \"backlog_order\");\n _this.setSearchDataFilters();\n scopeDefer(_this.scope, function() {\n return _this.scope.$broadcast(\"userstories:loaded\");\n });\n return userstories;\n };\n })(this));\n };\n\n BacklogController.prototype.loadBacklog = function() {\n return this.q.all([this.loadProjectStats(), this.loadSprints(), this.loadUserstories()]);\n };\n\n BacklogController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n if (!project.is_backlog_activated) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.closedMilestones = !!project.total_closed_milestones;\n _this.scope.$emit('project:loaded', project);\n _this.scope.points = _.sortBy(project.points, \"order\");\n _this.scope.pointsById = groupBy(project.points, function(x) {\n return x.id;\n });\n _this.scope.usStatusById = groupBy(project.us_statuses, function(x) {\n return x.id;\n });\n _this.scope.usStatusList = _.sortBy(project.us_statuses, \"id\");\n return project;\n };\n })(this));\n };\n\n BacklogController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n promise.then((function(_this) {\n return function(project) {\n _this.fillUsersAndRoles(project.members, project.roles);\n return _this.initializeSubscription();\n };\n })(this));\n return promise.then((function(_this) {\n return function() {\n return _this.loadBacklog();\n };\n })(this)).then((function(_this) {\n return function() {\n return _this.generateFilters();\n };\n })(this)).then((function(_this) {\n return function() {\n return _this.scope.$emit(\"backlog:loaded\");\n };\n })(this));\n };\n\n BacklogController.prototype.prepareBulkUpdateData = function(uses, field) {\n if (field == null) {\n field = \"backlog_order\";\n }\n return _.map(uses, function(x) {\n return {\n \"us_id\": x.id,\n \"order\": x[field]\n };\n });\n };\n\n BacklogController.prototype.resortUserStories = function(uses, field) {\n var index, item, items, j, len;\n if (field == null) {\n field = \"backlog_order\";\n }\n items = [];\n for (index = j = 0, len = uses.length; j < len; index = ++j) {\n item = uses[index];\n item[field] = index;\n if (item.isModified()) {\n items.push(item);\n }\n }\n return items;\n };\n\n BacklogController.prototype.moveUs = function(ctx, usList, newUsIndex, newSprintId) {\n var data, items, j, l, len, len1, len2, m, movedFromClosedSprint, movedToClosedSprint, newSprint, oldSprintId, project, promise, promises, sprint, us, userstories;\n oldSprintId = usList[0].milestone;\n project = usList[0].project;\n movedFromClosedSprint = false;\n movedToClosedSprint = false;\n sprint = this.scope.sprintsById[oldSprintId];\n if (!sprint && this.scope.closedSprintsById) {\n sprint = this.scope.closedSprintsById[oldSprintId];\n if (sprint) {\n movedFromClosedSprint = true;\n }\n }\n newSprint = this.scope.sprintsById[newSprintId];\n if (!newSprint && newSprintId) {\n newSprint = this.scope.closedSprintsById[newSprintId];\n if (newSprint) {\n movedToClosedSprint = true;\n }\n }\n if (newSprintId === oldSprintId) {\n items = null;\n userstories = null;\n if (newSprintId === null) {\n userstories = this.scope.userstories;\n } else {\n userstories = newSprint.user_stories;\n }\n this.scope.$apply(function() {\n var args, j, key, len, r, us;\n for (key = j = 0, len = usList.length; j < len; key = ++j) {\n us = usList[key];\n r = userstories.indexOf(us);\n userstories.splice(r, 1);\n }\n args = [newUsIndex, 0].concat(usList);\n return Array.prototype.splice.apply(userstories, args);\n });\n if (newSprintId === null) {\n items = this.resortUserStories(userstories, \"backlog_order\");\n data = this.prepareBulkUpdateData(items, \"backlog_order\");\n this.rs.userstories.bulkUpdateBacklogOrder(project, data).then((function(_this) {\n return function() {\n var j, len, results, us;\n results = [];\n for (j = 0, len = usList.length; j < len; j++) {\n us = usList[j];\n results.push(_this.rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId));\n }\n return results;\n };\n })(this));\n } else {\n items = this.resortUserStories(userstories, \"sprint_order\");\n data = this.prepareBulkUpdateData(items, \"sprint_order\");\n this.rs.userstories.bulkUpdateSprintOrder(project, data).then((function(_this) {\n return function() {\n var j, len, results, us;\n results = [];\n for (j = 0, len = usList.length; j < len; j++) {\n us = usList[j];\n results.push(_this.rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId));\n }\n return results;\n };\n })(this));\n }\n return promise;\n }\n if (newSprintId === null) {\n for (j = 0, len = usList.length; j < len; j++) {\n us = usList[j];\n us.milestone = null;\n }\n this.scope.$apply((function(_this) {\n return function() {\n var args, key, l, len1, r, results;\n args = [newUsIndex, 0].concat(usList);\n Array.prototype.splice.apply(_this.scope.userstories, args);\n results = [];\n for (key = l = 0, len1 = usList.length; l < len1; key = ++l) {\n us = usList[key];\n r = sprint.user_stories.indexOf(us);\n results.push(sprint.user_stories.splice(r, 1));\n }\n return results;\n };\n })(this));\n promise = this.repo.save(us);\n promise = promise.then((function(_this) {\n return function() {\n items = _this.resortUserStories(_this.scope.userstories, \"backlog_order\");\n data = _this.prepareBulkUpdateData(items, \"backlog_order\");\n return _this.rs.userstories.bulkUpdateBacklogOrder(us.project, data).then(function() {\n _this.rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId);\n if (movedFromClosedSprint) {\n return _this.rootscope.$broadcast(\"backlog:load-closed-sprints\");\n }\n });\n };\n })(this));\n promise.then(null, function() {\n return console.log(\"FAIL\");\n });\n return promise;\n }\n if (oldSprintId === null) {\n for (l = 0, len1 = usList.length; l < len1; l++) {\n us = usList[l];\n us.milestone = newSprintId;\n }\n this.scope.$apply((function(_this) {\n return function() {\n var args, key, len2, m, r, results;\n args = [newUsIndex, 0].concat(usList);\n Array.prototype.splice.apply(newSprint.user_stories, args);\n results = [];\n for (key = m = 0, len2 = usList.length; m < len2; key = ++m) {\n us = usList[key];\n r = _this.scope.userstories.indexOf(us);\n results.push(_this.scope.userstories.splice(r, 1));\n }\n return results;\n };\n })(this));\n } else {\n for (m = 0, len2 = usList.length; m < len2; m++) {\n us = usList[m];\n us.milestone = newSprintId;\n }\n this.scope.$apply((function(_this) {\n return function() {\n var args, len3, n, r, results;\n args = [newUsIndex, 0].concat(usList);\n Array.prototype.splice.apply(newSprint.user_stories, args);\n results = [];\n for (n = 0, len3 = usList.length; n < len3; n++) {\n us = usList[n];\n r = sprint.user_stories.indexOf(us);\n results.push(sprint.user_stories.splice(r, 1));\n }\n return results;\n };\n })(this));\n }\n promises = _.map(usList, (function(_this) {\n return function(us) {\n return _this.repo.save(us);\n };\n })(this));\n promise = this.q.all(promises).then((function(_this) {\n return function() {\n items = _this.resortUserStories(newSprint.user_stories, \"sprint_order\");\n data = _this.prepareBulkUpdateData(items, \"sprint_order\");\n _this.rs.userstories.bulkUpdateSprintOrder(project, data).then(function(result) {\n return _this.rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId);\n });\n _this.rs.userstories.bulkUpdateBacklogOrder(project, data).then(function() {\n var len3, n, results;\n results = [];\n for (n = 0, len3 = usList.length; n < len3; n++) {\n us = usList[n];\n results.push(_this.rootscope.$broadcast(\"sprint:us:moved\", us, oldSprintId, newSprintId));\n }\n return results;\n });\n if (movedToClosedSprint || movedFromClosedSprint) {\n return _this.scope.$broadcast(\"backlog:load-closed-sprints\");\n }\n };\n })(this));\n promise.then(null, function() {\n return console.log(\"FAIL\");\n });\n return promise;\n };\n\n BacklogController.prototype.isFilterSelected = function(type, id) {\n if ((this.searchdata[type] != null) && this.searchdata[type][id]) {\n return true;\n }\n return false;\n };\n\n BacklogController.prototype.setSearchDataFilters = function() {\n var name, results, urlfilters, val, value;\n urlfilters = this.getUrlFilters();\n if (urlfilters.q) {\n this.scope.filtersQ = this.scope.filtersQ || urlfilters.q;\n }\n this.searchdata = {};\n results = [];\n for (name in urlfilters) {\n value = urlfilters[name];\n if (this.searchdata[name] == null) {\n this.searchdata[name] = {};\n }\n results.push((function() {\n var j, len, ref1, results1;\n ref1 = taiga.toString(value).split(\",\");\n results1 = [];\n for (j = 0, len = ref1.length; j < len; j++) {\n val = ref1[j];\n results1.push(this.searchdata[name][val] = true);\n }\n return results1;\n }).call(this));\n }\n return results;\n };\n\n BacklogController.prototype.getUrlFilters = function() {\n return _.pick(this.location.search(), \"status\", \"tags\", \"q\");\n };\n\n BacklogController.prototype.generateFilters = function() {\n var loadFilters, urlfilters;\n urlfilters = this.getUrlFilters();\n this.scope.filters = {};\n loadFilters = {};\n loadFilters.project = this.scope.projectId;\n loadFilters.tags = urlfilters.tags;\n loadFilters.status = urlfilters.status;\n loadFilters.q = urlfilters.q;\n loadFilters.milestone = 'null';\n return this.rs.userstories.filtersData(loadFilters).then((function(_this) {\n return function(data) {\n var choicesFiltersFormat, selectedStatuses, selectedTags, tagsFilterFormat;\n choicesFiltersFormat = function(choices, type, byIdObject) {\n return _.map(choices, function(t) {\n t.type = type;\n return t;\n });\n };\n tagsFilterFormat = function(tags) {\n return _.map(tags, function(t) {\n t.id = t.name;\n t.type = 'tags';\n return t;\n });\n };\n _this.scope.filters.status = choicesFiltersFormat(data.statuses, \"status\", _this.scope.usStatusById);\n _this.scope.filters.tags = tagsFilterFormat(data.tags);\n selectedTags = _.filter(_this.scope.filters.tags, \"selected\");\n selectedTags = _.map(selectedTags, \"id\");\n selectedStatuses = _.filter(_this.scope.filters.status, \"selected\");\n selectedStatuses = _.map(selectedStatuses, \"id\");\n _this.markSelectedFilters(_this.scope.filters, urlfilters);\n return _this.rs.userstories.storeQueryParams(_this.scope.projectId, {\n \"status\": selectedStatuses,\n \"tags\": selectedTags,\n \"project\": _this.scope.projectId,\n \"milestone\": null\n });\n };\n })(this));\n };\n\n BacklogController.prototype.markSelectedFilters = function(filters, urlfilters) {\n var isSelected, j, key, len, name, obj, ref1, ref2, results, searchdata, val, value;\n searchdata = {};\n ref1 = _.omit(urlfilters, \"page\", \"orderBy\");\n for (name in ref1) {\n value = ref1[name];\n if (searchdata[name] == null) {\n searchdata[name] = {};\n }\n ref2 = (\"\" + value).split(\",\");\n for (j = 0, len = ref2.length; j < len; j++) {\n val = ref2[j];\n searchdata[name][val] = true;\n }\n }\n isSelected = function(type, id) {\n if ((searchdata[type] != null) && searchdata[type][id]) {\n return true;\n }\n return false;\n };\n results = [];\n for (key in filters) {\n value = filters[key];\n results.push((function() {\n var l, len1, results1;\n results1 = [];\n for (l = 0, len1 = value.length; l < len1; l++) {\n obj = value[l];\n results1.push(obj.selected = isSelected(obj.type, obj.id) ? true : void 0);\n }\n return results1;\n })());\n }\n return results;\n };\n\n BacklogController.prototype.updateUserStoryStatus = function() {\n this.setSearchDataFilters();\n return this.generateFilters().then((function(_this) {\n return function() {\n _this.rootscope.$broadcast(\"filters:update\");\n return _this.loadProjectStats();\n };\n })(this));\n };\n\n BacklogController.prototype.editUserStory = function(projectId, ref, $event) {\n var currentLoading, target;\n target = $($event.target);\n currentLoading = this.loading().target(target).removeClasses(\"icon-edit\").timeout(200).start();\n return this.rs.userstories.getByRef(projectId, ref).then((function(_this) {\n return function(us) {\n return _this.rs2.attachments.list(\"us\", us.id, projectId).then(function(attachments) {\n _this.rootscope.$broadcast(\"usform:edit\", us, attachments.toJS());\n return currentLoading.finish();\n });\n };\n })(this));\n };\n\n BacklogController.prototype.deleteUserStory = function(us) {\n var message, title;\n title = this.translate.instant(\"US.TITLE_DELETE_ACTION\");\n message = us.subject;\n return this.confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var promise;\n _this.scope.userstories = _.without(_this.scope.userstories, us);\n promise = _this.repo.remove(us);\n promise.then(function() {\n askResponse.finish();\n return _this.loadBacklog();\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return _this.confirm.notify(\"error\");\n });\n };\n })(this));\n };\n\n BacklogController.prototype.addNewUs = function(type) {\n switch (type) {\n case \"standard\":\n return this.rootscope.$broadcast(\"usform:new\", this.scope.projectId, this.scope.project.default_us_status, this.scope.usStatusList);\n case \"bulk\":\n return this.rootscope.$broadcast(\"usform:bulk\", this.scope.projectId, this.scope.project.default_us_status);\n }\n };\n\n BacklogController.prototype.addNewSprint = function() {\n return this.rootscope.$broadcast(\"sprintform:create\", this.scope.projectId);\n };\n\n BacklogController.prototype.findCurrentSprint = function() {\n var currentDate;\n currentDate = new Date().getTime();\n return _.find(this.scope.sprints, function(sprint) {\n var end, start;\n start = moment(sprint.estimated_start, 'YYYY-MM-DD').format('x');\n end = moment(sprint.estimated_finish, 'YYYY-MM-DD').format('x');\n return currentDate >= start && currentDate <= end;\n });\n };\n\n return BacklogController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"BacklogController\", BacklogController);\n\n BacklogDirective = function($repo, $rootscope, $translate) {\n var doomLineTemplate, link, linkDoomLine, linkFilters, linkToolbar, showHideFilter, showHideTags;\n doomLineTemplate = _.template(\"
<%- text %>
\");\n linkDoomLine = function($scope, $el, $attrs, $ctrl) {\n var addDoomLineDom, getUsItems, reloadDoomLine, removeDoomlineDom;\n reloadDoomLine = function() {\n var current_sum, domElement, i, j, len, ref1, results, stats, total_points, us;\n if (($scope.stats != null) && ($scope.stats.total_points != null) && $scope.stats.total_points !== 0) {\n removeDoomlineDom();\n stats = $scope.stats;\n total_points = stats.total_points;\n current_sum = stats.assigned_points;\n if (!$scope.userstories) {\n return;\n }\n ref1 = $scope.userstories;\n results = [];\n for (i = j = 0, len = ref1.length; j < len; i = ++j) {\n us = ref1[i];\n current_sum += us.total_points;\n if (current_sum > total_points) {\n domElement = $el.find('.backlog-table-body .us-item-row')[i];\n addDoomLineDom(domElement);\n break;\n } else {\n results.push(void 0);\n }\n }\n return results;\n }\n };\n removeDoomlineDom = function() {\n return $el.find(\".doom-line\").remove();\n };\n addDoomLineDom = function(element) {\n var text;\n text = $translate.instant(\"BACKLOG.DOOMLINE\");\n return $(element).before(doomLineTemplate({\n \"text\": text\n }));\n };\n getUsItems = function() {\n var rowElements;\n rowElements = $el.find('.backlog-table-body .us-item-row');\n return _.map(rowElements, function(x) {\n return angular.element(x);\n });\n };\n $scope.$on(\"userstories:loaded\", reloadDoomLine);\n return $scope.$watch(\"stats\", reloadDoomLine);\n };\n linkToolbar = function($scope, $el, $attrs, $ctrl) {\n var checkSelected, getUsToMove, lastChecked, moveToCurrentSprint, moveToLatestSprint, moveUssToSprint, shiftPressed;\n getUsToMove = function() {\n var ussDom;\n ussDom = $el.find(\".backlog-table-body input:checkbox:checked\");\n return _.map(ussDom, function(item) {\n var itemScope;\n item = $(item).closest('.tg-scope');\n itemScope = item.scope();\n itemScope.us.milestone = $scope.sprints[0].id;\n return itemScope.us;\n });\n };\n moveUssToSprint = function(selectedUss, sprint) {\n var extraPoints, totalExtraPoints, ussCurrent;\n ussCurrent = _($scope.userstories);\n $scope.userstories = ussCurrent.without.apply(ussCurrent, selectedUss).value();\n extraPoints = _.map(selectedUss, function(v, k) {\n return v.total_points;\n });\n totalExtraPoints = _.reduce(extraPoints, function(acc, num) {\n return acc + num;\n });\n sprint.user_stories = _.union(sprint.user_stories, selectedUss);\n sprint.total_points += totalExtraPoints;\n $repo.saveAll(selectedUss).then(function() {\n $ctrl.loadSprints();\n return $ctrl.loadProjectStats();\n });\n return $el.find(\".move-to-sprint\").hide();\n };\n moveToCurrentSprint = function(selectedUss) {\n return moveUssToSprint(selectedUss, $scope.currentSprint);\n };\n moveToLatestSprint = function(selectedUss) {\n return moveUssToSprint(selectedUss, $scope.sprints[0]);\n };\n shiftPressed = false;\n lastChecked = null;\n checkSelected = function(target) {\n var moveToSprintDom, selectedUsDom;\n lastChecked = target.closest(\".us-item-row\");\n target.closest('.us-item-row').toggleClass('ui-multisortable-multiple');\n moveToSprintDom = $el.find(\".move-to-sprint\");\n selectedUsDom = $el.find(\".backlog-table-body input:checkbox:checked\");\n if (selectedUsDom.length > 0 && $scope.sprints.length > 0) {\n return moveToSprintDom.show();\n } else {\n return moveToSprintDom.hide();\n }\n };\n $(window).on(\"keydown.shift-pressed keyup.shift-pressed\", function(event) {\n shiftPressed = !!event.shiftKey;\n return true;\n });\n $el.on(\"change\", \".backlog-table-body input:checkbox\", function(event) {\n var current, elements, nextAll, prevAll, target;\n if (lastChecked && shiftPressed) {\n elements = [];\n current = $(event.currentTarget).closest(\".us-item-row\");\n nextAll = lastChecked.nextAll();\n prevAll = lastChecked.prevAll();\n if (_.some(nextAll, function(next) {\n return next === current[0];\n })) {\n elements = lastChecked.nextUntil(current);\n } else if (_.some(prevAll, function(prev) {\n return prev === current[0];\n })) {\n elements = lastChecked.prevUntil(current);\n }\n _.map(elements, function(elm) {\n var input;\n input = $(elm).find(\"input:checkbox\");\n input.prop('checked', true);\n return checkSelected(input);\n });\n }\n target = angular.element(event.currentTarget);\n target.closest(\".us-item-row\").toggleClass('is-checked');\n return checkSelected(target);\n });\n $el.on(\"click\", \"#move-to-latest-sprint\", (function(_this) {\n return function(event) {\n var ussToMove;\n ussToMove = getUsToMove();\n return $scope.$apply(_.partial(moveToLatestSprint, ussToMove));\n };\n })(this));\n $el.on(\"click\", \"#move-to-current-sprint\", (function(_this) {\n return function(event) {\n var ussToMove;\n ussToMove = getUsToMove();\n return $scope.$apply(_.partial(moveToCurrentSprint, ussToMove));\n };\n })(this));\n return $el.on(\"click\", \"#show-tags\", function(event) {\n event.preventDefault();\n $ctrl.toggleShowTags();\n return showHideTags($ctrl);\n });\n };\n showHideTags = function($ctrl) {\n var elm, text;\n elm = angular.element(\"#show-tags\");\n if ($ctrl.showTags) {\n elm.addClass(\"active\");\n text = $translate.instant(\"BACKLOG.TAGS.HIDE\");\n return elm.text(text);\n } else {\n elm.removeClass(\"active\");\n text = $translate.instant(\"BACKLOG.TAGS.SHOW\");\n return elm.text(text);\n }\n };\n showHideFilter = function($scope, $el, $ctrl) {\n var hideText, showText, sidebar, target;\n sidebar = $el.find(\"sidebar.filters-bar\");\n sidebar.one(\"transitionend\", function() {\n return timeout(150, function() {\n $rootscope.$broadcast(\"resize\");\n return $('.burndown').css(\"visibility\", \"visible\");\n });\n });\n target = angular.element(\"#show-filters-button\");\n $('.burndown').css(\"visibility\", \"hidden\");\n sidebar.toggleClass(\"active\");\n target.toggleClass(\"active\");\n hideText = $translate.instant(\"BACKLOG.FILTERS.HIDE\");\n showText = $translate.instant(\"BACKLOG.FILTERS.SHOW\");\n toggleText(target, [hideText, showText]);\n if (!sidebar.hasClass(\"active\")) {\n $ctrl.resetFilters();\n } else {\n $ctrl.restoreFilters();\n }\n return $ctrl.toggleActiveFilters();\n };\n linkFilters = function($scope, $el, $attrs, $ctrl) {\n $scope.filtersSearch = {};\n return $el.on(\"click\", \"#show-filters-button\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n return showHideFilter($scope, $el, $ctrl);\n });\n });\n };\n link = function($scope, $el, $attrs, $rootscope) {\n var $ctrl, filters;\n $ctrl = $el.controller();\n linkToolbar($scope, $el, $attrs, $ctrl);\n linkFilters($scope, $el, $attrs, $ctrl);\n linkDoomLine($scope, $el, $attrs, $ctrl);\n $el.find(\".backlog-table-body\").disableSelection();\n filters = $ctrl.getUrlFilters();\n if (filters.status || filters.tags || filters.q) {\n showHideFilter($scope, $el, $ctrl);\n }\n $scope.$on(\"showTags\", function() {\n return showHideTags($ctrl);\n });\n return $scope.$on(\"$destroy\", function() {\n $el.off();\n return $(window).off(\".shift-pressed\");\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklog\", [\"$tgRepo\", \"$rootScope\", \"$translate\", BacklogDirective]);\n\n UsRolePointsSelectorDirective = function($rootscope, $template, $compile, $translate) {\n var link, selectionTemplate;\n selectionTemplate = $template.get(\"backlog/us-role-points-popover.html\", true);\n link = function($scope, $el, $attrs) {\n bindOnce($scope, \"project\", function(project) {\n var numberOfRoles, roles;\n roles = _.filter(project.roles, \"computable\");\n numberOfRoles = _.size(roles);\n if (numberOfRoles > 1) {\n return $el.append($compile(selectionTemplate({\n \"roles\": roles\n }))($scope));\n } else {\n $el.find(\".icon-arrow-bottom\").remove();\n return $el.find(\".header-points\").addClass(\"not-clickable\");\n }\n });\n $scope.$on(\"uspoints:select\", function(ctx, roleId, roleName) {\n $el.find(\".popover\").popover().close();\n return $el.find(\".header-points\").html(roleName + \"/Total\");\n });\n $scope.$on(\"uspoints:clear-selection\", function(ctx, roleId) {\n var text;\n $el.find(\".popover\").popover().close();\n text = $translate.instant(\"COMMON.FIELDS.POINTS\");\n return $el.find(\".header-points\").text(text);\n });\n $el.on(\"click\", function(event) {\n var target;\n target = angular.element(event.target);\n if (target.is(\"span\") || target.is(\"div\")) {\n event.stopPropagation();\n }\n return $el.find(\".popover\").popover().open();\n });\n $el.on(\"click\", \".clear-selection\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $rootscope.$broadcast(\"uspoints:clear-selection\");\n });\n $el.on(\"click\", \".role\", function(event) {\n var rolScope, target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n rolScope = target.scope();\n return $rootscope.$broadcast(\"uspoints:select\", target.data(\"role-id\"), target.text());\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUsRolePointsSelector\", [\"$rootScope\", \"$tgTemplate\", \"$compile\", UsRolePointsSelectorDirective]);\n\n UsPointsDirective = function($tgEstimationsService, $repo, $tgTemplate) {\n var link, rolesTemplate;\n rolesTemplate = $tgTemplate.get(\"common/estimation/us-points-roles-popover.html\", true);\n link = function($scope, $el, $attrs) {\n var $ctrl, bindClickElements, estimationProcess, filteringRoleId, renderRolesSelector, selectedRoleId, updatingSelectedRoleId;\n $ctrl = $el.controller();\n updatingSelectedRoleId = null;\n selectedRoleId = null;\n filteringRoleId = null;\n estimationProcess = null;\n $scope.$on(\"uspoints:select\", function(ctx, roleId, roleName) {\n var us;\n us = $scope.$eval($attrs.tgBacklogUsPoints);\n selectedRoleId = roleId;\n return estimationProcess.render();\n });\n $scope.$on(\"uspoints:clear-selection\", function(ctx) {\n var us;\n us = $scope.$eval($attrs.tgBacklogUsPoints);\n selectedRoleId = null;\n return estimationProcess.render();\n });\n $scope.$watch($attrs.tgBacklogUsPoints, function(us) {\n var roles;\n if (us) {\n estimationProcess = $tgEstimationsService.create($el, us, $scope.project);\n roles = estimationProcess.calculateRoles();\n if (roles.length === 0) {\n $el.find(\".icon-arrow-bottom\").remove();\n $el.find(\"a.us-points\").addClass(\"not-clickable\");\n } else if (roles.length === 1) {\n selectedRoleId = _.keys(us.points)[0];\n }\n if (estimationProcess.isEditable) {\n bindClickElements();\n }\n estimationProcess.onSelectedPointForRole = function(roleId, pointId) {\n return this.save(roleId, pointId).then(function() {\n return $ctrl.loadProjectStats();\n });\n };\n estimationProcess.render = function() {\n var ctx, html, mainTemplate, pointId, pointObj, template, text, title, totalPoints;\n totalPoints = this.calculateTotalPoints();\n if ((selectedRoleId == null) || roles.length === 1) {\n text = totalPoints;\n title = totalPoints;\n } else {\n pointId = this.us.points[selectedRoleId];\n pointObj = this.pointsById[pointId];\n text = pointObj.name + \" / \" + totalPoints + \"\";\n title = pointObj.name + \" / \" + totalPoints;\n }\n ctx = {\n totalPoints: totalPoints,\n roles: this.calculateRoles(),\n editable: this.isEditable,\n text: text,\n title: title\n };\n mainTemplate = \"common/estimation/us-estimation-total.html\";\n template = $tgTemplate.get(mainTemplate, true);\n html = template(ctx);\n return this.$el.html(html);\n };\n return estimationProcess.render();\n }\n });\n renderRolesSelector = function() {\n var html, roles;\n roles = estimationProcess.calculateRoles();\n html = rolesTemplate({\n \"roles\": roles\n });\n $el.append(html);\n return $el.find(\".pop-role\").popover().open(function() {\n return $(this).remove();\n });\n };\n bindClickElements = function() {\n $el.on(\"click\", \"a.us-points span\", function(event) {\n var us;\n event.preventDefault();\n event.stopPropagation();\n us = $scope.$eval($attrs.tgBacklogUsPoints);\n updatingSelectedRoleId = selectedRoleId;\n if (selectedRoleId != null) {\n return estimationProcess.renderPointsSelector(selectedRoleId);\n } else {\n return renderRolesSelector();\n }\n });\n return $el.on(\"click\", \".role\", function(event) {\n var popRolesDom, target, us;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n us = $scope.$eval($attrs.tgBacklogUsPoints);\n updatingSelectedRoleId = target.data(\"role-id\");\n popRolesDom = $el.find(\".pop-role\");\n popRolesDom.find(\"a\").removeClass(\"active\");\n popRolesDom.find(\"a[data-role-id='\" + updatingSelectedRoleId + \"']\").addClass(\"active\");\n return estimationProcess.renderPointsSelector(updatingSelectedRoleId);\n });\n };\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogUsPoints\", [\"$tgEstimationsService\", \"$tgRepo\", \"$tgTemplate\", UsPointsDirective]);\n\n ToggleBurndownVisibility = function($storage) {\n var hide, link, show;\n hide = function() {\n $(\".js-burndown-graph\").removeClass(\"shown\");\n $(\".js-toggle-burndown-visibility-button\").removeClass(\"active\");\n return $(\".js-burndown-graph\").removeClass(\"open\");\n };\n show = function(firstLoad) {\n $(\".js-toggle-burndown-visibility-button\").addClass(\"active\");\n if (firstLoad) {\n return $(\".js-burndown-graph\").addClass(\"shown\");\n } else {\n return $(\".js-burndown-graph\").addClass(\"open\");\n }\n };\n link = function($scope, $el, $attrs) {\n var firstLoad, hash, toggleGraph;\n firstLoad = true;\n hash = generateHash([\"is-burndown-grpahs-collapsed\"]);\n $scope.isBurndownGraphCollapsed = $storage.get(hash) || false;\n toggleGraph = function() {\n if ($scope.isBurndownGraphCollapsed) {\n hide(firstLoad);\n } else {\n show(firstLoad);\n }\n return firstLoad = false;\n };\n $scope.$watch(\"showGraphPlaceholder\", function() {\n if ($scope.showGraphPlaceholder != null) {\n $scope.isBurndownGraphCollapsed = $scope.isBurndownGraphCollapsed || $scope.showGraphPlaceholder;\n return toggleGraph();\n }\n });\n $el.on(\"click\", \".js-toggle-burndown-visibility-button\", function() {\n $scope.isBurndownGraphCollapsed = !$scope.isBurndownGraphCollapsed;\n $storage.set(hash, $scope.isBurndownGraphCollapsed);\n return toggleGraph();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgToggleBurndownVisibility\", [\"$tgStorage\", ToggleBurndownVisibility]);\n\n BurndownBacklogGraphDirective = function($translate) {\n var link, redrawChart;\n redrawChart = function(element, dataToDraw) {\n var client_increment_line, colors, data, evolution_line, j, milestonesRange, optimal_line, options, ref1, results, team_increment_line, width, zero_line;\n width = element.width();\n element.height(width / 6);\n milestonesRange = (function() {\n results = [];\n for (var j = 0, ref1 = dataToDraw.milestones.length - 1; 0 <= ref1 ? j <= ref1 : j >= ref1; 0 <= ref1 ? j++ : j--){ results.push(j); }\n return results;\n }).apply(this);\n data = [];\n zero_line = _.map(dataToDraw.milestones, function(ml) {\n return 0;\n });\n data.push({\n data: _.zip(milestonesRange, zero_line),\n lines: {\n fillColor: \"rgba(0,0,0,0)\"\n },\n points: {\n show: false\n }\n });\n optimal_line = _.map(dataToDraw.milestones, function(ml) {\n return ml.optimal;\n });\n data.push({\n data: _.zip(milestonesRange, optimal_line),\n lines: {\n fillColor: \"rgba(120,120,120,0.2)\"\n }\n });\n evolution_line = _.filter(_.map(dataToDraw.milestones, function(ml) {\n return ml.evolution;\n }), function(evolution) {\n return evolution != null;\n });\n data.push({\n data: _.zip(milestonesRange, evolution_line),\n lines: {\n fillColor: \"rgba(102,153,51,0.3)\"\n }\n });\n client_increment_line = _.map(dataToDraw.milestones, function(ml) {\n return -ml[\"team-increment\"] - ml[\"client-increment\"];\n });\n data.push({\n data: _.zip(milestonesRange, client_increment_line),\n lines: {\n fillColor: \"rgba(255,51,51,0.3)\"\n }\n });\n team_increment_line = _.map(dataToDraw.milestones, function(ml) {\n return -ml[\"team-increment\"];\n });\n data.push({\n data: _.zip(milestonesRange, team_increment_line),\n lines: {\n fillColor: \"rgba(153,51,51,0.3)\"\n }\n });\n colors = [\"rgba(0,0,0,1)\", \"rgba(120,120,120,0.2)\", \"rgba(102,153,51,1)\", \"rgba(153,51,51,1)\", \"rgba(255,51,51,1)\"];\n options = {\n grid: {\n borderWidth: {\n top: 0,\n right: 1,\n left: 0,\n bottom: 0\n },\n borderColor: \"#ccc\",\n hoverable: true\n },\n xaxis: {\n ticks: dataToDraw.milestones.length,\n axisLabel: $translate.instant(\"BACKLOG.CHART.XAXIS_LABEL\"),\n axisLabelUseCanvas: true,\n axisLabelFontSizePixels: 12,\n axisLabelFontFamily: \"Verdana, Arial, Helvetica, Tahoma, sans-serif\",\n axisLabelPadding: 5,\n tickFormatter: function(val, axis) {\n return \"\";\n }\n },\n yaxis: {\n axisLabel: $translate.instant(\"BACKLOG.CHART.YAXIS_LABEL\"),\n axisLabelUseCanvas: true,\n axisLabelFontSizePixels: 12,\n axisLabelFontFamily: \"Verdana, Arial, Helvetica, Tahoma, sans-serif\",\n axisLabelPadding: 5\n },\n series: {\n shadowSize: 0,\n lines: {\n show: true,\n fill: true\n },\n points: {\n show: true,\n fill: true,\n radius: 4,\n lineWidth: 2\n }\n },\n colors: colors,\n tooltip: true,\n tooltipOpts: {\n content: function(label, xval, yval, flotItem) {\n var ctx;\n if (flotItem.seriesIndex === 1) {\n ctx = {\n sprintName: dataToDraw.milestones[xval].name,\n value: Math.abs(yval)\n };\n return $translate.instant(\"BACKLOG.CHART.OPTIMAL\", ctx);\n } else if (flotItem.seriesIndex === 2) {\n ctx = {\n sprintName: dataToDraw.milestones[xval].name,\n value: Math.abs(yval)\n };\n return $translate.instant(\"BACKLOG.CHART.REAL\", ctx);\n } else if (flotItem.seriesIndex === 3) {\n ctx = {\n sprintName: dataToDraw.milestones[xval].name,\n value: Math.abs(yval)\n };\n return $translate.instant(\"BACKLOG.CHART.INCREMENT_CLIENT\", ctx);\n } else {\n ctx = {\n sprintName: dataToDraw.milestones[xval].name,\n value: Math.abs(yval)\n };\n return $translate.instant(\"BACKLOG.CHART.INCREMENT_TEAM\", ctx);\n }\n }\n }\n };\n element.empty();\n return element.plot(data, options).data(\"plot\");\n };\n link = function($scope, $el, $attrs) {\n var element;\n element = angular.element($el);\n $scope.$watch(\"stats\", function(value) {\n if ($scope.stats != null) {\n redrawChart(element, $scope.stats);\n return $scope.$on(\"resize\", function() {\n return redrawChart(element, $scope.stats);\n });\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBurndownBacklogGraph\", [\"$translate\", BurndownBacklogGraphDirective]);\n\n TgBacklogProgressBarDirective = function($template, $compile) {\n var adjustPercentaje, link, render, template;\n template = $template.get(\"backlog/progress-bar.html\", true);\n render = function(scope, el, projectPointsPercentaje, closedPointsPercentaje) {\n var html;\n html = template({\n projectPointsPercentaje: projectPointsPercentaje,\n closedPointsPercentaje: closedPointsPercentaje\n });\n html = $compile(html)(scope);\n return el.html(html);\n };\n adjustPercentaje = function(percentage) {\n var adjusted;\n adjusted = _.max([0, percentage]);\n adjusted = _.min([100, adjusted]);\n return Math.round(adjusted);\n };\n link = function($scope, $el, $attrs) {\n var element;\n element = angular.element($el);\n $scope.$watch($attrs.tgBacklogProgressBar, function(stats) {\n var closedPoints, closedPointsPercentaje, definedPoints, projectPointsPercentaje, totalPoints;\n if (stats != null) {\n totalPoints = stats.total_points ? stats.total_points : stats.defined_points;\n definedPoints = stats.defined_points;\n closedPoints = stats.closed_points;\n if (definedPoints > totalPoints) {\n projectPointsPercentaje = totalPoints * 100 / definedPoints;\n closedPointsPercentaje = closedPoints * 100 / definedPoints;\n } else {\n projectPointsPercentaje = 100;\n closedPointsPercentaje = closedPoints * 100 / totalPoints;\n }\n projectPointsPercentaje = adjustPercentaje(projectPointsPercentaje - 3);\n closedPointsPercentaje = adjustPercentaje(closedPointsPercentaje - 3);\n return render($scope, $el, projectPointsPercentaje, closedPointsPercentaje);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogProgressBar\", [\"$tgTemplate\", \"$compile\", TgBacklogProgressBarDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog/sortable.coffee\n */\n\n(function() {\n var BacklogEmptySortableDirective, BacklogSortableDirective, SprintSortableDirective, bindOnce, deleteElement, groupBy, mixOf, module, scopeDefer, taiga, toggleText;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n module = angular.module(\"taigaBacklog\");\n\n deleteElement = function(el) {\n el.scope().$destroy();\n el.off();\n return el.remove();\n };\n\n BacklogSortableDirective = function($repo, $rs, $rootscope, $tgConfirm, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var getUsIndex;\n getUsIndex = (function(_this) {\n return function(us) {\n return $(us).index(\".backlog-table-body .row\");\n };\n })(this);\n bindOnce($scope, \"project\", function(project) {\n var filterError;\n if (!(project.my_permissions.indexOf(\"modify_us\") > -1)) {\n return;\n }\n filterError = function() {\n var text;\n text = $translate.instant(\"BACKLOG.SORTABLE_FILTER_ERROR\");\n return $tgConfirm.notify(\"error\", text);\n };\n $el.sortable({\n items: \".us-item-row\",\n cancel: \".popover\",\n connectWith: \".sprint\",\n dropOnEmpty: true,\n placeholder: \"row us-item-row us-item-drag sortable-placeholder\",\n scroll: true,\n disableHorizontalScroll: true,\n tolerance: \"pointer\",\n revert: false,\n start: function() {\n return $(document.body).addClass(\"drag-active\");\n },\n stop: function() {\n $(document.body).removeClass(\"drag-active\");\n if ($el.hasClass(\"active-filters\")) {\n $el.sortable(\"cancel\");\n return filterError();\n }\n }\n });\n $el.on(\"multiplesortreceive\", function(event, ui) {\n var itemIndex, itemUs;\n if ($el.hasClass(\"active-filters\")) {\n ui.source.sortable(\"cancel\");\n filterError();\n return;\n }\n itemUs = ui.item.scope().us;\n itemIndex = getUsIndex(ui.item);\n deleteElement(ui.item);\n $scope.$emit(\"sprint:us:move\", [itemUs], itemIndex, null);\n return ui.item.find('a').removeClass('noclick');\n });\n $el.on(\"multiplesortstop\", function(event, ui) {\n var index, items, us;\n if ($(ui.items[0]).parent().length === 0) {\n return;\n }\n if ($el.hasClass(\"active-filters\")) {\n return;\n }\n items = _.sortBy(ui.items, function(item) {\n return $(item).index();\n });\n index = _.min(_.map(items, function(item) {\n return getUsIndex(item);\n }));\n us = _.map(items, function(item) {\n var itemUs;\n item = $(item);\n itemUs = item.scope().us;\n setTimeout(((function(_this) {\n return function() {\n return item.find('a').removeClass('noclick');\n };\n })(this)), 300);\n return itemUs;\n });\n return $scope.$emit(\"sprint:us:move\", us, index, null);\n });\n return $el.on(\"sortstart\", function(event, ui) {\n return ui.item.find('a').addClass('noclick');\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n BacklogEmptySortableDirective = function($repo, $rs, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n bindOnce($scope, \"project\", function(project) {\n if (project.my_permissions.indexOf(\"modify_us\") > -1) {\n $el.sortable({\n items: \".us-item-row\",\n dropOnEmpty: true\n });\n return $el.on(\"sortreceive\", function(event, ui) {\n var itemIndex, itemUs;\n itemUs = ui.item.scope().us;\n itemIndex = ui.item.index();\n deleteElement(ui.item);\n $scope.$emit(\"sprint:us:move\", [itemUs], itemIndex, null);\n return ui.item.find('a').removeClass('noclick');\n });\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n SprintSortableDirective = function($repo, $rs, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, \"project\", function(project) {\n if (project.my_permissions.indexOf(\"modify_us\") > -1) {\n $el.sortable({\n scroll: true,\n dropOnEmpty: true,\n items: \".sprint-table .milestone-us-item-row\",\n disableHorizontalScroll: true,\n connectWith: \".sprint,.backlog-table-body,.empty-backlog\",\n placeholder: \"row us-item-row sortable-placeholder\",\n forcePlaceholderSize: true\n });\n $el.on(\"multiplesortreceive\", function(event, ui) {\n var index, items, us;\n items = _.sortBy(ui.items, function(item) {\n return $(item).index();\n });\n index = _.min(_.map(items, function(item) {\n return $(item).index();\n }));\n us = _.map(items, function(item) {\n var itemUs;\n item = $(item);\n itemUs = item.scope().us;\n deleteElement(item);\n return itemUs;\n });\n return $scope.$emit(\"sprint:us:move\", us, index, $scope.sprint.id);\n });\n $el.on(\"multiplesortstop\", function(event, ui) {\n var itemIndex, itemUs;\n if (ui.item.parent().length === 0) {\n return;\n }\n itemUs = ui.item.scope().us;\n itemIndex = ui.item.index();\n setTimeout(((function(_this) {\n return function() {\n return ui.item.find('a').removeClass('noclick');\n };\n })(this)), 300);\n return $scope.$emit(\"sprint:us:move\", [itemUs], itemIndex, $scope.sprint.id);\n });\n return $el.on(\"sortstart\", function(event, ui) {\n return ui.item.find('a').addClass('noclick');\n });\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogSortable\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", \"$tgConfirm\", \"$translate\", BacklogSortableDirective]);\n\n module.directive(\"tgBacklogEmptySortable\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", BacklogEmptySortableDirective]);\n\n module.directive(\"tgSprintSortable\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", SprintSortableDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/backlog/sprints.coffee\n */\n\n(function() {\n var BacklogSprintDirective, BacklogSprintHeaderDirective, ToggleExcludeClosedSprintsVisualization, module, taiga;\n\n taiga = this.taiga;\n\n module = angular.module(\"taigaBacklog\");\n\n BacklogSprintDirective = function($repo, $rootscope) {\n var link, slideOptions, sprintTableMinHeight, toggleSprint;\n sprintTableMinHeight = 50;\n slideOptions = {\n duration: 500,\n easing: 'linear'\n };\n toggleSprint = (function(_this) {\n return function($el) {\n var sprintArrow, sprintTable;\n sprintTable = $el.find(\".sprint-table\");\n sprintArrow = $el.find(\".icon-arrow-up\");\n sprintArrow.toggleClass('active');\n return sprintTable.toggleClass('open');\n };\n })(this);\n link = function($scope, $el, $attrs) {\n $scope.$watch($attrs.tgBacklogSprint, function(sprint) {\n sprint = $scope.$eval($attrs.tgBacklogSprint);\n if (sprint.closed) {\n return $el.addClass(\"sprint-closed\");\n } else {\n return toggleSprint($el);\n }\n });\n $el.on(\"click\", \".sprint-name > .icon-arrow-up\", function(event) {\n event.preventDefault();\n toggleSprint($el);\n return $el.find(\".sprint-table\").slideToggle(slideOptions);\n });\n $el.on(\"click\", \".sprint-name > .icon-edit\", function(event) {\n var sprint;\n event.preventDefault();\n sprint = $scope.$eval($attrs.tgBacklogSprint);\n return $rootscope.$broadcast(\"sprintform:edit\", sprint);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogSprint\", [\"$tgRepo\", \"$rootScope\", BacklogSprintDirective]);\n\n BacklogSprintHeaderDirective = function($navUrls, $template, $compile, $translate) {\n var link, template;\n template = $template.get(\"backlog/sprint-header.html\");\n link = function($scope, $el, $attrs, $model) {\n var isEditable, isVisible, prettyDate, render;\n prettyDate = $translate.instant(\"BACKLOG.SPRINTS.DATE\");\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_milestone\") !== -1;\n };\n isVisible = function() {\n return $scope.project.my_permissions.indexOf(\"view_milestones\") !== -1;\n };\n render = function(sprint) {\n var compiledTemplate, ctx, estimatedDateRange, finish, start, taskboardUrl, templateScope;\n taskboardUrl = $navUrls.resolve(\"project-taskboard\", {\n project: $scope.project.slug,\n sprint: sprint.slug\n });\n start = moment(sprint.estimated_start).format(prettyDate);\n finish = moment(sprint.estimated_finish).format(prettyDate);\n estimatedDateRange = start + \"-\" + finish;\n ctx = {\n name: sprint.name,\n taskboardUrl: taskboardUrl,\n estimatedDateRange: estimatedDateRange,\n closedPoints: sprint.closed_points || 0,\n totalPoints: sprint.total_points || 0,\n isVisible: isVisible(),\n isEditable: isEditable()\n };\n templateScope = $scope.$new();\n _.assign(templateScope, ctx);\n compiledTemplate = $compile(template)(templateScope);\n return $el.html(compiledTemplate);\n };\n $scope.$watch($attrs.ngModel, function(sprint) {\n return render(sprint);\n });\n $scope.$on(\"sprintform:edit:success\", function() {\n return render($model.$modelValue);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgBacklogSprintHeader\", [\"$tgNavUrls\", \"$tgTemplate\", \"$compile\", \"$translate\", BacklogSprintHeaderDirective]);\n\n ToggleExcludeClosedSprintsVisualization = function($rootscope, $loading, $translate) {\n var excludeClosedSprints, link;\n excludeClosedSprints = true;\n link = function($scope, $el, $attrs) {\n var currentLoading, loadingElm;\n loadingElm = $(\"
\");\n $el.after(loadingElm);\n currentLoading = null;\n $el.on(\"click\", function(event) {\n event.preventDefault();\n excludeClosedSprints = !excludeClosedSprints;\n currentLoading = $loading().target(loadingElm).start();\n if (excludeClosedSprints) {\n return $rootscope.$broadcast(\"backlog:unload-closed-sprints\");\n } else {\n return $rootscope.$broadcast(\"backlog:load-closed-sprints\");\n }\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return $scope.$on(\"closed-sprints:reloaded\", (function(_this) {\n return function(ctx, sprints) {\n var key, text;\n currentLoading.finish();\n if (sprints.length > 0) {\n key = \"BACKLOG.SPRINTS.ACTION_HIDE_CLOSED_SPRINTS\";\n } else {\n key = \"BACKLOG.SPRINTS.ACTION_SHOW_CLOSED_SPRINTS\";\n }\n text = $translate.instant(key);\n return $el.find(\".text\").text(text);\n };\n })(this));\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBacklogToggleClosedSprintsVisualization\", [\"$rootScope\", \"$tgLoading\", \"$translate\", ToggleExcludeClosedSprintsVisualization]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard/charts.coffee\n */\n\n(function() {\n var SprintGraphDirective, bindOnce, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n timeout = this.taiga.timeout;\n\n module = angular.module(\"taigaTaskboard\");\n\n SprintGraphDirective = function($translate) {\n var link, redrawChart;\n redrawChart = function(element, dataToDraw) {\n var data, days, options, width;\n width = element.width();\n element.height(240);\n days = _.map(dataToDraw, function(x) {\n return moment(x.day);\n });\n data = [];\n data.unshift({\n data: _.zip(days, _.map(dataToDraw, function(d) {\n return d.optimal_points;\n })),\n lines: {\n fillColor: \"rgba(120,120,120,0.2)\"\n }\n });\n data.unshift({\n data: _.zip(days, _.map(dataToDraw, function(d) {\n return d.open_points;\n })),\n lines: {\n fillColor: \"rgba(102,153,51,0.3)\"\n }\n });\n options = {\n grid: {\n borderWidth: {\n top: 0,\n right: 1,\n left: 0,\n bottom: 0\n },\n borderColor: '#ccc',\n hoverable: true\n },\n xaxis: {\n tickSize: [1, \"day\"],\n min: days[0],\n max: _.last(days),\n mode: \"time\",\n daysNames: days,\n axisLabel: $translate.instant(\"TASKBOARD.CHARTS.XAXIS_LABEL\"),\n axisLabelUseCanvas: true,\n axisLabelFontSizePixels: 12,\n axisLabelFontFamily: 'Verdana, Arial, Helvetica, Tahoma, sans-serif',\n axisLabelPadding: 5\n },\n yaxis: {\n min: 0,\n axisLabel: $translate.instant(\"TASKBOARD.CHARTS.YAXIS_LABEL\"),\n axisLabelUseCanvas: true,\n axisLabelFontSizePixels: 12,\n axisLabelFontFamily: 'Verdana, Arial, Helvetica, Tahoma, sans-serif',\n axisLabelPadding: 5\n },\n series: {\n shadowSize: 0,\n lines: {\n show: true,\n fill: true\n },\n points: {\n show: true,\n fill: true,\n radius: 4,\n lineWidth: 2\n }\n },\n colors: [\"rgba(102,153,51,1)\", \"rgba(120,120,120,0.2)\"],\n tooltip: true,\n tooltipOpts: {\n content: function(label, xval, yval, flotItem) {\n var formattedDate, roundedValue;\n formattedDate = moment(xval).format($translate.instant(\"TASKBOARD.CHARTS.DATE\"));\n roundedValue = Math.round(yval);\n if (flotItem.seriesIndex === 1) {\n return $translate.instant(\"TASKBOARD.CHARTS.OPTIMAL\", {\n formattedDate: formattedDate,\n roundedValue: roundedValue\n });\n } else {\n return $translate.instant(\"TASKBOARD.CHARTS.REAL\", {\n formattedDate: formattedDate,\n roundedValue: roundedValue\n });\n }\n }\n }\n };\n element.empty();\n return element.plot(data, options).data(\"plot\");\n };\n link = function($scope, $el, $attrs) {\n var element;\n element = angular.element($el);\n $scope.$on(\"resize\", function() {\n if ($scope.stats) {\n return redrawChart(element, $scope.stats.days);\n }\n });\n $scope.$on(\"taskboard:graph:toggle-visibility\", function() {\n $el.parent().toggleClass('open');\n return timeout(100, function() {\n if ($scope.stats) {\n return redrawChart(element, $scope.stats.days);\n }\n });\n });\n $scope.$watch('stats', function(value) {\n if ($scope.stats == null) {\n return;\n }\n return redrawChart(element, $scope.stats.days);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgSprintGraph\", [\"$translate\", SprintGraphDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard/lightboxes.coffee\n */\n\n(function() {\n var CreateBulkTasksDirective, CreateEditTaskDirective, bindOnce, debounce, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n CreateEditTaskDirective = function($repo, $model, $rs, $rootscope, $loading, lightboxService, $translate, $q, attachmentsService) {\n var link;\n link = function($scope, $el, attrs) {\n var attachmentsToAdd, attachmentsToDelete, createAttachments, deleteAttachments, resetAttachments, submit, submitButton;\n $scope.isNew = true;\n attachmentsToAdd = Immutable.List();\n attachmentsToDelete = Immutable.List();\n resetAttachments = function() {\n attachmentsToAdd = Immutable.List();\n return attachmentsToDelete = Immutable.List();\n };\n $scope.addAttachment = function(attachment) {\n return attachmentsToAdd = attachmentsToAdd.push(attachment);\n };\n $scope.deleteAttachment = function(attachment) {\n return attachmentsToDelete = attachmentsToDelete.push(attachment);\n };\n createAttachments = function(obj) {\n var promises;\n promises = _.map(attachmentsToAdd.toJS(), function(attachment) {\n return attachmentsService.upload(attachment.file, obj.id, $scope.task.project, 'task');\n });\n return $q.all(promises);\n };\n deleteAttachments = function(obj) {\n var promises;\n console.log(attachmentsToDelete.toJS());\n promises = _.map(attachmentsToDelete.toJS(), function(attachment) {\n return attachmentsService[\"delete\"](\"task\", attachment.id);\n });\n return $q.all(promises);\n };\n $scope.$on(\"taskform:new\", function(ctx, sprintId, usId) {\n var create, newTask;\n $scope.task = {\n project: $scope.projectId,\n milestone: sprintId,\n user_story: usId,\n is_archived: false,\n status: $scope.project.default_task_status,\n assigned_to: null,\n tags: []\n };\n $scope.isNew = true;\n $scope.attachments = Immutable.List();\n resetAttachments();\n create = $translate.instant(\"COMMON.CREATE\");\n $el.find(\".button-green\").html(create);\n newTask = $translate.instant(\"LIGHTBOX.CREATE_EDIT_TASK.TITLE\");\n $el.find(\".title\").html(newTask + \" \");\n $el.find(\".tag-input\").val(\"\");\n return lightboxService.open($el);\n });\n $scope.$on(\"taskform:edit\", function(ctx, task, attachments) {\n var edit, save;\n $scope.task = task;\n $scope.isNew = false;\n $scope.attachments = Immutable.fromJS(attachments);\n resetAttachments();\n save = $translate.instant(\"COMMON.SAVE\");\n edit = $translate.instant(\"LIGHTBOX.CREATE_EDIT_TASK.ACTION_EDIT\");\n $el.find(\".button-green\").html(save);\n $el.find(\".title\").html(edit + \" \");\n $el.find(\".tag-input\").val(\"\");\n return lightboxService.open($el);\n });\n submitButton = $el.find(\".submit-button\");\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var broadcastEvent, currentLoading, form, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n if ($scope.isNew) {\n promise = $repo.create(\"tasks\", $scope.task);\n broadcastEvent = \"taskform:new:success\";\n } else {\n promise = $repo.save($scope.task);\n broadcastEvent = \"taskform:edit:success\";\n }\n promise.then(function(data) {\n createAttachments(data);\n deleteAttachments(data);\n return data;\n });\n currentLoading = $loading().target(submitButton).start();\n return promise.then(function(data) {\n currentLoading.finish();\n lightboxService.close($el);\n return $rootscope.$broadcast(broadcastEvent, data);\n });\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n CreateBulkTasksDirective = function($repo, $rs, $rootscope, $loading, lightboxService) {\n var link;\n link = function($scope, $el, attrs) {\n var submit, submitButton;\n $scope.form = {\n data: \"\",\n usId: null\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, data, form, projectId, promise, sprintId, usId;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n data = $scope.form.data;\n projectId = $scope.projectId;\n sprintId = $scope.form.sprintId;\n usId = $scope.form.usId;\n promise = $rs.tasks.bulkCreate(projectId, sprintId, usId, data);\n promise.then(function(result) {\n currentLoading.finish();\n $rootscope.$broadcast(\"taskform:bulk:success\", result);\n return lightboxService.close($el);\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return console.log(\"FAIL\");\n });\n };\n })(this));\n $scope.$on(\"taskform:bulk\", function(ctx, sprintId, usId) {\n lightboxService.open($el);\n return $scope.form = {\n data: \"\",\n sprintId: sprintId,\n usId: usId\n };\n });\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module = angular.module(\"taigaTaskboard\");\n\n module.directive(\"tgLbCreateEditTask\", [\"$tgRepo\", \"$tgModel\", \"$tgResources\", \"$rootScope\", \"$tgLoading\", \"lightboxService\", \"$translate\", \"$q\", \"tgAttachmentsService\", CreateEditTaskDirective]);\n\n module.directive(\"tgLbCreateBulkTasks\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", \"$tgLoading\", \"lightboxService\", CreateBulkTasksDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard.coffee\n */\n\n(function() {\n var TaskboardController, TaskboardDirective, TaskboardSquishColumnDirective, TaskboardTaskDirective, TaskboardUserDirective, bindMethods, bindOnce, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n toggleText = this.taiga.toggleText;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n scopeDefer = this.taiga.scopeDefer;\n\n timeout = this.taiga.timeout;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaTaskboard\");\n\n TaskboardController = (function(superClass) {\n extend(TaskboardController, superClass);\n\n TaskboardController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"tgAppMetaService\", \"$tgLocation\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\"];\n\n function TaskboardController(scope, rootscope, repo, confirm, rs1, params1, q, appMetaService, location, navUrls, events, analytics, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs1;\n this.params = params1;\n this.q = q;\n this.appMetaService = appMetaService;\n this.location = location;\n this.navUrls = navUrls;\n this.events = events;\n this.analytics = analytics;\n this.translate = translate;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"TASKBOARD.SECTION_NAME\");\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n return _this._setMeta();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n TaskboardController.prototype._setMeta = function() {\n var description, prettyDate, title;\n prettyDate = this.translate.instant(\"BACKLOG.SPRINTS.DATE\");\n title = this.translate.instant(\"TASKBOARD.PAGE_TITLE\", {\n projectName: this.scope.project.name,\n sprintName: this.scope.sprint.name\n });\n description = this.translate.instant(\"TASKBOARD.PAGE_DESCRIPTION\", {\n projectName: this.scope.project.name,\n sprintName: this.scope.sprint.name,\n startDate: moment(this.scope.sprint.estimated_start).format(prettyDate),\n endDate: moment(this.scope.sprint.estimated_finish).format(prettyDate),\n completedPercentage: this.scope.stats.completedPercentage || \"0\",\n completedPoints: this.scope.stats.completedPointsSum || \"--\",\n totalPoints: this.scope.stats.totalPointsSum || \"--\",\n openTasks: this.scope.stats.openTasks || \"--\",\n totalTasks: this.scope.stats.total_tasks || \"--\"\n });\n return this.appMetaService.setAll(title, description);\n };\n\n TaskboardController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"taskform:bulk:success\", (function(_this) {\n return function() {\n _this.loadTaskboard();\n return _this.analytics.trackEvent(\"task\", \"create\", \"bulk create task on taskboard\", 1);\n };\n })(this));\n this.scope.$on(\"taskform:new:success\", (function(_this) {\n return function() {\n _this.loadTaskboard();\n return _this.analytics.trackEvent(\"task\", \"create\", \"create task on taskboard\", 1);\n };\n })(this));\n this.scope.$on(\"taskform:edit:success\", (function(_this) {\n return function() {\n return _this.loadTaskboard();\n };\n })(this));\n this.scope.$on(\"taskboard:task:move\", this.taskMove);\n return this.scope.$on(\"assigned-to:added\", (function(_this) {\n return function(ctx, userId, task) {\n var promise;\n task.assigned_to = userId;\n promise = _this.repo.save(task);\n return promise.then(null, function() {\n return console.log(\"FAIL\");\n });\n };\n })(this));\n };\n\n TaskboardController.prototype.initializeSubscription = function() {\n var routingKey, routingKey1;\n routingKey = \"changes.project.\" + this.scope.projectId + \".tasks\";\n this.events.subscribe(this.scope, routingKey, (function(_this) {\n return function(message) {\n return _this.loadTaskboard();\n };\n })(this));\n routingKey1 = \"changes.project.\" + this.scope.projectId + \".userstories\";\n return this.events.subscribe(this.scope, routingKey1, (function(_this) {\n return function(message) {\n _this.refreshTagsColors();\n _this.loadSprintStats();\n return _this.loadSprint();\n };\n })(this));\n };\n\n TaskboardController.prototype.loadProject = function() {\n return this.rs.projects.get(this.scope.projectId).then((function(_this) {\n return function(project) {\n if (!project.is_backlog_activated) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.project = project;\n _this.scope.pointsList = _.sortBy(project.points, \"order\");\n _this.scope.pointsById = groupBy(project.points, function(e) {\n return e.id;\n });\n _this.scope.roleById = groupBy(project.roles, function(e) {\n return e.id;\n });\n _this.scope.taskStatusList = _.sortBy(project.task_statuses, \"order\");\n _this.scope.usStatusList = _.sortBy(project.us_statuses, \"order\");\n _this.scope.usStatusById = groupBy(project.us_statuses, function(e) {\n return e.id;\n });\n _this.scope.$emit('project:loaded', project);\n _this.fillUsersAndRoles(project.members, project.roles);\n return project;\n };\n })(this));\n };\n\n TaskboardController.prototype.loadSprintStats = function() {\n return this.rs.sprints.stats(this.scope.projectId, this.scope.sprintId).then((function(_this) {\n return function(stats) {\n var completedPointsSum, remainingPointsSum, remainingTasks, totalPointsSum;\n totalPointsSum = _.reduce(_.values(stats.total_points), (function(res, n) {\n return res + n;\n }), 0);\n completedPointsSum = _.reduce(_.values(stats.completed_points), (function(res, n) {\n return res + n;\n }), 0);\n remainingPointsSum = totalPointsSum - completedPointsSum;\n remainingTasks = stats.total_tasks - stats.completed_tasks;\n _this.scope.stats = stats;\n _this.scope.stats.totalPointsSum = totalPointsSum;\n _this.scope.stats.completedPointsSum = completedPointsSum;\n _this.scope.stats.remainingPointsSum = remainingPointsSum;\n _this.scope.stats.remainingTasks = remainingTasks;\n if (stats.totalPointsSum) {\n _this.scope.stats.completedPercentage = Math.round(100 * stats.completedPointsSum / stats.totalPointsSum);\n } else {\n _this.scope.stats.completedPercentage = 0;\n }\n _this.scope.stats.openTasks = stats.total_tasks - stats.completed_tasks;\n return stats;\n };\n })(this));\n };\n\n TaskboardController.prototype.refreshTagsColors = function() {\n return this.rs.projects.tagsColors(this.scope.projectId).then((function(_this) {\n return function(tags_colors) {\n return _this.scope.project.tags_colors = tags_colors;\n };\n })(this));\n };\n\n TaskboardController.prototype.loadSprint = function() {\n return this.rs.sprints.get(this.scope.projectId, this.scope.sprintId).then((function(_this) {\n return function(sprint) {\n _this.scope.sprint = sprint;\n _this.scope.userstories = _.sortBy(sprint.user_stories, \"sprint_order\");\n return sprint;\n };\n })(this));\n };\n\n TaskboardController.prototype.loadTasks = function() {\n return this.rs.tasks.list(this.scope.projectId, this.scope.sprintId).then((function(_this) {\n return function(tasks) {\n var i, j, k, len, len1, len2, ref, ref1, ref2, status, task, us, usId;\n _this.scope.tasks = _.sortBy(tasks, 'taskboard_order');\n _this.scope.usTasks = {};\n ref = _.union(_this.scope.userstories, [\n {\n id: null\n }\n ]);\n for (i = 0, len = ref.length; i < len; i++) {\n us = ref[i];\n _this.scope.usTasks[us.id] = {};\n ref1 = _this.scope.taskStatusList;\n for (j = 0, len1 = ref1.length; j < len1; j++) {\n status = ref1[j];\n _this.scope.usTasks[us.id][status.id] = [];\n }\n }\n ref2 = _this.scope.tasks;\n for (k = 0, len2 = ref2.length; k < len2; k++) {\n task = ref2[k];\n if ((_this.scope.usTasks[task.user_story] != null) && (_this.scope.usTasks[task.user_story][task.status] != null)) {\n _this.scope.usTasks[task.user_story][task.status].push(task);\n }\n }\n if (tasks.length === 0) {\n if (_this.scope.userstories.length > 0) {\n usId = _this.scope.userstories[0].id;\n } else {\n usId = null;\n }\n _this.scope.usTasks[usId][_this.scope.taskStatusList[0].id].push({\n isPlaceholder: true\n });\n }\n return tasks;\n };\n })(this));\n };\n\n TaskboardController.prototype.loadTaskboard = function() {\n return this.q.all([\n this.refreshTagsColors(), this.loadSprintStats(), this.loadSprint().then((function(_this) {\n return function() {\n return _this.loadTasks();\n };\n })(this))\n ]);\n };\n\n TaskboardController.prototype.loadInitialData = function() {\n var params, promise;\n params = {\n pslug: this.params.pslug,\n sslug: this.params.sslug\n };\n promise = this.repo.resolve(params).then((function(_this) {\n return function(data) {\n _this.scope.projectId = data.project;\n _this.scope.sprintId = data.milestone;\n _this.initializeSubscription();\n return data;\n };\n })(this));\n return promise.then((function(_this) {\n return function() {\n return _this.loadProject();\n };\n })(this)).then((function(_this) {\n return function() {\n return _this.loadTaskboard();\n };\n })(this));\n };\n\n TaskboardController.prototype.refreshTasksOrder = function(tasks) {\n var data, items;\n items = this.resortTasks(tasks);\n data = this.prepareBulkUpdateData(items);\n return this.rs.tasks.bulkUpdateTaskTaskboardOrder(this.scope.project.id, data);\n };\n\n TaskboardController.prototype.resortTasks = function(tasks) {\n var i, index, item, items, len;\n items = [];\n for (index = i = 0, len = tasks.length; i < len; index = ++i) {\n item = tasks[index];\n item[\"taskboard_order\"] = index;\n if (item.isModified()) {\n items.push(item);\n }\n }\n return items;\n };\n\n TaskboardController.prototype.prepareBulkUpdateData = function(uses) {\n return _.map(uses, function(x) {\n return {\n \"task_id\": x.id,\n \"order\": x[\"taskboard_order\"]\n };\n });\n };\n\n TaskboardController.prototype.taskMove = function(ctx, task, usId, statusId, order) {\n var promise, r, tasks;\n r = this.scope.usTasks[task.user_story][task.status].indexOf(task);\n this.scope.usTasks[task.user_story][task.status].splice(r, 1);\n tasks = this.scope.usTasks[usId][statusId];\n tasks.splice(order, 0, task);\n task.user_story = usId;\n task.status = statusId;\n task.taskboard_order = order;\n promise = this.repo.save(task);\n this.rootscope.$broadcast(\"sprint:task:moved\", task);\n promise.then((function(_this) {\n return function() {\n _this.refreshTasksOrder(tasks);\n return _this.loadSprintStats();\n };\n })(this));\n return promise.then(null, (function(_this) {\n return function() {\n return console.log(\"FAIL TASK SAVE\");\n };\n })(this));\n };\n\n TaskboardController.prototype.addNewTask = function(type, us) {\n switch (type) {\n case \"standard\":\n return this.rootscope.$broadcast(\"taskform:new\", this.scope.sprintId, us != null ? us.id : void 0);\n case \"bulk\":\n return this.rootscope.$broadcast(\"taskform:bulk\", this.scope.sprintId, us != null ? us.id : void 0);\n }\n };\n\n TaskboardController.prototype.editTaskAssignedTo = function(task) {\n return this.rootscope.$broadcast(\"assigned-to:add\", task);\n };\n\n return TaskboardController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"TaskboardController\", TaskboardController);\n\n TaskboardDirective = function($rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl, tableBodyDom;\n $ctrl = $el.controller();\n $el.on(\"click\", \".toggle-analytics-visibility\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n target.toggleClass('active');\n return $rootscope.$broadcast(\"taskboard:graph:toggle-visibility\");\n });\n tableBodyDom = $el.find(\".taskboard-table-body\");\n tableBodyDom.on(\"scroll\", function(event) {\n var tableHeaderDom, target;\n target = angular.element(event.currentTarget);\n tableHeaderDom = $el.find(\".taskboard-table-header .taskboard-table-inner\");\n return tableHeaderDom.css(\"left\", -1 * target.scrollLeft());\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgTaskboard\", [\"$rootScope\", TaskboardDirective]);\n\n TaskboardTaskDirective = function($rootscope, $loading, $rs, $rs2) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n $el.disableSelection();\n $scope.$watch(\"task\", function(task) {\n if (task.is_blocked && !$el.hasClass(\"blocked\")) {\n return $el.addClass(\"blocked\");\n } else if (!task.is_blocked && $el.hasClass(\"blocked\")) {\n return $el.removeClass(\"blocked\");\n }\n });\n return $el.find(\".icon-edit\").on(\"click\", function(event) {\n if ($el.find('.icon-edit').hasClass('noclick')) {\n return;\n }\n return $scope.$apply(function() {\n var currentLoading, target, task;\n target = $(event.target);\n currentLoading = $loading().target(target).timeout(200).removeClasses(\"icon-edit\").start();\n task = $scope.task;\n return $rs.tasks.getByRef(task.project, task.ref).then((function(_this) {\n return function(editingTask) {\n return $rs2.attachments.list(\"task\", editingTask.id, editingTask.project).then(function(attachments) {\n $rootscope.$broadcast(\"taskform:edit\", editingTask, attachments.toJS());\n return currentLoading.finish();\n });\n };\n })(this));\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgTaskboardTask\", [\"$rootScope\", \"$tgLoading\", \"$tgResources\", \"tgResources\", TaskboardTaskDirective]);\n\n TaskboardSquishColumnDirective = function(rs) {\n var avatarWidth, link, maxColumnWidth;\n avatarWidth = 40;\n maxColumnWidth = 300;\n link = function($scope, $el, $attrs) {\n var getCeilWidth, recalculateStatusColumnWidth, recalculateTaskboardWidth, refreshTaskboardTableWidth, setStatusColumnWidth;\n $scope.$on(\"sprint:task:moved\", (function(_this) {\n return function() {\n return recalculateTaskboardWidth();\n };\n })(this));\n bindOnce($scope, \"usTasks\", function(project) {\n $scope.statusesFolded = rs.tasks.getStatusColumnModes($scope.project.id);\n $scope.usFolded = rs.tasks.getUsRowModes($scope.project.id, $scope.sprintId);\n return recalculateTaskboardWidth();\n });\n $scope.foldStatus = function(status) {\n $scope.statusesFolded[status.id] = !!!$scope.statusesFolded[status.id];\n rs.tasks.storeStatusColumnModes($scope.projectId, $scope.statusesFolded);\n return recalculateTaskboardWidth();\n };\n $scope.foldUs = function(us) {\n if (!us) {\n $scope.usFolded[null] = !!!$scope.usFolded[null];\n } else {\n $scope.usFolded[us.id] = !!!$scope.usFolded[us.id];\n }\n rs.tasks.storeUsRowModes($scope.projectId, $scope.sprintId, $scope.usFolded);\n return recalculateTaskboardWidth();\n };\n getCeilWidth = (function(_this) {\n return function(usId, statusId) {\n var tasks, tasksMatrixSize, width;\n tasks = $scope.usTasks[usId][statusId].length;\n if ($scope.statusesFolded[statusId]) {\n if (tasks && $scope.usFolded[usId]) {\n tasksMatrixSize = Math.round(Math.sqrt(tasks));\n width = avatarWidth * tasksMatrixSize;\n } else {\n width = avatarWidth;\n }\n return width;\n }\n return 0;\n };\n })(this);\n setStatusColumnWidth = (function(_this) {\n return function(statusId, width) {\n var column;\n column = $el.find(\".squish-status-\" + statusId);\n if (width) {\n return column.css('max-width', width);\n } else {\n return column.css(\"max-width\", maxColumnWidth);\n }\n };\n })(this);\n refreshTaskboardTableWidth = (function(_this) {\n return function() {\n var columnWidths, columns, totalWidth;\n columnWidths = [];\n columns = $el.find(\".task-colum-name\");\n columnWidths = _.map(columns, function(column) {\n return $(column).outerWidth(true);\n });\n totalWidth = _.reduce(columnWidths, function(total, width) {\n return total + width;\n });\n return $el.find('.taskboard-table-inner').css(\"width\", totalWidth);\n };\n })(this);\n recalculateStatusColumnWidth = (function(_this) {\n return function(statusId) {\n var statusFoldedWidth;\n statusFoldedWidth = getCeilWidth(null, statusId);\n _.forEach($scope.userstories, function(us) {\n var width;\n width = getCeilWidth(us.id, statusId);\n if (width > statusFoldedWidth) {\n return statusFoldedWidth = width;\n }\n });\n return setStatusColumnWidth(statusId, statusFoldedWidth);\n };\n })(this);\n return recalculateTaskboardWidth = (function(_this) {\n return function() {\n _.forEach($scope.taskStatusList, function(status) {\n return recalculateStatusColumnWidth(status.id);\n });\n refreshTaskboardTableWidth();\n };\n })(this);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgTaskboardSquishColumn\", [\"$tgResources\", TaskboardSquishColumnDirective]);\n\n TaskboardUserDirective = function($log, $translate) {\n var clickable, link;\n clickable = false;\n link = function($scope, $el, $attrs) {\n var username_label;\n username_label = $el.parent().find(\"a.task-assigned\");\n username_label.addClass(\"not-clickable\");\n $scope.$watch('task.assigned_to', function(assigned_to) {\n var user;\n user = $scope.usersById[assigned_to];\n if (user === void 0) {\n _.assign($scope, {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\"),\n imgurl: \"/\" + window._version + \"/images/unnamed.png\",\n clickable: clickable\n });\n } else {\n _.assign($scope, {\n name: user.full_name_display,\n imgurl: user.photo,\n clickable: clickable\n });\n }\n return username_label.text($scope.name);\n });\n return bindOnce($scope, \"project\", function(project) {\n if (project.my_permissions.indexOf(\"modify_task\") > -1) {\n clickable = true;\n $el.find(\".avatar-assigned-to\").on(\"click\", (function(_this) {\n return function(event) {\n var $ctrl;\n if ($el.find('a').hasClass('noclick')) {\n return;\n }\n $ctrl = $el.controller();\n return $ctrl.editTaskAssignedTo($scope.task);\n };\n })(this));\n username_label.removeClass(\"not-clickable\");\n return username_label.on(\"click\", function(event) {\n var $ctrl;\n if ($el.find('a').hasClass('noclick')) {\n return;\n }\n $ctrl = $el.controller();\n return $ctrl.editTaskAssignedTo($scope.task);\n });\n }\n });\n };\n return {\n link: link,\n templateUrl: \"taskboard/taskboard-user.html\",\n scope: {\n \"usersById\": \"=users\",\n \"project\": \"=\",\n \"task\": \"=\"\n }\n };\n };\n\n module.directive(\"tgTaskboardUserAvatar\", [\"$log\", \"$translate\", TaskboardUserDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/taskboard/sortable.coffee\n */\n\n(function() {\n var TaskboardSortableDirective, bindOnce, groupBy, mixOf, module, scopeDefer, taiga, toggleText;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n module = angular.module(\"taigaBacklog\");\n\n TaskboardSortableDirective = function($repo, $rs, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n bindOnce($scope, \"project\", function(project) {\n var deleteElement, itemEl, newParentScope, oldParentScope, tdom;\n if (!(project.my_permissions.indexOf(\"modify_us\") > -1)) {\n return;\n }\n oldParentScope = null;\n newParentScope = null;\n itemEl = null;\n tdom = $el;\n deleteElement = function(itemEl) {\n itemEl.scope().$destroy();\n itemEl.off();\n return itemEl.remove();\n };\n tdom.sortable({\n handle: \".taskboard-task-inner\",\n dropOnEmpty: true,\n connectWith: \".taskboard-tasks-box\",\n revert: 400\n });\n tdom.on(\"sortstop\", function(event, ui) {\n var itemIndex, itemTask, newStatusId, newUsId, oldStatusId, oldUsId, parentEl;\n parentEl = ui.item.parent();\n itemEl = ui.item;\n itemTask = itemEl.scope().task;\n itemIndex = itemEl.index();\n newParentScope = parentEl.scope();\n oldUsId = oldParentScope.us ? oldParentScope.us.id : null;\n oldStatusId = oldParentScope.st.id;\n newUsId = newParentScope.us ? newParentScope.us.id : null;\n newStatusId = newParentScope.st.id;\n if (newStatusId !== oldStatusId || newUsId !== oldUsId) {\n deleteElement(itemEl);\n }\n $scope.$apply(function() {\n return $rootscope.$broadcast(\"taskboard:task:move\", itemTask, newUsId, newStatusId, itemIndex);\n });\n return ui.item.find('a').removeClass('noclick');\n });\n return tdom.on(\"sortstart\", function(event, ui) {\n oldParentScope = ui.item.parent().scope();\n return ui.item.find('a').addClass('noclick');\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgTaskboardSortable\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", TaskboardSortableDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/kanban/main.coffee\n */\n\n(function() {\n var KanbanArchivedStatusHeaderDirective, KanbanArchivedStatusIntroDirective, KanbanController, KanbanDirective, KanbanSquishColumnDirective, KanbanUserDirective, KanbanUserstoryDirective, KanbanWipLimitDirective, bindMethods, bindOnce, defaultViewMode, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText, viewModes,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n timeout = this.taiga.timeout;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaKanban\");\n\n defaultViewMode = \"maximized\";\n\n viewModes = [\"maximized\", \"minimized\"];\n\n KanbanController = (function(superClass) {\n extend(KanbanController, superClass);\n\n KanbanController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\"];\n\n function KanbanController(scope, rootscope, repo, confirm, rs1, params1, q, location, appMetaService, navUrls, events, analytics, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs1;\n this.params = params1;\n this.q = q;\n this.location = location;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.events = events;\n this.analytics = analytics;\n this.translate = translate;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"KANBAN.SECTION_NAME\");\n this.scope.statusViewModes = {};\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"KANBAN.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.translate.instant(\"KANBAN.PAGE_DESCRIPTION\", {\n projectName: _this.scope.project.name,\n projectDescription: _this.scope.project.description\n });\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n KanbanController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"usform:new:success\", (function(_this) {\n return function() {\n _this.loadUserstories();\n _this.refreshTagsColors();\n return _this.analytics.trackEvent(\"userstory\", \"create\", \"create userstory on kanban\", 1);\n };\n })(this));\n this.scope.$on(\"usform:bulk:success\", (function(_this) {\n return function() {\n _this.loadUserstories();\n return _this.analytics.trackEvent(\"userstory\", \"create\", \"bulk create userstory on kanban\", 1);\n };\n })(this));\n this.scope.$on(\"usform:edit:success\", (function(_this) {\n return function() {\n _this.loadUserstories();\n return _this.refreshTagsColors();\n };\n })(this));\n this.scope.$on(\"assigned-to:added\", this.onAssignedToChanged);\n this.scope.$on(\"kanban:us:move\", this.moveUs);\n this.scope.$on(\"kanban:show-userstories-for-status\", this.loadUserStoriesForStatus);\n return this.scope.$on(\"kanban:hide-userstories-for-status\", this.hideUserStoriesForStatus);\n };\n\n KanbanController.prototype.addNewUs = function(type, statusId) {\n switch (type) {\n case \"standard\":\n return this.rootscope.$broadcast(\"usform:new\", this.scope.projectId, statusId, this.scope.usStatusList);\n case \"bulk\":\n return this.rootscope.$broadcast(\"usform:bulk\", this.scope.projectId, statusId);\n }\n };\n\n KanbanController.prototype.changeUsAssignedTo = function(us) {\n return this.rootscope.$broadcast(\"assigned-to:add\", us);\n };\n\n KanbanController.prototype.onAssignedToChanged = function(ctx, userid, us) {\n var promise;\n us.assigned_to = userid;\n promise = this.repo.save(us);\n return promise.then(null, function() {\n return console.log(\"FAIL\");\n });\n };\n\n KanbanController.prototype.refreshTagsColors = function() {\n return this.rs.projects.tagsColors(this.scope.projectId).then((function(_this) {\n return function(tags_colors) {\n return _this.scope.project.tags_colors = tags_colors;\n };\n })(this));\n };\n\n KanbanController.prototype.loadUserstories = function() {\n var params, promise;\n params = {\n status__is_archived: false\n };\n promise = this.rs.userstories.listAll(this.scope.projectId, params).then((function(_this) {\n return function(userstories) {\n var i, j, k, len, len1, len2, ref, ref1, ref2, status, us, usByStatus, us_archived;\n _this.scope.userstories = userstories;\n usByStatus = _.groupBy(userstories, \"status\");\n us_archived = [];\n ref = _this.scope.usStatusList;\n for (i = 0, len = ref.length; i < len; i++) {\n status = ref[i];\n if (usByStatus[status.id] == null) {\n usByStatus[status.id] = [];\n }\n if (_this.scope.usByStatus != null) {\n ref1 = _this.scope.usByStatus[status.id];\n for (j = 0, len1 = ref1.length; j < len1; j++) {\n us = ref1[j];\n if (us.status !== status.id) {\n us_archived.push(us);\n }\n }\n }\n if (status.is_archived && (_this.scope.usByStatus != null) && _this.scope.usByStatus[status.id].length !== 0) {\n ref2 = _this.scope.usByStatus[status.id].concat(us_archived);\n for (k = 0, len2 = ref2.length; k < len2; k++) {\n us = ref2[k];\n if (us.status === status.id) {\n usByStatus[status.id].push(us);\n }\n }\n }\n usByStatus[status.id] = _.sortBy(usByStatus[status.id], \"kanban_order\");\n }\n if (userstories.length === 0) {\n status = _this.scope.usStatusList[0];\n usByStatus[status.id].push({\n isPlaceholder: true\n });\n }\n _this.scope.usByStatus = usByStatus;\n scopeDefer(_this.scope, function() {\n return _this.scope.$broadcast(\"userstories:loaded\", userstories);\n });\n return userstories;\n };\n })(this));\n promise.then((function(_this) {\n return function() {\n return _this.scope.$broadcast(\"redraw:wip\");\n };\n })(this));\n return promise;\n };\n\n KanbanController.prototype.loadUserStoriesForStatus = function(ctx, statusId) {\n var params;\n params = {\n status: statusId\n };\n return this.rs.userstories.listAll(this.scope.projectId, params).then((function(_this) {\n return function(userstories) {\n _this.scope.usByStatus[statusId] = _.sortBy(userstories, \"kanban_order\");\n _this.scope.$broadcast(\"kanban:shown-userstories-for-status\", statusId, userstories);\n return userstories;\n };\n })(this));\n };\n\n KanbanController.prototype.hideUserStoriesForStatus = function(ctx, statusId) {\n this.scope.usByStatus[statusId] = [];\n return this.scope.$broadcast(\"kanban:hidden-userstories-for-status\", statusId);\n };\n\n KanbanController.prototype.loadKanban = function() {\n return this.q.all([this.refreshTagsColors(), this.loadUserstories()]);\n };\n\n KanbanController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n if (!project.is_kanban_activated) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.projectId = project.id;\n _this.scope.points = _.sortBy(project.points, \"order\");\n _this.scope.pointsById = groupBy(project.points, function(x) {\n return x.id;\n });\n _this.scope.usStatusById = groupBy(project.us_statuses, function(x) {\n return x.id;\n });\n _this.scope.usStatusList = _.sortBy(project.us_statuses, \"order\");\n _this.generateStatusViewModes();\n _this.scope.$emit(\"project:loaded\", project);\n return project;\n };\n })(this));\n };\n\n KanbanController.prototype.initializeSubscription = function() {\n var routingKey1;\n routingKey1 = \"changes.project.\" + this.scope.projectId + \".userstories\";\n return this.events.subscribe(this.scope, routingKey1, (function(_this) {\n return function(message) {\n return _this.loadUserstories();\n };\n })(this));\n };\n\n KanbanController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise.then((function(_this) {\n return function(project) {\n _this.fillUsersAndRoles(project.members, project.roles);\n _this.initializeSubscription();\n return _this.loadKanban();\n };\n })(this));\n };\n\n KanbanController.prototype.generateStatusViewModes = function() {\n var i, len, mode, ref, status, storedStatusViewModes;\n storedStatusViewModes = this.rs.kanban.getStatusViewModes(this.scope.projectId);\n this.scope.statusViewModes = {};\n ref = this.scope.usStatusList;\n for (i = 0, len = ref.length; i < len; i++) {\n status = ref[i];\n mode = storedStatusViewModes[status.id] || defaultViewMode;\n this.scope.statusViewModes[status.id] = mode;\n }\n return this.storeStatusViewModes();\n };\n\n KanbanController.prototype.storeStatusViewModes = function() {\n return this.rs.kanban.storeStatusViewModes(this.scope.projectId, this.scope.statusViewModes);\n };\n\n KanbanController.prototype.updateStatusViewMode = function(statusId, newViewMode) {\n this.scope.statusViewModes[statusId] = newViewMode;\n return this.storeStatusViewModes();\n };\n\n KanbanController.prototype.isMaximized = function(statusId) {\n var mode;\n mode = this.scope.statusViewModes[statusId] || defaultViewMode;\n return mode === 'maximized';\n };\n\n KanbanController.prototype.isMinimized = function(statusId) {\n var mode;\n mode = this.scope.statusViewModes[statusId] || defaultViewMode;\n return mode === 'minimized';\n };\n\n KanbanController.prototype.prepareBulkUpdateData = function(uses, field) {\n if (field == null) {\n field = \"kanban_order\";\n }\n return _.map(uses, function(x) {\n return {\n \"us_id\": x.id,\n \"order\": x[field]\n };\n });\n };\n\n KanbanController.prototype.resortUserStories = function(uses) {\n var i, index, item, items, len;\n items = [];\n for (index = i = 0, len = uses.length; i < len; index = ++i) {\n item = uses[index];\n item.kanban_order = index;\n if (item.isModified()) {\n items.push(item);\n }\n }\n return items;\n };\n\n KanbanController.prototype.moveUs = function(ctx, us, oldStatusId, newStatusId, index) {\n var itemsToSave, promise, r;\n if (oldStatusId !== newStatusId) {\n r = this.scope.usByStatus[oldStatusId].indexOf(us);\n this.scope.usByStatus[oldStatusId].splice(r, 1);\n this.scope.usByStatus[newStatusId].splice(index, 0, us);\n us.status = newStatusId;\n } else {\n r = this.scope.usByStatus[newStatusId].indexOf(us);\n this.scope.usByStatus[newStatusId].splice(r, 1);\n this.scope.usByStatus[newStatusId].splice(index, 0, us);\n }\n itemsToSave = this.resortUserStories(this.scope.usByStatus[newStatusId]);\n this.scope.usByStatus[newStatusId] = _.sortBy(this.scope.usByStatus[newStatusId], \"kanban_order\");\n promise = this.repo.save(us);\n promise = promise.then((function(_this) {\n return function() {\n var data;\n itemsToSave = _.reject(itemsToSave, {\n \"id\": us.id\n });\n data = _this.prepareBulkUpdateData(itemsToSave);\n return _this.rs.userstories.bulkUpdateKanbanOrder(us.project, data).then(function() {\n return itemsToSave;\n });\n };\n })(this));\n return promise;\n };\n\n return KanbanController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"KanbanController\", KanbanController);\n\n KanbanDirective = function($repo, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n var tableBodyDom;\n tableBodyDom = $el.find(\".kanban-table-body\");\n tableBodyDom.on(\"scroll\", function(event) {\n var tableHeaderDom, target;\n target = angular.element(event.currentTarget);\n tableHeaderDom = $el.find(\".kanban-table-header .kanban-table-inner\");\n return tableHeaderDom.css(\"left\", -1 * target.scrollLeft());\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanban\", [\"$tgRepo\", \"$rootScope\", KanbanDirective]);\n\n KanbanArchivedStatusHeaderDirective = function($rootscope, $translate) {\n var hideArchivedText, link, showArchivedText;\n showArchivedText = $translate.instant(\"KANBAN.ACTION_SHOW_ARCHIVED\");\n hideArchivedText = $translate.instant(\"KANBAN.ACTION_HIDE_ARCHIVED\");\n link = function($scope, $el, $attrs) {\n var hidden, status;\n status = $scope.$eval($attrs.tgKanbanArchivedStatusHeader);\n hidden = true;\n $scope[\"class\"] = \"icon-open-eye\";\n $scope.title = showArchivedText;\n $el.on(\"click\", function(event) {\n hidden = !hidden;\n return $scope.$apply(function() {\n if (hidden) {\n $scope[\"class\"] = \"icon-open-eye\";\n $scope.title = showArchivedText;\n return $rootscope.$broadcast(\"kanban:hide-userstories-for-status\", status.id);\n } else {\n $scope[\"class\"] = \"icon-closed-eye\";\n $scope.title = hideArchivedText;\n return $rootscope.$broadcast(\"kanban:show-userstories-for-status\", status.id);\n }\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanArchivedStatusHeader\", [\"$rootScope\", \"$translate\", KanbanArchivedStatusHeaderDirective]);\n\n KanbanArchivedStatusIntroDirective = function($translate) {\n var link, userStories;\n userStories = [];\n link = function($scope, $el, $attrs) {\n var hiddenUserStoriexText, status, updateIntroText;\n hiddenUserStoriexText = $translate.instant(\"KANBAN.HIDDEN_USER_STORIES\");\n status = $scope.$eval($attrs.tgKanbanArchivedStatusIntro);\n $el.text(hiddenUserStoriexText);\n updateIntroText = function() {\n if (userStories.length > 0) {\n return $el.text(\"\");\n } else {\n return $el.text(hiddenUserStoriexText);\n }\n };\n $scope.$on(\"kanban:us:move\", function(ctx, itemUs, oldStatusId, newStatusId, itemIndex) {\n var r;\n if (status.id === newStatusId) {\n if (status.id === oldStatusId) {\n r = userStories.indexOf(itemUs);\n userStories.splice(r, 1);\n userStories.splice(itemIndex, 0, itemUs);\n } else {\n itemUs.isArchived = true;\n userStories.splice(itemIndex, 0, itemUs);\n }\n } else if (status.id === oldStatusId) {\n itemUs.isArchived = false;\n r = userStories.indexOf(itemUs);\n userStories.splice(r, 1);\n }\n return updateIntroText();\n });\n $scope.$on(\"kanban:shown-userstories-for-status\", function(ctx, statusId, userStoriesLoaded) {\n if (statusId === status.id) {\n userStories = _.filter(userStoriesLoaded, function(us) {\n return us.status === status.id;\n });\n return updateIntroText();\n }\n });\n $scope.$on(\"kanban:hidden-userstories-for-status\", function(ctx, statusId) {\n if (statusId === status.id) {\n userStories = [];\n return updateIntroText();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanArchivedStatusIntro\", [\"$translate\", KanbanArchivedStatusIntroDirective]);\n\n KanbanUserstoryDirective = function($rootscope, $loading, $rs, $rs2) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n $el.disableSelection();\n $scope.$watch(\"us\", function(us) {\n if (us.is_blocked && !$el.hasClass(\"blocked\")) {\n return $el.addClass(\"blocked\");\n } else if (!us.is_blocked && $el.hasClass(\"blocked\")) {\n return $el.removeClass(\"blocked\");\n }\n });\n $el.on('click', '.icon-edit', function(event) {\n var currentLoading, target, us;\n if ($el.find(\".icon-edit\").hasClass(\"noclick\")) {\n return;\n }\n target = $(event.target);\n currentLoading = $loading().target(target).timeout(200).removeClasses(\"icon-edit\").start();\n us = $model.$modelValue;\n return $rs.userstories.getByRef(us.project, us.ref).then((function(_this) {\n return function(editingUserStory) {\n return $rs2.attachments.list(\"us\", us.id, us.project).then(function(attachments) {\n $rootscope.$broadcast(\"usform:edit\", editingUserStory, attachments.toJS());\n return currentLoading.finish();\n });\n };\n })(this));\n });\n $scope.getTemplateUrl = function() {\n if ($scope.us.isPlaceholder) {\n return \"common/components/kanban-placeholder.html\";\n } else {\n return \"kanban/kanban-task.html\";\n }\n };\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n template: '',\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgKanbanUserstory\", [\"$rootScope\", \"$tgLoading\", \"$tgResources\", \"tgResources\", KanbanUserstoryDirective]);\n\n KanbanSquishColumnDirective = function(rs) {\n var link;\n link = function($scope, $el, $attrs) {\n var updateTableWidth;\n $scope.$on(\"project:loaded\", function(event, project) {\n $scope.folds = rs.kanban.getStatusColumnModes(project.id);\n return updateTableWidth();\n });\n $scope.foldStatus = function(status) {\n $scope.folds[status.id] = !!!$scope.folds[status.id];\n rs.kanban.storeStatusColumnModes($scope.projectId, $scope.folds);\n updateTableWidth();\n };\n return updateTableWidth = function() {\n var columnWidths, totalWidth;\n columnWidths = _.map($scope.usStatusList, function(status) {\n if ($scope.folds[status.id]) {\n return 40;\n } else {\n return 310;\n }\n });\n totalWidth = _.reduce(columnWidths, function(total, width) {\n return total + width;\n });\n return $el.find('.kanban-table-inner').css(\"width\", totalWidth);\n };\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanSquishColumn\", [\"$tgResources\", KanbanSquishColumnDirective]);\n\n KanbanWipLimitDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var redrawWipLimit, status;\n $el.disableSelection();\n status = $scope.$eval($attrs.tgKanbanWipLimit);\n redrawWipLimit = (function(_this) {\n return function() {\n $el.find(\".kanban-wip-limit\").remove();\n return timeout(200, function() {\n var element;\n element = $el.find(\".kanban-task\")[status.wip_limit];\n if (element) {\n return angular.element(element).before(\"
\");\n }\n });\n };\n })(this);\n if (status && !status.is_archived) {\n $scope.$on(\"redraw:wip\", redrawWipLimit);\n $scope.$on(\"kanban:us:move\", redrawWipLimit);\n $scope.$on(\"usform:new:success\", redrawWipLimit);\n $scope.$on(\"usform:bulk:success\", redrawWipLimit);\n }\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanWipLimit\", KanbanWipLimitDirective);\n\n KanbanUserDirective = function($log, $compile, $translate) {\n var clickable, link, template;\n template = _.template(\"
\\n class=\\\"not-clickable\\\"<% } %>>\\n \\\" alt=\\\"<%- name %>\\\" class=\\\"avatar\\\">\\n \\n
\");\n clickable = false;\n link = function($scope, $el, $attrs, $model) {\n var render, username_label, wtid;\n username_label = $el.parent().find(\"a.task-assigned\");\n username_label.addClass(\"not-clickable\");\n if (!$attrs.tgKanbanUserAvatar) {\n return $log.error(\"KanbanUserDirective: no attr is defined\");\n }\n wtid = $scope.$watch($attrs.tgKanbanUserAvatar, function(v) {\n var user;\n if ($scope.usersById == null) {\n $log.error(\"KanbanUserDirective requires userById set in scope.\");\n return wtid();\n } else {\n user = $scope.usersById[v];\n return render(user);\n }\n });\n render = function(user) {\n var ctx, html;\n if (user === void 0) {\n ctx = {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\"),\n imgurl: \"/\" + window._version + \"/images/unnamed.png\",\n clickable: clickable\n };\n } else {\n ctx = {\n name: user.full_name_display,\n imgurl: user.photo,\n clickable: clickable\n };\n }\n html = $compile(template(ctx))($scope);\n $el.html(html);\n return username_label.text(ctx.name);\n };\n bindOnce($scope, \"project\", function(project) {\n if (project.my_permissions.indexOf(\"modify_us\") > -1) {\n clickable = true;\n $el.on(\"click\", (function(_this) {\n return function(event) {\n var $ctrl, us;\n if ($el.find(\"a\").hasClass(\"noclick\")) {\n return;\n }\n us = $model.$modelValue;\n $ctrl = $el.controller();\n return $ctrl.changeUsAssignedTo(us);\n };\n })(this));\n username_label.removeClass(\"not-clickable\");\n return username_label.on(\"click\", function(event) {\n var $ctrl, us;\n if ($el.find(\"a\").hasClass(\"noclick\")) {\n return;\n }\n us = $model.$modelValue;\n $ctrl = $el.controller();\n return $ctrl.changeUsAssignedTo(us);\n });\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgKanbanUserAvatar\", [\"$log\", \"$compile\", \"$translate\", KanbanUserDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/kanban/sortable.coffee\n */\n\n(function() {\n var KanbanSortableDirective, bindOnce, groupBy, mixOf, module, scopeDefer, taiga, timeout, toggleText;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toggleText = this.taiga.toggleText;\n\n scopeDefer = this.taiga.scopeDefer;\n\n bindOnce = this.taiga.bindOnce;\n\n groupBy = this.taiga.groupBy;\n\n timeout = this.taiga.timeout;\n\n module = angular.module(\"taigaKanban\");\n\n KanbanSortableDirective = function($repo, $rs, $rootscope) {\n var link;\n link = function($scope, $el, $attrs) {\n bindOnce($scope, \"project\", function(project) {\n var deleteElement, itemEl, newParentScope, oldParentScope, tdom;\n if (!(project.my_permissions.indexOf(\"modify_us\") > -1)) {\n return;\n }\n oldParentScope = null;\n newParentScope = null;\n itemEl = null;\n tdom = $el;\n deleteElement = function(itemEl) {\n itemEl.scope().$destroy();\n itemEl.off();\n return itemEl.remove();\n };\n tdom.sortable({\n handle: \".kanban-task-inner\",\n dropOnEmpty: true,\n connectWith: \".kanban-uses-box\",\n revert: 400\n });\n tdom.on(\"sortstop\", function(event, ui) {\n var itemIndex, itemUs, newStatusId, oldStatusId, parentEl;\n parentEl = ui.item.parent();\n itemEl = ui.item;\n itemUs = itemEl.scope().us;\n itemIndex = itemEl.index();\n newParentScope = parentEl.scope();\n newStatusId = newParentScope.s.id;\n oldStatusId = oldParentScope.s.id;\n if (newStatusId !== oldStatusId) {\n deleteElement(itemEl);\n }\n $scope.$apply(function() {\n return $rootscope.$broadcast(\"kanban:us:move\", itemUs, itemUs.status, newStatusId, itemIndex);\n });\n return ui.item.find('a').removeClass('noclick');\n });\n return tdom.on(\"sortstart\", function(event, ui) {\n oldParentScope = ui.item.parent().scope();\n return ui.item.find('a').addClass('noclick');\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgKanbanSortable\", [\"$tgRepo\", \"$tgResources\", \"$rootScope\", KanbanSortableDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues/detail.coffee\n */\n\n(function() {\n var IssueDetailController, IssuePriorityButtonDirective, IssueSeverityButtonDirective, IssueStatusButtonDirective, IssueStatusDisplayDirective, IssueTypeButtonDirective, PromoteIssueToUsButtonDirective, bindMethods, bindOnce, groupBy, joinStr, mixOf, module, taiga, toString,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaIssues\");\n\n IssueDetailController = (function(superClass) {\n extend(IssueDetailController, superClass);\n\n IssueDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$log\", \"tgAppMetaService\", \"$tgAnalytics\", \"$tgNavUrls\", \"$translate\"];\n\n function IssueDetailController(scope, rootscope, repo, confirm, rs, params, q, location, log, appMetaService, analytics, navUrls, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.log = log;\n this.appMetaService = appMetaService;\n this.analytics = analytics;\n this.navUrls = navUrls;\n this.translate = translate;\n bindMethods(this);\n this.scope.issueRef = this.params.issueref;\n this.scope.sectionName = this.translate.instant(\"ISSUES.SECTION_NAME\");\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n _this._setMeta();\n return _this.initializeOnDeleteGoToUrl();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n IssueDetailController.prototype._setMeta = function() {\n var description, ref, ref1, ref2, ref3, title;\n title = this.translate.instant(\"ISSUE.PAGE_TITLE\", {\n issueRef: \"#\" + this.scope.issue.ref,\n issueSubject: this.scope.issue.subject,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"ISSUE.PAGE_DESCRIPTION\", {\n issueStatus: ((ref = this.scope.statusById[this.scope.issue.status]) != null ? ref.name : void 0) || \"--\",\n issueType: ((ref1 = this.scope.typeById[this.scope.issue.type]) != null ? ref1.name : void 0) || \"--\",\n issueSeverity: ((ref2 = this.scope.severityById[this.scope.issue.severity]) != null ? ref2.name : void 0) || \"--\",\n issuePriority: ((ref3 = this.scope.priorityById[this.scope.issue.priority]) != null ? ref3.name : void 0) || \"--\",\n issueDescription: angular.element(this.scope.issue.description_html || \"\").text()\n });\n return this.appMetaService.setAll(title, description);\n };\n\n IssueDetailController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"attachment:create\", (function(_this) {\n return function() {\n return _this.analytics.trackEvent(\"attachment\", \"create\", \"create attachment on issue\", 1);\n };\n })(this));\n this.scope.$on(\"promote-issue-to-us:success\", (function(_this) {\n return function() {\n _this.analytics.trackEvent(\"issue\", \"promoteToUserstory\", \"promote issue to userstory\", 1);\n _this.rootscope.$broadcast(\"object:updated\");\n return _this.loadIssue();\n };\n })(this));\n this.scope.$on(\"comment:new\", (function(_this) {\n return function() {\n return _this.loadIssue();\n };\n })(this));\n return this.scope.$on(\"custom-attributes-values:edit\", (function(_this) {\n return function() {\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this));\n };\n\n IssueDetailController.prototype.initializeOnDeleteGoToUrl = function() {\n var ctx;\n ctx = {\n project: this.scope.project.slug\n };\n if (this.scope.project.is_issues_activated) {\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-issues\", ctx);\n } else {\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project\", ctx);\n }\n };\n\n IssueDetailController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n _this.scope.statusList = project.issue_statuses;\n _this.scope.statusById = groupBy(project.issue_statuses, function(x) {\n return x.id;\n });\n _this.scope.typeById = groupBy(project.issue_types, function(x) {\n return x.id;\n });\n _this.scope.typeList = _.sortBy(project.issue_types, \"order\");\n _this.scope.severityList = project.severities;\n _this.scope.severityById = groupBy(project.severities, function(x) {\n return x.id;\n });\n _this.scope.priorityList = project.priorities;\n _this.scope.priorityById = groupBy(project.priorities, function(x) {\n return x.id;\n });\n return project;\n };\n })(this));\n };\n\n IssueDetailController.prototype.loadIssue = function() {\n return this.rs.issues.getByRef(this.scope.projectId, this.params.issueref).then((function(_this) {\n return function(issue) {\n var ctx, ref, ref1;\n _this.scope.issue = issue;\n _this.scope.issueId = issue.id;\n _this.scope.commentModel = issue;\n if (((ref = _this.scope.issue.neighbors.previous) != null ? ref.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.issue.neighbors.previous.ref\n };\n _this.scope.previousUrl = _this.navUrls.resolve(\"project-issues-detail\", ctx);\n }\n if (((ref1 = _this.scope.issue.neighbors.next) != null ? ref1.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.issue.neighbors.next.ref\n };\n return _this.scope.nextUrl = _this.navUrls.resolve(\"project-issues-detail\", ctx);\n }\n };\n })(this));\n };\n\n IssueDetailController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise.then((function(_this) {\n return function(project) {\n _this.fillUsersAndRoles(project.members, project.roles);\n return _this.loadIssue();\n };\n })(this));\n };\n\n\n /*\n * Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n * See app/modules/components/vote-button for more info\n */\n\n IssueDetailController.prototype.onUpvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssue();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.issues.upvote(this.scope.issueId).then(onSuccess, onError);\n };\n\n IssueDetailController.prototype.onDownvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssue();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.issues.downvote(this.scope.issueId).then(onSuccess, onError);\n };\n\n\n /*\n * Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n * See app/modules/components/watch-button for more info\n */\n\n IssueDetailController.prototype.onWatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssue();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.issues.watch(this.scope.issueId).then(onSuccess, onError);\n };\n\n IssueDetailController.prototype.onUnwatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadIssue();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.issues.unwatch(this.scope.issueId).then(onSuccess, onError);\n };\n\n return IssueDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"IssueDetailController\", IssueDetailController);\n\n IssueStatusDisplayDirective = function($template, $compile) {\n var link, template;\n template = $template.get(\"common/components/status-display.html\", true);\n link = function($scope, $el, $attrs) {\n var render;\n render = function(issue) {\n var html, status;\n status = $scope.statusById[issue.status];\n html = template({\n is_closed: status.is_closed,\n status: status\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $scope.$watch($attrs.ngModel, function(issue) {\n if (issue != null) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssueStatusDisplay\", [\"$tgTemplate\", \"$compile\", IssueStatusDisplayDirective]);\n\n IssueStatusButtonDirective = function($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) {\n var link, template;\n template = $template.get(\"issue/issues-status-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_issue\") !== -1;\n };\n render = (function(_this) {\n return function(issue) {\n var html, status;\n status = $scope.statusById[issue.status];\n html = template({\n status: status,\n statuses: $scope.statusList,\n editable: isEditable()\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n })(this);\n save = $qqueue.bindAdd((function(_this) {\n return function(statusId) {\n var currentLoading, issue, onError, onSuccess;\n $.fn.popover().closeAll();\n issue = $model.$modelValue.clone();\n issue.status = statusId;\n currentLoading = $loading().target($el).start();\n onSuccess = function() {\n $model.$setViewValue(issue);\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n issue.revert();\n $model.$setViewValue(issue);\n return currentLoading.finish();\n };\n return $repo.save(issue).then(onSuccess, onError);\n };\n })(this));\n $el.on(\"click\", \".js-edit-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", function(event) {\n var target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n return save(target.data(\"status-id\"));\n });\n $scope.$watch($attrs.ngModel, function(issue) {\n if (issue) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssueStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", IssueStatusButtonDirective]);\n\n IssueTypeButtonDirective = function($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) {\n var link, template;\n template = $template.get(\"issue/issue-type-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_issue\") !== -1;\n };\n render = (function(_this) {\n return function(issue) {\n var html, type;\n type = $scope.typeById[issue.type];\n html = template({\n type: type,\n typees: $scope.typeList,\n editable: isEditable()\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n })(this);\n save = $qqueue.bindAdd((function(_this) {\n return function(type) {\n var currentLoading, issue, onError, onSuccess;\n $.fn.popover().closeAll();\n issue = $model.$modelValue.clone();\n issue.type = type;\n currentLoading = $loading().target($el.find(\".level-name\")).start();\n onSuccess = function() {\n $model.$setViewValue(issue);\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n issue.revert();\n $model.$setViewValue(issue);\n return currentLoading.finish();\n };\n return $repo.save(issue).then(onSuccess, onError);\n };\n })(this));\n $el.on(\"click\", \".type-data\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-type\").popover().open();\n });\n $el.on(\"click\", \".type\", function(event) {\n var target, type;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n type = target.data(\"type-id\");\n return save(type);\n });\n $scope.$watch($attrs.ngModel, function(issue) {\n if (issue) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssueTypeButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", IssueTypeButtonDirective]);\n\n IssueSeverityButtonDirective = function($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) {\n var link, template;\n template = $template.get(\"issue/issue-severity-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_issue\") !== -1;\n };\n render = (function(_this) {\n return function(issue) {\n var html, severity;\n severity = $scope.severityById[issue.severity];\n html = template({\n severity: severity,\n severityes: $scope.severityList,\n editable: isEditable()\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n })(this);\n save = $qqueue.bindAdd((function(_this) {\n return function(severity) {\n var currentLoading, issue, onError, onSuccess;\n $.fn.popover().closeAll();\n issue = $model.$modelValue.clone();\n issue.severity = severity;\n currentLoading = $loading().target($el.find(\".level-name\")).start();\n onSuccess = function() {\n $model.$setViewValue(issue);\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n issue.revert();\n $model.$setViewValue(issue);\n return currentLoading.finish();\n };\n return $repo.save(issue).then(onSuccess, onError);\n };\n })(this));\n $el.on(\"click\", \".severity-data\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-severity\").popover().open();\n });\n $el.on(\"click\", \".severity\", function(event) {\n var severity, target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n severity = target.data(\"severity-id\");\n return save(severity);\n });\n $scope.$watch($attrs.ngModel, function(issue) {\n if (issue) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssueSeverityButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", IssueSeverityButtonDirective]);\n\n IssuePriorityButtonDirective = function($rootScope, $repo, $confirm, $loading, $qqueue, $template, $compile) {\n var link, template;\n template = $template.get(\"issue/issue-priority-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_issue\") !== -1;\n };\n render = (function(_this) {\n return function(issue) {\n var html, priority;\n priority = $scope.priorityById[issue.priority];\n html = template({\n priority: priority,\n priorityes: $scope.priorityList,\n editable: isEditable()\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n })(this);\n save = $qqueue.bindAdd((function(_this) {\n return function(priority) {\n var currentLoading, issue, onError, onSuccess;\n $.fn.popover().closeAll();\n issue = $model.$modelValue.clone();\n issue.priority = priority;\n currentLoading = $loading().target($el.find(\".level-name\")).start();\n onSuccess = function() {\n $model.$setViewValue(issue);\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n issue.revert();\n $model.$setViewValue(issue);\n return currentLoading.finish();\n };\n return $repo.save(issue).then(onSuccess, onError);\n };\n })(this));\n $el.on(\"click\", \".priority-data\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-priority\").popover().open();\n });\n $el.on(\"click\", \".priority\", function(event) {\n var priority, target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n priority = target.data(\"priority-id\");\n return save(priority);\n });\n $scope.$watch($attrs.ngModel, function(issue) {\n if (issue) {\n return render(issue);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgIssuePriorityButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", IssuePriorityButtonDirective]);\n\n PromoteIssueToUsButtonDirective = function($rootScope, $repo, $confirm, $qqueue, $translate) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var save;\n save = $qqueue.bindAdd((function(_this) {\n return function(issue, askResponse) {\n var data, onError, onSuccess;\n data = {\n generated_from_issue: issue.id,\n project: issue.project,\n subject: issue.subject,\n description: issue.description,\n tags: issue.tags,\n is_blocked: issue.is_blocked,\n blocked_note: issue.blocked_note\n };\n onSuccess = function() {\n askResponse.finish();\n $confirm.notify(\"success\");\n return $rootScope.$broadcast(\"promote-issue-to-us:success\");\n };\n onError = function() {\n askResponse.finish();\n return $confirm.notify(\"error\");\n };\n return $repo.create(\"userstories\", data).then(onSuccess, onError);\n };\n })(this));\n $el.on(\"click\", \"a\", function(event) {\n var issue, message, subtitle, title;\n event.preventDefault();\n issue = $model.$modelValue;\n title = $translate.instant(\"ISSUES.CONFIRM_PROMOTE.TITLE\");\n message = $translate.instant(\"ISSUES.CONFIRM_PROMOTE.MESSAGE\");\n subtitle = issue.subject;\n return $confirm.ask(title, subtitle, message).then((function(_this) {\n return function(response) {\n return save(issue, response);\n };\n })(this));\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n restrict: \"AE\",\n require: \"ngModel\",\n templateUrl: \"issue/promote-issue-to-us-button.html\",\n link: link\n };\n };\n\n module.directive(\"tgPromoteIssueToUsButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgQqueue\", \"$translate\", PromoteIssueToUsButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues/lightboxes.coffee\n */\n\n(function() {\n var CreateBulkIssuesDirective, CreateIssueDirective, bindOnce, debounce, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaIssues\");\n\n CreateIssueDirective = function($repo, $confirm, $rootscope, lightboxService, $loading, $q, attachmentsService) {\n var link;\n link = function($scope, $el, $attrs) {\n var attachmentsToAdd, createAttachments, form, resetAttachments, submit, submitButton;\n form = $el.find(\"form\").checksley();\n $scope.issue = {};\n $scope.attachments = Immutable.List();\n $scope.$on(\"issueform:new\", function(ctx, project) {\n var attachmentsToAdd;\n attachmentsToAdd = Immutable.List();\n $el.find(\".tag-input\").val(\"\");\n lightboxService.open($el);\n return $scope.issue = {\n project: project.id,\n subject: \"\",\n status: project.default_issue_status,\n type: project.default_issue_type,\n priority: project.default_priority,\n severity: project.default_severity,\n tags: []\n };\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n createAttachments = function(obj) {\n var promises;\n promises = _.map(attachmentsToAdd.toJS(), function(attachment) {\n return attachmentsService.upload(attachment.file, obj.id, $scope.issue.project, 'issue');\n });\n return $q.all(promises);\n };\n attachmentsToAdd = Immutable.List();\n resetAttachments = function() {\n return attachmentsToAdd = Immutable.List();\n };\n $scope.addAttachment = function(attachment) {\n return attachmentsToAdd = attachmentsToAdd.push(attachment);\n };\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.create(\"issues\", $scope.issue);\n promise.then(function(data) {\n return createAttachments(data);\n });\n promise.then(function(data) {\n currentLoading.finish();\n $rootscope.$broadcast(\"issueform:new:success\", data);\n lightboxService.close($el);\n return $confirm.notify(\"success\");\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateIssue\", [\"$tgRepo\", \"$tgConfirm\", \"$rootScope\", \"lightboxService\", \"$tgLoading\", \"$q\", \"tgAttachmentsService\", CreateIssueDirective]);\n\n CreateBulkIssuesDirective = function($repo, $rs, $confirm, $rootscope, $loading, lightboxService) {\n var link;\n link = function($scope, $el, attrs) {\n var submit, submitButton;\n $scope.$on(\"issueform:bulk\", function(ctx, projectId, status) {\n lightboxService.open($el);\n return $scope[\"new\"] = {\n projectId: projectId,\n bulk: \"\"\n };\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, data, form, projectId, promise;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n data = $scope[\"new\"].bulk;\n projectId = $scope[\"new\"].projectId;\n promise = $rs.issues.bulkCreate(projectId, data);\n promise.then(function(result) {\n currentLoading.finish();\n $rootscope.$broadcast(\"issueform:new:success\", result);\n lightboxService.close($el);\n return $confirm.notify(\"success\");\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateBulkIssues\", [\"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$rootScope\", \"$tgLoading\", \"lightboxService\", CreateBulkIssuesDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues/list.coffee\n */\n\n(function() {\n var IssueAssignedToInlineEditionDirective, IssueStatusInlineEditionDirective, IssuesController, IssuesDirective, IssuesFiltersDirective, bindOnce, debounceLeading, groupBy, joinStr, mixOf, module, startswith, taiga, toString, trim,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n trim = this.taiga.trim;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n debounceLeading = this.taiga.debounceLeading;\n\n startswith = this.taiga.startswith;\n\n module = angular.module(\"taigaIssues\");\n\n IssuesController = (function(superClass) {\n extend(IssuesController, superClass);\n\n IssuesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$tgUrls\", \"$routeParams\", \"$q\", \"$tgLocation\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgEvents\", \"$tgAnalytics\", \"$translate\"];\n\n function IssuesController(scope, rootscope, repo, confirm, rs, urls, params, q, location, appMetaService, navUrls, events, analytics, translate) {\n var filters, promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.urls = urls;\n this.params = params;\n this.q = q;\n this.location = location;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.events = events;\n this.analytics = analytics;\n this.translate = translate;\n this.loadIssues = bind(this.loadIssues, this);\n this.scope.sectionName = \"Issues\";\n this.scope.filters = {};\n if (_.isEmpty(this.location.search())) {\n filters = this.rs.issues.getFilters(this.params.pslug);\n filters.page = 1;\n this.location.search(filters);\n this.location.replace();\n return;\n }\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ISSUES.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.translate.instant(\"ISSUES.PAGE_DESCRIPTION\", {\n projectName: _this.scope.project.name,\n projectDescription: _this.scope.project.description\n });\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"issueform:new:success\", (function(_this) {\n return function() {\n _this.analytics.trackEvent(\"issue\", \"create\", \"create issue on issues list\", 1);\n return _this.loadIssues();\n };\n })(this));\n }\n\n IssuesController.prototype.initializeSubscription = function() {\n var routingKey;\n routingKey = \"changes.project.\" + this.scope.projectId + \".issues\";\n return this.events.subscribe(this.scope, routingKey, (function(_this) {\n return function(message) {\n return _this.loadIssues();\n };\n })(this));\n };\n\n IssuesController.prototype.storeFilters = function() {\n return this.rs.issues.storeFilters(this.params.pslug, this.location.search());\n };\n\n IssuesController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n if (!project.is_issues_activated) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n _this.scope.issueStatusById = groupBy(project.issue_statuses, function(x) {\n return x.id;\n });\n _this.scope.issueStatusList = _.sortBy(project.issue_statuses, \"order\");\n _this.scope.severityById = groupBy(project.severities, function(x) {\n return x.id;\n });\n _this.scope.severityList = _.sortBy(project.severities, \"order\");\n _this.scope.priorityById = groupBy(project.priorities, function(x) {\n return x.id;\n });\n _this.scope.priorityList = _.sortBy(project.priorities, \"order\");\n _this.scope.issueTypes = _.sortBy(project.issue_types, \"order\");\n _this.scope.issueTypeById = groupBy(project.issue_types, function(x) {\n return x.id;\n });\n return project;\n };\n })(this));\n };\n\n IssuesController.prototype.getUrlFilters = function() {\n var filters;\n filters = _.pick(this.location.search(), \"page\", \"tags\", \"status\", \"types\", \"q\", \"severities\", \"priorities\", \"assignedTo\", \"createdBy\", \"orderBy\");\n if (!filters.page) {\n filters.page = 1;\n }\n return filters;\n };\n\n IssuesController.prototype.getUrlFilter = function(name) {\n var filters;\n filters = _.pick(this.location.search(), name);\n return filters[name];\n };\n\n IssuesController.prototype.loadMyFilters = function() {\n return this.rs.issues.getMyFilters(this.scope.projectId).then((function(_this) {\n return function(filters) {\n return _.map(filters, function(value, key) {\n return {\n id: key,\n name: key,\n type: \"myFilters\",\n selected: false\n };\n });\n };\n })(this));\n };\n\n IssuesController.prototype.removeNotExistingFiltersFromUrl = function() {\n var currentSearch, existingValues, filterName, filterValue, splittedValues, urlfilters;\n currentSearch = this.location.search();\n urlfilters = this.getUrlFilters();\n for (filterName in urlfilters) {\n filterValue = urlfilters[filterName];\n if (filterName === \"page\" || filterName === \"orderBy\" || filterName === \"q\") {\n continue;\n }\n if (filterName === \"tags\") {\n splittedValues = _.map((\"\" + filterValue).split(\",\"));\n } else {\n splittedValues = _.map((\"\" + filterValue).split(\",\"), function(x) {\n if (x === \"null\") {\n return null;\n } else {\n return parseInt(x);\n }\n });\n }\n existingValues = _.intersection(splittedValues, _.map(this.scope.filters[filterName], \"id\"));\n if (splittedValues.length !== existingValues.length) {\n this.location.search(filterName, existingValues.join());\n }\n }\n if (currentSearch !== this.location.search()) {\n return this.location.replace();\n }\n };\n\n IssuesController.prototype.markSelectedFilters = function(filters, urlfilters) {\n var isSelected, j, key, len, name, obj, ref, ref1, results, searchdata, val, value;\n searchdata = {};\n ref = _.omit(urlfilters, \"page\", \"orderBy\");\n for (name in ref) {\n value = ref[name];\n if (searchdata[name] == null) {\n searchdata[name] = {};\n }\n ref1 = (\"\" + value).split(\",\");\n for (j = 0, len = ref1.length; j < len; j++) {\n val = ref1[j];\n searchdata[name][val] = true;\n }\n }\n isSelected = function(type, id) {\n if ((searchdata[type] != null) && searchdata[type][id]) {\n return true;\n }\n return false;\n };\n results = [];\n for (key in filters) {\n value = filters[key];\n results.push((function() {\n var k, len1, results1;\n results1 = [];\n for (k = 0, len1 = value.length; k < len1; k++) {\n obj = value[k];\n results1.push(obj.selected = isSelected(obj.type, obj.id) ? true : void 0);\n }\n return results1;\n })());\n }\n return results;\n };\n\n IssuesController.prototype.loadFilters = function() {\n var loadFilters, promise, urlfilters;\n urlfilters = this.getUrlFilters();\n if (urlfilters.q) {\n this.scope.filtersQ = urlfilters.q;\n }\n promise = this.loadMyFilters().then((function(_this) {\n return function(myFilters) {\n _this.scope.filters.myFilters = myFilters;\n return myFilters;\n };\n })(this));\n loadFilters = {};\n loadFilters.project = this.scope.projectId;\n loadFilters.tags = urlfilters.tags;\n loadFilters.status = urlfilters.status;\n loadFilters.q = urlfilters.q;\n loadFilters.types = urlfilters.types;\n loadFilters.severities = urlfilters.severities;\n loadFilters.priorities = urlfilters.priorities;\n loadFilters.assigned_to = urlfilters.assignedTo;\n loadFilters.owner = urlfilters.createdBy;\n promise = promise.then((function(_this) {\n return function() {\n return _this.rs.issues.filtersData(loadFilters);\n };\n })(this));\n return promise.then((function(_this) {\n return function(data) {\n var choicesFiltersFormat, tagsFilterFormat, usersFiltersFormat;\n usersFiltersFormat = function(users, type, unknownOption) {\n var reformatedUsers, unknownItem;\n reformatedUsers = _.map(users, function(t) {\n t.type = type;\n t.name = t.full_name ? t.full_name : unknownOption;\n return t;\n });\n unknownItem = _.remove(reformatedUsers, function(u) {\n return !u.id;\n });\n reformatedUsers = _.sortBy(reformatedUsers, function(u) {\n return u.name.toUpperCase();\n });\n if (unknownItem.length > 0) {\n reformatedUsers.unshift(unknownItem[0]);\n }\n return reformatedUsers;\n };\n choicesFiltersFormat = function(choices, type, byIdObject) {\n return _.map(choices, function(t) {\n t.type = type;\n return t;\n });\n };\n tagsFilterFormat = function(tags) {\n return _.map(tags, function(t) {\n t.id = t.name;\n t.type = 'tags';\n return t;\n });\n };\n _this.scope.filters.status = choicesFiltersFormat(data.statuses, \"status\", _this.scope.issueStatusById);\n _this.scope.filters.severities = choicesFiltersFormat(data.severities, \"severities\", _this.scope.severityById);\n _this.scope.filters.priorities = choicesFiltersFormat(data.priorities, \"priorities\", _this.scope.priorityById);\n _this.scope.filters.assignedTo = usersFiltersFormat(data.assigned_to, \"assignedTo\", \"Unassigned\");\n _this.scope.filters.createdBy = usersFiltersFormat(data.owners, \"createdBy\", \"Unknown\");\n _this.scope.filters.types = choicesFiltersFormat(data.types, \"types\", _this.scope.issueTypeById);\n _this.scope.filters.tags = tagsFilterFormat(data.tags);\n _this.removeNotExistingFiltersFromUrl();\n _this.markSelectedFilters(_this.scope.filters, urlfilters);\n return _this.rootscope.$broadcast(\"filters:loaded\", _this.scope.filters);\n };\n })(this));\n };\n\n IssuesController.prototype.loadIssuesRequests = 0;\n\n IssuesController.prototype.loadIssues = function() {\n var name, promise, ref, values;\n this.scope.urlFilters = this.getUrlFilters();\n this.scope.httpParams = {};\n ref = this.scope.urlFilters;\n for (name in ref) {\n values = ref[name];\n if (name === \"severities\") {\n name = \"severity\";\n } else if (name === \"orderBy\") {\n name = \"order_by\";\n } else if (name === \"priorities\") {\n name = \"priority\";\n } else if (name === \"assignedTo\") {\n name = \"assigned_to\";\n } else if (name === \"createdBy\") {\n name = \"owner\";\n } else if (name === \"status\") {\n name = \"status\";\n } else if (name === \"types\") {\n name = \"type\";\n }\n this.scope.httpParams[name] = values;\n }\n promise = this.rs.issues.list(this.scope.projectId, this.scope.httpParams);\n this.loadIssuesRequests += 1;\n promise.index = this.loadIssuesRequests;\n promise.then((function(_this) {\n return function(data) {\n if (promise.index === _this.loadIssuesRequests) {\n _this.scope.issues = data.models;\n _this.scope.page = data.current;\n _this.scope.count = data.count;\n _this.scope.paginatedBy = data.paginatedBy;\n }\n return data;\n };\n })(this));\n return promise;\n };\n\n IssuesController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise.then((function(_this) {\n return function(project) {\n _this.fillUsersAndRoles(project.members, project.roles);\n _this.initializeSubscription();\n _this.loadFilters();\n return _this.loadIssues();\n };\n })(this));\n };\n\n IssuesController.prototype.saveCurrentFiltersTo = function(newFilter) {\n var deferred;\n deferred = this.q.defer();\n this.rs.issues.getMyFilters(this.scope.projectId).then((function(_this) {\n return function(filters) {\n filters[newFilter] = _this.location.search();\n return _this.rs.issues.storeMyFilters(_this.scope.projectId, filters).then(function() {\n return deferred.resolve();\n });\n };\n })(this));\n return deferred.promise;\n };\n\n IssuesController.prototype.deleteMyFilter = function(filter) {\n var deferred;\n deferred = this.q.defer();\n this.rs.issues.getMyFilters(this.scope.projectId).then((function(_this) {\n return function(filters) {\n delete filters[filter];\n return _this.rs.issues.storeMyFilters(_this.scope.projectId, filters).then(function() {\n return deferred.resolve();\n });\n };\n })(this));\n return deferred.promise;\n };\n\n IssuesController.prototype.addNewIssue = function() {\n return this.rootscope.$broadcast(\"issueform:new\", this.scope.project);\n };\n\n IssuesController.prototype.addIssuesInBulk = function() {\n return this.rootscope.$broadcast(\"issueform:bulk\", this.scope.projectId);\n };\n\n return IssuesController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"IssuesController\", IssuesController);\n\n IssuesDirective = function($log, $location, $template, $compile) {\n var link, linkOrdering, linkPagination, template;\n template = $template.get(\"issue/issue-paginator.html\", true);\n linkPagination = function($scope, $el, $attrs, $ctrl) {\n var $pagEl, afterCurrent, atBegin, atEnd, beforeCurrent, getNumPages, renderPagination;\n afterCurrent = 2;\n beforeCurrent = 4;\n atBegin = 2;\n atEnd = 2;\n $pagEl = $el.find(\".issues-paginator\");\n getNumPages = function() {\n var numPages;\n numPages = $scope.count / $scope.paginatedBy;\n if (parseInt(numPages, 10) < numPages) {\n numPages = parseInt(numPages, 10) + 1;\n } else {\n numPages = parseInt(numPages, 10);\n }\n return numPages;\n };\n renderPagination = function() {\n var cpage, html, i, j, numPages, options, pages, ref;\n numPages = getNumPages();\n if (numPages <= 1) {\n $pagEl.hide();\n return;\n }\n $pagEl.show();\n pages = [];\n options = {};\n options.pages = pages;\n options.showPrevious = $scope.page > 1;\n options.showNext = !($scope.page === numPages);\n cpage = $scope.page;\n for (i = j = 1, ref = numPages; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\n if (i === (cpage + afterCurrent) && numPages > (cpage + afterCurrent + atEnd)) {\n pages.push({\n classes: \"dots\",\n type: \"dots\"\n });\n } else if (i === (cpage - beforeCurrent) && cpage > (atBegin + beforeCurrent)) {\n pages.push({\n classes: \"dots\",\n type: \"dots\"\n });\n } else if (i > (cpage + afterCurrent) && i <= (numPages - atEnd)) {\n\n } else if (i < (cpage - beforeCurrent) && i > atBegin) {\n\n } else if (i === cpage) {\n pages.push({\n classes: \"active\",\n num: i,\n type: \"page-active\"\n });\n } else {\n pages.push({\n classes: \"page\",\n num: i,\n type: \"page\"\n });\n }\n }\n html = template(options);\n html = $compile(html)($scope);\n return $pagEl.html(html);\n };\n $scope.$watch(\"issues\", function(value) {\n if (!value) {\n return;\n }\n return renderPagination();\n });\n $el.on(\"click\", \".issues-paginator a.next\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", $scope.page + 1);\n return $ctrl.loadIssues();\n });\n });\n $el.on(\"click\", \".issues-paginator a.previous\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", $scope.page - 1);\n return $ctrl.loadIssues();\n });\n });\n return $el.on(\"click\", \".issues-paginator li.page > a\", function(event) {\n var pagenum, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n pagenum = target.data(\"pagenum\");\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", pagenum);\n return $ctrl.loadIssues();\n });\n });\n };\n linkOrdering = function($scope, $el, $attrs, $ctrl) {\n var colHeadElement, currentOrder, icon;\n currentOrder = $ctrl.getUrlFilter(\"orderBy\") || \"created_date\";\n if (currentOrder) {\n icon = startswith(currentOrder, \"-\") ? \"icon-arrow-up\" : \"icon-arrow-bottom\";\n colHeadElement = $el.find(\".row.title > div[data-fieldname='\" + (trim(currentOrder, \"-\")) + \"']\");\n colHeadElement.html((colHeadElement.html()) + \"\");\n }\n return $el.on(\"click\", \".row.title > div\", function(event) {\n var finalOrder, newOrder, target;\n target = angular.element(event.currentTarget);\n currentOrder = $ctrl.getUrlFilter(\"orderBy\");\n newOrder = target.data(\"fieldname\");\n finalOrder = currentOrder === newOrder ? \"-\" + newOrder : newOrder;\n return $scope.$apply(function() {\n $ctrl.replaceFilter(\"orderBy\", finalOrder);\n $ctrl.storeFilters();\n return $ctrl.loadIssues().then(function() {\n $el.find(\".row.title > div > span.icon\").remove();\n icon = startswith(finalOrder, \"-\") ? \"icon-arrow-up\" : \"icon-arrow-bottom\";\n return target.html((target.html()) + \"\");\n });\n });\n });\n };\n link = function($scope, $el, $attrs) {\n var $ctrl;\n $ctrl = $el.controller();\n linkOrdering($scope, $el, $attrs, $ctrl);\n linkPagination($scope, $el, $attrs, $ctrl);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgIssues\", [\"$log\", \"$tgLocation\", \"$tgTemplate\", \"$compile\", IssuesDirective]);\n\n IssuesFiltersDirective = function($q, $log, $location, $rs, $confirm, $loading, $template, $translate, $compile, $auth) {\n var link, template, templateSelected;\n template = $template.get(\"issue/issues-filters.html\", true);\n templateSelected = $template.get(\"issue/issues-filters-selected.html\", true);\n link = function($scope, $el, $attrs) {\n var $ctrl, getFiltersType, initializeSelectedFilters, reloadIssues, renderFilters, renderSelectedFilters, selectQFilter, selectedFilters, showCategories, showFilters, toggleFilterSelection, unwatchIssues;\n $ctrl = $el.closest(\".wrapper\").controller();\n selectedFilters = [];\n showFilters = function(title, type) {\n $el.find(\".filters-cats\").hide();\n $el.find(\".filter-list\").removeClass(\"hidden\");\n $el.find(\"h2.breadcrumb\").removeClass(\"hidden\");\n $el.find(\"h2 a.subfilter span.title\").html(title);\n return $el.find(\"h2 a.subfilter span.title\").prop(\"data-type\", type);\n };\n showCategories = function() {\n $el.find(\".filters-cats\").show();\n $el.find(\".filter-list\").addClass(\"hidden\");\n return $el.find(\"h2.breadcrumb\").addClass(\"hidden\");\n };\n initializeSelectedFilters = function(filters) {\n var j, len, name, val, values;\n selectedFilters = [];\n for (name in filters) {\n values = filters[name];\n for (j = 0, len = values.length; j < len; j++) {\n val = values[j];\n if (val.selected) {\n selectedFilters.push(val);\n }\n }\n }\n return renderSelectedFilters(selectedFilters);\n };\n renderSelectedFilters = function(selectedFilters) {\n var html;\n _.filter(selectedFilters, (function(_this) {\n return function(f) {\n if (f.color) {\n return f.style = \"border-left: 3px solid \" + f.color;\n }\n };\n })(this));\n html = templateSelected({\n filters: selectedFilters\n });\n html = $compile(html)($scope);\n $el.find(\".filters-applied\").html(html);\n if ($auth.isAuthenticated() && selectedFilters.length > 0) {\n return $el.find(\".save-filters\").show();\n } else {\n return $el.find(\".save-filters\").hide();\n }\n };\n renderFilters = function(filters) {\n var html;\n _.filter(filters, (function(_this) {\n return function(f) {\n if (f.color) {\n return f.style = \"border-left: 3px solid \" + f.color;\n }\n };\n })(this));\n html = template({\n filters: filters\n });\n html = $compile(html)($scope);\n return $el.find(\".filter-list\").html(html);\n };\n getFiltersType = function() {\n return $el.find(\"h2 a.subfilter span.title\").prop('data-type');\n };\n reloadIssues = function() {\n var currentFiltersType;\n currentFiltersType = getFiltersType();\n return $q.all([$ctrl.loadIssues(), $ctrl.loadFilters()]).then(function() {\n var filters;\n filters = $scope.filters[currentFiltersType];\n return renderFilters(_.reject(filters, \"selected\"));\n });\n };\n toggleFilterSelection = function(type, id) {\n var currentFiltersType, filter, filterId, filters;\n if (type === \"myFilters\") {\n $rs.issues.getMyFilters($scope.projectId).then(function(data) {\n var filters, myFilters;\n myFilters = data;\n filters = myFilters[id];\n filters.page = 1;\n $ctrl.replaceAllFilters(filters);\n $ctrl.storeFilters();\n $ctrl.loadIssues();\n $ctrl.markSelectedFilters($scope.filters, filters);\n return initializeSelectedFilters($scope.filters);\n });\n return null;\n }\n filters = $scope.filters[type];\n filterId = type === 'tags' ? taiga.toString(id) : id;\n filter = _.find(filters, {\n id: filterId\n });\n filter.selected = !filter.selected;\n if (id === null) {\n id = \"null\";\n }\n if (filter.selected) {\n selectedFilters.push(filter);\n $ctrl.selectFilter(type, id);\n $ctrl.selectFilter(\"page\", 1);\n $ctrl.storeFilters();\n } else {\n selectedFilters = _.reject(selectedFilters, function(f) {\n return f.id === filter.id && f.type === filter.type;\n });\n $ctrl.unselectFilter(type, id);\n $ctrl.selectFilter(\"page\", 1);\n $ctrl.storeFilters();\n }\n reloadIssues();\n renderSelectedFilters(selectedFilters);\n currentFiltersType = getFiltersType();\n if (type === currentFiltersType) {\n return renderFilters(_.reject(filters, \"selected\"));\n }\n };\n $scope.$on(\"filters:loaded\", function(ctx, filters) {\n return initializeSelectedFilters(filters);\n });\n $scope.$on(\"filters:issueupdate\", function(ctx, filters) {\n var html;\n html = template({\n filters: filters.status\n });\n html = $compile(html)($scope);\n return $el.find(\".filter-list\").html(html);\n });\n selectQFilter = debounceLeading(100, function(value, oldValue) {\n if (value === void 0 || value === oldValue) {\n return;\n }\n $ctrl.replaceFilter(\"page\", null, true);\n if (value.length === 0) {\n $ctrl.replaceFilter(\"q\", null);\n $ctrl.storeFilters();\n } else {\n $ctrl.replaceFilter(\"q\", value);\n $ctrl.storeFilters();\n }\n return reloadIssues();\n });\n unwatchIssues = $scope.$watch(\"issues\", function(newValue) {\n if (!_.isUndefined(newValue)) {\n $scope.$watch(\"filtersQ\", selectQFilter);\n return unwatchIssues();\n }\n });\n $el.on(\"click\", \".filters-cats > ul > li > a\", function(event) {\n var tags, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n tags = $scope.filters[target.data(\"type\")];\n renderFilters(_.reject(tags, \"selected\"));\n return showFilters(target.attr(\"title\"), target.data(\"type\"));\n });\n $el.on(\"click\", \".filters-inner > .filters-step-cat > .breadcrumb > .back\", function(event) {\n event.preventDefault();\n return showCategories($el);\n });\n $el.on(\"click\", \".filters-applied a\", function(event) {\n var id, target, type;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n id = target.data(\"id\") || null;\n type = target.data(\"type\");\n return toggleFilterSelection(type, id);\n });\n $el.on(\"click\", \".filter-list .single-filter\", function(event) {\n var id, target, type;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n target.toggleClass(\"active\");\n id = target.data(\"id\") || null;\n type = target.data(\"type\");\n if (type === \"myFilters\") {\n target.removeClass(\"active\");\n }\n return toggleFilterSelection(type, id);\n });\n $el.on(\"click\", \".filter-list .single-filter .icon-delete\", function(event) {\n var customFilterName, message, target, title;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n customFilterName = target.parent().data('id');\n title = $translate.instant(\"ISSUES.FILTERS.CONFIRM_DELETE.TITLE\");\n message = $translate.instant(\"ISSUES.FILTERS.CONFIRM_DELETE.MESSAGE\", {\n customFilterName: customFilterName\n });\n return $confirm.askOnDelete(title, message).then(function(askResponse) {\n var promise;\n promise = $ctrl.deleteMyFilter(customFilterName);\n promise.then(function() {\n promise = $ctrl.loadMyFilters();\n promise.then(function(filters) {\n askResponse.finish();\n $scope.filters.myFilters = filters;\n return renderFilters($scope.filters.myFilters);\n });\n return promise.then(null, function() {\n return askResponse.finish();\n });\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n });\n });\n });\n $el.on(\"click\", \".save-filters\", function(event) {\n event.preventDefault();\n renderFilters($scope.filters[\"myFilters\"]);\n showFilters(\"My filters\", \"myFilters\");\n $el.find('.save-filters').hide();\n $el.find('.my-filter-name').removeClass(\"hidden\");\n $el.find('.my-filter-name').focus();\n return $scope.$apply();\n });\n return $el.on(\"keyup\", \".my-filter-name\", function(event) {\n var currentLoading, newFilter, promise, target;\n event.preventDefault();\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n newFilter = target.val();\n currentLoading = $loading().target($el.find(\".new\")).start();\n promise = $ctrl.saveCurrentFiltersTo(newFilter);\n promise.then(function() {\n var loadPromise;\n loadPromise = $ctrl.loadMyFilters();\n loadPromise.then(function(filters) {\n var currentfilterstype;\n currentLoading.finish();\n $scope.filters.myFilters = filters;\n currentfilterstype = $el.find(\"h2 a.subfilter span.title\").prop('data-type');\n if (currentfilterstype === \"myFilters\") {\n renderFilters($scope.filters.myFilters);\n }\n $el.find('.my-filter-name').addClass(\"hidden\");\n return $el.find('.save-filters').show();\n });\n return loadPromise.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\", \"Error loading custom filters\");\n });\n });\n return promise.then(null, function() {\n currentLoading.finish();\n $el.find(\".my-filter-name\").val(newFilter).focus().select();\n return $confirm.notify(\"error\", \"Filter not saved\");\n });\n } else if (event.keyCode === 27) {\n $el.find('.my-filter-name').val('');\n $el.find('.my-filter-name').addClass(\"hidden\");\n return $el.find('.save-filters').show();\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgIssuesFilters\", [\"$q\", \"$log\", \"$tgLocation\", \"$tgResources\", \"$tgConfirm\", \"$tgLoading\", \"$tgTemplate\", \"$translate\", \"$compile\", \"$tgAuth\", IssuesFiltersDirective]);\n\n IssueStatusInlineEditionDirective = function($repo, $template, $rootscope) {\n\n /*\n Print the status of an Issue and a popover to change it.\n - tg-issue-status-inline-edition: The issue\n \n Example:\n \n div.status(tg-issue-status-inline-edition=\"issue\")\n a.issue-status(href=\"\")\n \n NOTE: This directive need 'issueStatusById' and 'project'.\n */\n var link, selectionTemplate, updateIssueStatus;\n selectionTemplate = $template.get(\"issue/issue-status-inline-edition-selection.html\", true);\n updateIssueStatus = function($el, issue, issueStatusById) {\n var issueStatusDom, issueStatusDomParent, status;\n issueStatusDomParent = $el.find(\".issue-status\");\n issueStatusDom = $el.find(\".issue-status .issue-status-bind\");\n status = issueStatusById[issue.status];\n if (status) {\n issueStatusDom.text(status.name);\n issueStatusDom.prop(\"title\", status.name);\n return issueStatusDomParent.css('color', status.color);\n }\n };\n link = function($scope, $el, $attrs) {\n var $ctrl, issue;\n $ctrl = $el.controller();\n issue = $scope.$eval($attrs.tgIssueStatusInlineEdition);\n $el.on(\"click\", \".issue-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", function(event) {\n var filter, j, len, ref, target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n ref = $scope.filters.status;\n for (j = 0, len = ref.length; j < len; j++) {\n filter = ref[j];\n if (filter.id === issue.status) {\n filter.count--;\n }\n }\n issue.status = target.data(\"status-id\");\n $el.find(\".pop-status\").popover().close();\n updateIssueStatus($el, issue, $scope.issueStatusById);\n return $scope.$apply(function() {\n var k, len1, ref1;\n $repo.save(issue).then(function() {\n return $ctrl.loadIssues();\n });\n ref1 = $scope.filters.status;\n for (k = 0, len1 = ref1.length; k < len1; k++) {\n filter = ref1[k];\n if (filter.id === issue.status) {\n filter.count++;\n }\n }\n return $rootscope.$broadcast(\"filters:issueupdate\", $scope.filters);\n });\n });\n taiga.bindOnce($scope, \"project\", function(project) {\n $el.append(selectionTemplate({\n 'statuses': project.issue_statuses\n }));\n updateIssueStatus($el, issue, $scope.issueStatusById);\n if (project.my_permissions.indexOf(\"modify_issue\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n $scope.$watch($attrs.tgIssueStatusInlineEdition, (function(_this) {\n return function(val) {\n return updateIssueStatus($el, val, $scope.issueStatusById);\n };\n })(this));\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgIssueStatusInlineEdition\", [\"$tgRepo\", \"$tgTemplate\", \"$rootScope\", IssueStatusInlineEditionDirective]);\n\n IssueAssignedToInlineEditionDirective = function($repo, $rootscope, $translate) {\n var link, template;\n template = _.template(\"\\\" alt=\\\"<%- name %>\\\"/>\\n
<%- name %>
\");\n link = function($scope, $el, $attrs) {\n var $ctrl, issue, updateIssue;\n updateIssue = function(issue) {\n var ctx, member;\n ctx = {\n name: $translate.instant(\"COMMON.ASSIGNED_TO.NOT_ASSIGNED\"),\n imgurl: \"/\" + window._version + \"/images/unnamed.png\"\n };\n member = $scope.usersById[issue.assigned_to];\n if (member) {\n ctx.name = member.full_name_display;\n ctx.imgurl = member.photo;\n }\n $el.find(\".avatar\").html(template(ctx));\n return $el.find(\".issue-assignedto\").attr('title', ctx.name);\n };\n $ctrl = $el.controller();\n issue = $scope.$eval($attrs.tgIssueAssignedToInlineEdition);\n updateIssue(issue);\n $el.on(\"click\", \".issue-assignedto\", function(event) {\n return $rootscope.$broadcast(\"assigned-to:add\", issue);\n });\n taiga.bindOnce($scope, \"project\", function(project) {\n if (project.my_permissions.indexOf(\"modify_issue\") === -1) {\n $el.unbind(\"click\");\n return $el.find(\"a\").addClass(\"not-clickable\");\n }\n });\n $scope.$on(\"assigned-to:added\", (function(_this) {\n return function(ctx, userId, updatedIssue) {\n if (updatedIssue.id === issue.id) {\n updatedIssue.assigned_to = userId;\n $repo.save(updatedIssue);\n return updateIssue(updatedIssue);\n }\n };\n })(this));\n $scope.$watch($attrs.tgIssueAssignedToInlineEdition, (function(_this) {\n return function(val) {\n return updateIssue(val);\n };\n })(this));\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgIssueAssignedToInlineEdition\", [\"$tgRepo\", \"$rootScope\", \"$translate\", IssueAssignedToInlineEditionDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/userstories/detail.coffee\n */\n\n(function() {\n var UsClientRequirementButtonDirective, UsStatusButtonDirective, UsStatusDisplayDirective, UsTeamRequirementButtonDirective, UserStoryDetailController, bindMethods, bindOnce, groupBy, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaUserStories\");\n\n UserStoryDetailController = (function(superClass) {\n extend(UserStoryDetailController, superClass);\n\n UserStoryDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$log\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\"];\n\n function UserStoryDetailController(scope, rootscope, repo, confirm, rs, params, q, location, log, appMetaService, navUrls, analytics, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.log = log;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.translate = translate;\n bindMethods(this);\n this.scope.usRef = this.params.usref;\n this.scope.sectionName = this.translate.instant(\"US.SECTION_NAME\");\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n _this._setMeta();\n return _this.initializeOnDeleteGoToUrl();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n UserStoryDetailController.prototype._setMeta = function() {\n var closedTasks, description, progressPercentage, ref, title, totalTasks;\n totalTasks = this.scope.tasks.length;\n closedTasks = _.filter(this.scope.tasks, (function(_this) {\n return function(t) {\n return _this.scope.taskStatusById[t.status].is_closed;\n };\n })(this)).length;\n progressPercentage = totalTasks > 0 ? Math.round(100 * closedTasks / totalTasks) : 0;\n title = this.translate.instant(\"US.PAGE_TITLE\", {\n userStoryRef: \"#\" + this.scope.us.ref,\n userStorySubject: this.scope.us.subject,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"US.PAGE_DESCRIPTION\", {\n userStoryStatus: ((ref = this.scope.statusById[this.scope.us.status]) != null ? ref.name : void 0) || \"--\",\n userStoryPoints: this.scope.us.total_points,\n userStoryDescription: angular.element(this.scope.us.description_html || \"\").text(),\n userStoryClosedTasks: closedTasks,\n userStoryTotalTasks: totalTasks,\n userStoryProgressPercentage: progressPercentage\n });\n return this.appMetaService.setAll(title, description);\n };\n\n UserStoryDetailController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"related-tasks:update\", (function(_this) {\n return function() {\n var allClosed;\n _this.scope.tasks = _.clone(_this.scope.tasks, false);\n allClosed = _.every(_this.scope.tasks, function(task) {\n return task.is_closed;\n });\n if (_this.scope.us.is_closed !== allClosed) {\n return _this.loadUs();\n }\n };\n })(this));\n this.scope.$on(\"attachment:create\", (function(_this) {\n return function() {\n return _this.analytics.trackEvent(\"attachment\", \"create\", \"create attachment on userstory\", 1);\n };\n })(this));\n return this.scope.$on(\"comment:new\", (function(_this) {\n return function() {\n return _this.loadUs();\n };\n })(this));\n };\n\n UserStoryDetailController.prototype.initializeOnDeleteGoToUrl = function() {\n var ctx;\n ctx = {\n project: this.scope.project.slug\n };\n this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project\", ctx);\n if (this.scope.project.is_backlog_activated) {\n if (this.scope.us.milestone) {\n ctx.sprint = this.scope.sprint.slug;\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-taskboard\", ctx);\n } else {\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-backlog\", ctx);\n }\n } else if (this.scope.project.is_kanban_activated) {\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-kanban\", ctx);\n }\n };\n\n UserStoryDetailController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n _this.scope.statusList = project.us_statuses;\n _this.scope.statusById = groupBy(project.us_statuses, function(x) {\n return x.id;\n });\n _this.scope.taskStatusById = groupBy(project.task_statuses, function(x) {\n return x.id;\n });\n _this.scope.pointsList = _.sortBy(project.points, \"order\");\n _this.scope.pointsById = groupBy(_this.scope.pointsList, function(e) {\n return e.id;\n });\n return project;\n };\n })(this));\n };\n\n UserStoryDetailController.prototype.loadUs = function() {\n var httpParams, kanbanStaus, milestone, noMilestone;\n httpParams = _.pick(this.location.search(), \"milestone\", \"no-milestone\", \"kanban-status\");\n milestone = httpParams.milestone;\n if (milestone) {\n this.rs.userstories.storeQueryParams(this.scope.projectId, {\n milestone: milestone,\n order_by: \"sprint_order\"\n });\n }\n noMilestone = httpParams[\"no-milestone\"];\n if (noMilestone) {\n this.rs.userstories.storeQueryParams(this.scope.projectId, {\n milestone: \"null\",\n order_by: \"backlog_order\"\n });\n }\n kanbanStaus = httpParams[\"kanban-status\"];\n if (kanbanStaus) {\n this.rs.userstories.storeQueryParams(this.scope.projectId, {\n status: kanbanStaus,\n order_by: \"kanban_order\"\n });\n }\n return this.rs.userstories.getByRef(this.scope.projectId, this.params.usref).then((function(_this) {\n return function(us) {\n var ctx, ref, ref1;\n _this.scope.us = us;\n _this.scope.usId = us.id;\n _this.scope.commentModel = us;\n if (((ref = _this.scope.us.neighbors.previous) != null ? ref.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.us.neighbors.previous.ref\n };\n _this.scope.previousUrl = _this.navUrls.resolve(\"project-userstories-detail\", ctx);\n }\n if (((ref1 = _this.scope.us.neighbors.next) != null ? ref1.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.us.neighbors.next.ref\n };\n _this.scope.nextUrl = _this.navUrls.resolve(\"project-userstories-detail\", ctx);\n }\n return us;\n };\n })(this));\n };\n\n UserStoryDetailController.prototype.loadSprint = function() {\n if (this.scope.us.milestone) {\n return this.rs.sprints.get(this.scope.us.project, this.scope.us.milestone).then((function(_this) {\n return function(sprint) {\n _this.scope.sprint = sprint;\n return sprint;\n };\n })(this));\n }\n };\n\n UserStoryDetailController.prototype.loadTasks = function() {\n return this.rs.tasks.list(this.scope.projectId, null, this.scope.usId).then((function(_this) {\n return function(tasks) {\n _this.scope.tasks = tasks;\n return tasks;\n };\n })(this));\n };\n\n UserStoryDetailController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise.then((function(_this) {\n return function(project) {\n _this.fillUsersAndRoles(project.members, project.roles);\n return _this.loadUs().then(function() {\n return _this.q.all([_this.loadSprint(), _this.loadTasks()]);\n });\n };\n })(this));\n };\n\n\n /*\n * Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n * See app/modules/components/vote-button for more info\n */\n\n UserStoryDetailController.prototype.onUpvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadUs();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.userstories.upvote(this.scope.usId).then(onSuccess, onError);\n };\n\n UserStoryDetailController.prototype.onDownvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadUs();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.userstories.downvote(this.scope.usId).then(onSuccess, onError);\n };\n\n\n /*\n * Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n * See app/modules/components/watch-button for more info\n */\n\n UserStoryDetailController.prototype.onWatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadUs();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.userstories.watch(this.scope.usId).then(onSuccess, onError);\n };\n\n UserStoryDetailController.prototype.onUnwatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadUs();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.userstories.unwatch(this.scope.usId).then(onSuccess, onError);\n };\n\n return UserStoryDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"UserStoryDetailController\", UserStoryDetailController);\n\n UsStatusDisplayDirective = function($template, $compile) {\n var link, template;\n template = $template.get(\"common/components/status-display.html\", true);\n link = function($scope, $el, $attrs) {\n var render;\n render = function(us) {\n var html, status;\n status = $scope.statusById[us.status];\n html = template({\n is_closed: us.is_closed,\n status: status\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $scope.$watch($attrs.ngModel, function(us) {\n if (us != null) {\n return render(us);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsStatusDisplay\", [\"$tgTemplate\", \"$compile\", UsStatusDisplayDirective]);\n\n UsStatusButtonDirective = function($rootScope, $repo, $confirm, $loading, $qqueue, $template) {\n var link, template;\n template = $template.get(\"us/us-status-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_us\") !== -1;\n };\n render = (function(_this) {\n return function(us) {\n var html, status;\n status = $scope.statusById[us.status];\n html = template({\n status: status,\n statuses: $scope.statusList,\n editable: isEditable()\n });\n return $el.html(html);\n };\n })(this);\n save = $qqueue.bindAdd((function(_this) {\n return function(status) {\n var currentLoading, onError, onSuccess, us;\n us = $model.$modelValue.clone();\n us.status = status;\n $.fn.popover().closeAll();\n currentLoading = $loading().target($el).start();\n onSuccess = function() {\n $model.$setViewValue(us);\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return $repo.save(us).then(onSuccess, onError);\n };\n })(this));\n $el.on(\"click\", \".js-edit-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", function(event) {\n var status, target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n status = target.data(\"status-id\");\n return save(status);\n });\n $scope.$watch($attrs.ngModel, function(us) {\n if (us) {\n return render(us);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", UsStatusButtonDirective]);\n\n UsTeamRequirementButtonDirective = function($rootscope, $tgrepo, $confirm, $loading, $qqueue, $template, $compile) {\n var link, template;\n template = $template.get(\"us/us-team-requirement-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var canEdit, render, save;\n canEdit = function() {\n return $scope.project.my_permissions.indexOf(\"modify_us\") !== -1;\n };\n render = function(us) {\n var ctx, html;\n ctx = {\n canEdit: canEdit(),\n isRequired: us.team_requirement\n };\n html = template(ctx);\n html = $compile(html)($scope);\n return $el.html(html);\n };\n save = $qqueue.bindAdd((function(_this) {\n return function(team_requirement) {\n var currentLoading, promise, us;\n us = $model.$modelValue.clone();\n us.team_requirement = team_requirement;\n currentLoading = $loading().target($el.find(\"label\")).start();\n promise = $tgrepo.save(us);\n promise.then(function() {\n $model.$setViewValue(us);\n currentLoading.finish();\n return $rootscope.$broadcast(\"object:updated\");\n });\n return promise.then(null, function() {\n currentLoading.finish();\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n $el.on(\"click\", \".team-requirement\", function(event) {\n var team_requirement;\n if (!canEdit()) {\n return;\n }\n team_requirement = !$model.$modelValue.team_requirement;\n return save(team_requirement);\n });\n $scope.$watch($attrs.ngModel, function(us) {\n if (us) {\n return render(us);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsTeamRequirementButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", UsTeamRequirementButtonDirective]);\n\n UsClientRequirementButtonDirective = function($rootscope, $tgrepo, $confirm, $loading, $qqueue, $template, $compile) {\n var link, template;\n template = $template.get(\"us/us-client-requirement-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var canEdit, render, save;\n canEdit = function() {\n return $scope.project.my_permissions.indexOf(\"modify_us\") !== -1;\n };\n render = function(us) {\n var ctx, html;\n ctx = {\n canEdit: canEdit(),\n isRequired: us.client_requirement\n };\n html = $compile(template(ctx))($scope);\n return $el.html(html);\n };\n save = $qqueue.bindAdd((function(_this) {\n return function(client_requirement) {\n var currentLoading, promise, us;\n us = $model.$modelValue.clone();\n us.client_requirement = client_requirement;\n currentLoading = $loading().target($el.find(\"label\")).start();\n promise = $tgrepo.save(us);\n promise.then(function() {\n $model.$setViewValue(us);\n currentLoading.finish();\n return $rootscope.$broadcast(\"object:updated\");\n });\n return promise.then(null, function() {\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n $el.on(\"click\", \".client-requirement\", function(event) {\n var client_requirement;\n if (!canEdit()) {\n return;\n }\n client_requirement = !$model.$modelValue.client_requirement;\n return save(client_requirement);\n });\n $scope.$watch($attrs.ngModel, function(us) {\n if (us) {\n return render(us);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgUsClientRequirementButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$tgTemplate\", \"$compile\", UsClientRequirementButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/tasks/detail.coffee\n */\n\n(function() {\n var TaskDetailController, TaskIsIocaineButtonDirective, TaskStatusButtonDirective, TaskStatusDisplayDirective, bindMethods, groupBy, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaTasks\");\n\n TaskDetailController = (function(superClass) {\n extend(TaskDetailController, superClass);\n\n TaskDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$log\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\"];\n\n function TaskDetailController(scope, rootscope, repo, confirm, rs, params, q, location, log, appMetaService, navUrls, analytics, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.log = log;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.translate = translate;\n bindMethods(this);\n this.scope.taskRef = this.params.taskref;\n this.scope.sectionName = this.translate.instant(\"TASK.SECTION_NAME\");\n this.initializeEventHandlers();\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n _this._setMeta();\n return _this.initializeOnDeleteGoToUrl();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n TaskDetailController.prototype._setMeta = function() {\n var description, ref, title;\n title = this.translate.instant(\"TASK.PAGE_TITLE\", {\n taskRef: \"#\" + this.scope.task.ref,\n taskSubject: this.scope.task.subject,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"TASK.PAGE_DESCRIPTION\", {\n taskStatus: ((ref = this.scope.statusById[this.scope.task.status]) != null ? ref.name : void 0) || \"--\",\n taskDescription: angular.element(this.scope.task.description_html || \"\").text()\n });\n return this.appMetaService.setAll(title, description);\n };\n\n TaskDetailController.prototype.initializeEventHandlers = function() {\n this.scope.$on(\"attachment:create\", (function(_this) {\n return function() {\n return _this.analytics.trackEvent(\"attachment\", \"create\", \"create attachment on task\", 1);\n };\n })(this));\n this.scope.$on(\"custom-attributes-values:edit\", (function(_this) {\n return function() {\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this));\n return this.scope.$on(\"comment:new\", (function(_this) {\n return function() {\n return _this.loadTask();\n };\n })(this));\n };\n\n TaskDetailController.prototype.initializeOnDeleteGoToUrl = function() {\n var ctx;\n ctx = {\n project: this.scope.project.slug\n };\n this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project\", ctx);\n if (this.scope.project.is_backlog_activated) {\n if (this.scope.task.milestone) {\n ctx.sprint = this.scope.sprint.slug;\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-taskboard\", ctx);\n } else if (this.scope.task.us) {\n ctx.ref = this.scope.us.ref;\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-userstories-detail\", ctx);\n }\n } else if (this.scope.project.is_kanban_activated) {\n if (this.scope.us) {\n ctx.ref = this.scope.us.ref;\n return this.scope.onDeleteGoToUrl = this.navUrls.resolve(\"project-userstories-detail\", ctx);\n }\n }\n };\n\n TaskDetailController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n _this.scope.statusList = project.task_statuses;\n _this.scope.statusById = groupBy(project.task_statuses, function(x) {\n return x.id;\n });\n return project;\n };\n })(this));\n };\n\n TaskDetailController.prototype.loadTask = function() {\n return this.rs.tasks.getByRef(this.scope.projectId, this.params.taskref).then((function(_this) {\n return function(task) {\n var ctx, ref, ref1;\n _this.scope.task = task;\n _this.scope.taskId = task.id;\n _this.scope.commentModel = task;\n if (((ref = _this.scope.task.neighbors.previous) != null ? ref.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.task.neighbors.previous.ref\n };\n _this.scope.previousUrl = _this.navUrls.resolve(\"project-tasks-detail\", ctx);\n }\n if (((ref1 = _this.scope.task.neighbors.next) != null ? ref1.ref : void 0) != null) {\n ctx = {\n project: _this.scope.project.slug,\n ref: _this.scope.task.neighbors.next.ref\n };\n _this.scope.nextUrl = _this.navUrls.resolve(\"project-tasks-detail\", ctx);\n }\n return task;\n };\n })(this));\n };\n\n TaskDetailController.prototype.loadSprint = function() {\n if (this.scope.task.milestone) {\n return this.rs.sprints.get(this.scope.task.project, this.scope.task.milestone).then((function(_this) {\n return function(sprint) {\n _this.scope.sprint = sprint;\n return sprint;\n };\n })(this));\n }\n };\n\n TaskDetailController.prototype.loadUserStory = function() {\n if (this.scope.task.user_story) {\n return this.rs.userstories.get(this.scope.task.project, this.scope.task.user_story).then((function(_this) {\n return function(us) {\n _this.scope.us = us;\n return us;\n };\n })(this));\n }\n };\n\n TaskDetailController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise.then((function(_this) {\n return function(project) {\n _this.fillUsersAndRoles(project.members, project.roles);\n return _this.loadTask().then(function() {\n return _this.q.all([_this.loadSprint(), _this.loadUserStory()]);\n });\n };\n })(this));\n };\n\n\n /*\n * Note: This methods (onUpvote() and onDownvote()) are related to tg-vote-button.\n * See app/modules/components/vote-button for more info\n */\n\n TaskDetailController.prototype.onUpvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadTask();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.tasks.upvote(this.scope.taskId).then(onSuccess, onError);\n };\n\n TaskDetailController.prototype.onDownvote = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadTask();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.tasks.downvote(this.scope.taskId).then(onSuccess, onError);\n };\n\n\n /*\n * Note: This methods (onWatch() and onUnwatch()) are related to tg-watch-button.\n * See app/modules/components/watch-button for more info\n */\n\n TaskDetailController.prototype.onWatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadTask();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.tasks.watch(this.scope.taskId).then(onSuccess, onError);\n };\n\n TaskDetailController.prototype.onUnwatch = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.loadTask();\n return _this.rootscope.$broadcast(\"object:updated\");\n };\n })(this);\n onError = (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this);\n return this.rs.tasks.unwatch(this.scope.taskId).then(onSuccess, onError);\n };\n\n return TaskDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"TaskDetailController\", TaskDetailController);\n\n TaskStatusDisplayDirective = function($template, $compile) {\n var link, template;\n template = $template.get(\"common/components/status-display.html\", true);\n link = function($scope, $el, $attrs) {\n var render;\n render = function(task) {\n var html, status;\n status = $scope.statusById[task.status];\n html = template({\n is_closed: status.is_closed,\n status: status\n });\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $scope.$watch($attrs.ngModel, function(task) {\n if (task != null) {\n return render(task);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgTaskStatusDisplay\", [\"$tgTemplate\", \"$compile\", TaskStatusDisplayDirective]);\n\n TaskStatusButtonDirective = function($rootScope, $repo, $confirm, $loading, $qqueue, $compile, $translate, $template) {\n var link, template;\n template = $template.get(\"us/us-status-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_task\") !== -1;\n };\n render = (function(_this) {\n return function(task) {\n var html, status;\n status = $scope.statusById[task.status];\n html = $compile(template({\n status: status,\n statuses: $scope.statusList,\n editable: isEditable()\n }))($scope);\n return $el.html(html);\n };\n })(this);\n save = $qqueue.bindAdd((function(_this) {\n return function(status) {\n var currentLoading, onError, onSuccess, task;\n task = $model.$modelValue.clone();\n task.status = status;\n currentLoading = $loading().target($el).start();\n onSuccess = function() {\n $model.$setViewValue(task);\n $rootScope.$broadcast(\"object:updated\");\n return currentLoading.finish();\n };\n onError = function() {\n $confirm.notify(\"error\");\n return currentLoading.finish();\n };\n return $repo.save(task).then(onSuccess, onError);\n };\n })(this));\n $el.on(\"click\", \".js-edit-status\", function(event) {\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n return $el.find(\".pop-status\").popover().open();\n });\n $el.on(\"click\", \".status\", function(event) {\n var target;\n event.preventDefault();\n event.stopPropagation();\n if (!isEditable()) {\n return;\n }\n target = angular.element(event.currentTarget);\n $.fn.popover().closeAll();\n return save(target.data(\"status-id\"));\n });\n $scope.$watch($attrs.ngModel, function(task) {\n if (task) {\n return render(task);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgTaskStatusButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$compile\", \"$translate\", \"$tgTemplate\", TaskStatusButtonDirective]);\n\n TaskIsIocaineButtonDirective = function($rootscope, $tgrepo, $confirm, $loading, $qqueue, $compile, $template) {\n var link, template;\n template = $template.get(\"issue/iocaine-button.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var isEditable, render, save;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_task\") !== -1;\n };\n render = function(task) {\n var ctx, html;\n if (!isEditable() && !task.is_iocaine) {\n $el.html(\"\");\n return;\n }\n ctx = {\n isIocaine: task.is_iocaine,\n isEditable: isEditable()\n };\n html = $compile(template(ctx))($scope);\n return $el.html(html);\n };\n save = $qqueue.bindAdd((function(_this) {\n return function(is_iocaine) {\n var currentLoading, promise, task;\n task = $model.$modelValue.clone();\n task.is_iocaine = is_iocaine;\n currentLoading = $loading().target($el.find('label')).start();\n promise = $tgrepo.save(task);\n promise.then(function() {\n $model.$setViewValue(task);\n return $rootscope.$broadcast(\"object:updated\");\n });\n promise.then(null, function() {\n return $confirm.notify(\"error\");\n });\n return promise[\"finally\"](function() {\n return currentLoading.finish();\n });\n };\n })(this));\n $el.on(\"click\", \".is-iocaine\", function(event) {\n var is_iocaine;\n if (!isEditable()) {\n return;\n }\n is_iocaine = !$model.$modelValue.is_iocaine;\n return save(is_iocaine);\n });\n $scope.$watch($attrs.ngModel, function(task) {\n if (task) {\n return render(task);\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgTaskIsIocaineButton\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgQqueue\", \"$compile\", \"$tgTemplate\", TaskIsIocaineButtonDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/team/main.coffee\n */\n\n(function() {\n var LeaveProjectDirective, TeamController, TeamFiltersDirective, TeamMemberCurrentUserDirective, TeamMemberStatsDirective, TeamMembersDirective, membersFilter, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n module = angular.module(\"taigaTeam\");\n\n TeamController = (function(superClass) {\n extend(TeamController, superClass);\n\n TeamController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"$q\", \"$location\", \"$tgNavUrls\", \"tgAppMetaService\", \"$tgAuth\", \"$translate\", \"tgProjectService\"];\n\n function TeamController(scope, rootscope, repo, rs, params, q, location, navUrls, appMetaService, auth, translate, projectService) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.auth = auth;\n this.translate = translate;\n this.projectService = projectService;\n this.scope.sectionName = \"TEAM.SECTION_NAME\";\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"TEAM.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.translate.instant(\"TEAM.PAGE_DESCRIPTION\", {\n projectName: _this.scope.project.name,\n projectDescription: _this.scope.project.description\n });\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n TeamController.prototype.setRole = function(role) {\n if (role) {\n return this.scope.filtersRole = role;\n } else {\n return this.scope.filtersRole = null;\n }\n };\n\n TeamController.prototype.loadMembers = function() {\n var i, len, member, ref, user;\n user = this.auth.getUser();\n this.scope.totals = {};\n ref = this.scope.activeUsers;\n for (i = 0, len = ref.length; i < len; i++) {\n member = ref[i];\n this.scope.totals[member.id] = 0;\n }\n this.scope.currentUser = _.find(this.scope.activeUsers, {\n id: user != null ? user.id : void 0\n });\n return this.scope.memberships = _.reject(this.scope.activeUsers, {\n id: user != null ? user.id : void 0\n });\n };\n\n TeamController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n _this.scope.issuesEnabled = project.is_issues_activated;\n _this.scope.tasksEnabled = project.is_kanban_activated || project.is_backlog_activated;\n _this.scope.wikiEnabled = project.is_wiki_activated;\n return project;\n };\n })(this));\n };\n\n TeamController.prototype.loadMemberStats = function() {\n return this.rs.projects.memberStats(this.scope.projectId).then((function(_this) {\n return function(stats) {\n var totals;\n totals = {};\n _.forEach(_this.scope.totals, function(total, userId) {\n var vals;\n vals = _.map(stats, function(memberStats, statsKey) {\n return memberStats[userId];\n });\n total = _.reduce(vals, function(sum, el) {\n return sum + el;\n });\n return _this.scope.totals[userId] = total;\n });\n _this.scope.stats = _this._processStats(stats);\n return _this.scope.stats.totals = _this.scope.totals;\n };\n })(this));\n };\n\n TeamController.prototype._processStat = function(stat) {\n var max, min, singleStat;\n max = _.max(stat);\n min = _.min(stat);\n singleStat = _.map(stat, function(value, key) {\n if (value === min) {\n return [key, 0.1];\n }\n if (value === max) {\n return [key, 1];\n }\n return [key, (value * 0.5) / max];\n });\n singleStat = _.object(singleStat);\n return singleStat;\n };\n\n TeamController.prototype._processStats = function(stats) {\n var key, value;\n for (key in stats) {\n value = stats[key];\n stats[key] = this._processStat(value);\n }\n return stats;\n };\n\n TeamController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise.then((function(_this) {\n return function(project) {\n _this.fillUsersAndRoles(project.members, project.roles);\n _this.loadMembers();\n return _this.loadMemberStats();\n };\n })(this));\n };\n\n return TeamController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"TeamController\", TeamController);\n\n TeamFiltersDirective = function() {\n return {\n templateUrl: \"team/team-filter.html\"\n };\n };\n\n module.directive(\"tgTeamFilters\", [TeamFiltersDirective]);\n\n TeamMemberStatsDirective = function() {\n return {\n templateUrl: \"team/team-member-stats.html\",\n scope: {\n stats: \"=\",\n userId: \"=user\",\n issuesEnabled: \"=issuesenabled\",\n tasksEnabled: \"=tasksenabled\",\n wikiEnabled: \"=wikienabled\"\n }\n };\n };\n\n module.directive(\"tgTeamMemberStats\", TeamMemberStatsDirective);\n\n TeamMemberCurrentUserDirective = function() {\n return {\n templateUrl: \"team/team-member-current-user.html\",\n scope: {\n projectId: \"=projectid\",\n currentUser: \"=currentuser\",\n stats: \"=\",\n issuesEnabled: \"=issuesenabled\",\n tasksEnabled: \"=tasksenabled\",\n wikiEnabled: \"=wikienabled\"\n }\n };\n };\n\n module.directive(\"tgTeamCurrentUser\", TeamMemberCurrentUserDirective);\n\n TeamMembersDirective = function() {\n var template;\n template = \"team/team-members.html\";\n return {\n templateUrl: template,\n scope: {\n memberships: \"=\",\n filtersQ: \"=filtersq\",\n filtersRole: \"=filtersrole\",\n stats: \"=\",\n issuesEnabled: \"=issuesenabled\",\n tasksEnabled: \"=tasksenabled\",\n wikiEnabled: \"=wikienabled\"\n }\n };\n };\n\n module.directive(\"tgTeamMembers\", TeamMembersDirective);\n\n LeaveProjectDirective = function($repo, $confirm, $location, $rs, $navurls, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n return $scope.leave = function() {\n var confirm_leave_project_text, leave_project_text;\n leave_project_text = $translate.instant(\"TEAM.ACTION_LEAVE_PROJECT\");\n confirm_leave_project_text = $translate.instant(\"TEAM.CONFIRM_LEAVE_PROJECT\");\n return $confirm.ask(leave_project_text, confirm_leave_project_text).then((function(_this) {\n return function(response) {\n var promise;\n promise = $rs.projects.leave($attrs.projectid);\n promise.then(function() {\n response.finish();\n $confirm.notify(\"success\");\n return $location.path($navurls.resolve(\"home\"));\n });\n return promise.then(null, function(response) {\n response.finish();\n return $confirm.notify('error', response.data._error_message);\n });\n };\n })(this));\n };\n };\n return {\n scope: {},\n templateUrl: \"team/leave-project.html\",\n link: link\n };\n };\n\n module.directive(\"tgLeaveProject\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"$tgResources\", \"$tgNavUrls\", \"$translate\", LeaveProjectDirective]);\n\n membersFilter = function() {\n return function(members, filtersQ, filtersRole) {\n return _.filter(members, function(m) {\n return (!filtersRole || m.role === filtersRole.id) && (!filtersQ || m.full_name.search(new RegExp(filtersQ, \"i\")) >= 0);\n });\n };\n };\n\n module.filter('membersFilter', membersFilter);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/wiki/detail.coffee\n */\n\n(function() {\n var EditableWikiContentDirective, WikiDetailController, WikiSummaryDirective, bindOnce, debounce, groupBy, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaWiki\");\n\n WikiDetailController = (function(superClass) {\n extend(WikiDetailController, superClass);\n\n WikiDetailController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgModel\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$filter\", \"$log\", \"tgAppMetaService\", \"$tgNavUrls\", \"$tgAnalytics\", \"$translate\"];\n\n function WikiDetailController(scope, rootscope, repo, model, confirm, rs, params, q, location, filter, log, appMetaService, navUrls, analytics, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.model = model;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.filter = filter;\n this.log = log;\n this.appMetaService = appMetaService;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.translate = translate;\n this.scope.projectSlug = this.params.pslug;\n this.scope.wikiSlug = this.params.slug;\n this.scope.wikiTitle = this.scope.wikiSlug;\n this.scope.sectionName = \"Wiki\";\n this.scope.linksVisible = false;\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n return _this._setMeta();\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n WikiDetailController.prototype._setMeta = function() {\n var description, ref, ref1, ref2, title;\n title = this.translate.instant(\"WIKI.PAGE_TITLE\", {\n wikiPageName: this.scope.wikiTitle,\n projectName: this.scope.project.name\n });\n description = this.translate.instant(\"WIKI.PAGE_DESCRIPTION\", {\n wikiPageContent: angular.element(((ref = this.scope.wiki) != null ? ref.html : void 0) || \"\").text(),\n totalEditions: ((ref1 = this.scope.wiki) != null ? ref1.editions : void 0) || 0,\n lastModifiedDate: moment((ref2 = this.scope.wiki) != null ? ref2.modified_date : void 0).format(this.translate.instant(\"WIKI.DATETIME\"))\n });\n return this.appMetaService.setAll(title, description);\n };\n\n WikiDetailController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n if (!project.is_wiki_activated) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n return project;\n };\n })(this));\n };\n\n WikiDetailController.prototype.loadWiki = function() {\n var promise;\n promise = this.rs.wiki.getBySlug(this.scope.projectId, this.params.slug);\n promise.then((function(_this) {\n return function(wiki) {\n _this.scope.wiki = wiki;\n _this.scope.wikiId = wiki.id;\n return _this.scope.wiki;\n };\n })(this));\n return promise.then(null, (function(_this) {\n return function(xhr) {\n var data;\n _this.scope.wikiId = null;\n if (_this.scope.project.my_permissions.indexOf(\"add_wiki_page\") === -1) {\n return null;\n }\n data = {\n project: _this.scope.projectId,\n slug: _this.scope.wikiSlug,\n content: \"\"\n };\n _this.scope.wiki = _this.model.make_model(\"wiki\", data);\n return _this.scope.wiki;\n };\n })(this));\n };\n\n WikiDetailController.prototype.loadWikiLinks = function() {\n return this.rs.wiki.listLinks(this.scope.projectId).then((function(_this) {\n return function(wikiLinks) {\n var selectedWikiLink;\n _this.scope.wikiLinks = wikiLinks;\n selectedWikiLink = _.find(wikiLinks, {\n href: _this.scope.wikiSlug\n });\n if (selectedWikiLink != null) {\n return _this.scope.wikiTitle = selectedWikiLink.title;\n }\n };\n })(this));\n };\n\n WikiDetailController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise.then((function(_this) {\n return function(project) {\n _this.fillUsersAndRoles(project.members, project.roles);\n return _this.q.all([_this.loadWikiLinks(), _this.loadWiki()]).then(_this.checkLinksPerms.bind(_this));\n };\n })(this));\n };\n\n WikiDetailController.prototype.checkLinksPerms = function() {\n if (this.scope.project.my_permissions.indexOf(\"modify_wiki_link\") !== -1 || (this.scope.project.my_permissions.indexOf(\"view_wiki_links\") !== -1 && this.scope.wikiLinks.length)) {\n return this.scope.linksVisible = true;\n }\n };\n\n WikiDetailController.prototype[\"delete\"] = function() {\n var message, title;\n title = this.translate.instant(\"WIKI.DELETE_LIGHTBOX_TITLE\");\n message = this.scope.wikiTitle;\n return this.confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var onError, onSuccess;\n onSuccess = function() {\n var ctx;\n askResponse.finish();\n ctx = {\n project: _this.scope.projectSlug\n };\n _this.location.path(_this.navUrls.resolve(\"project-wiki\", ctx));\n return _this.confirm.notify(\"success\");\n };\n onError = function() {\n askResponse.finish(false);\n return _this.confirm.notify(\"error\");\n };\n return _this.repo.remove(_this.scope.wiki).then(onSuccess, onError);\n };\n })(this));\n };\n\n return WikiDetailController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"WikiDetailController\", WikiDetailController);\n\n WikiSummaryDirective = function($log, $template, $compile, $translate) {\n var link, template;\n template = $template.get(\"wiki/wiki-summary.html\", true);\n link = function($scope, $el, $attrs, $model) {\n var render;\n render = function(wiki) {\n var ctx, html, user;\n if ($scope.usersById == null) {\n $log.error(\"WikiSummaryDirective requires userById set in scope.\");\n } else {\n user = $scope.usersById[wiki.last_modifier];\n }\n if (user === void 0) {\n user = {\n name: \"unknown\",\n imgUrl: \"/\" + window._version + \"/images/user-noimage.png\"\n };\n } else {\n user = {\n name: user.full_name_display,\n imgUrl: user.photo\n };\n }\n ctx = {\n totalEditions: wiki.editions,\n lastModifiedDate: moment(wiki.modified_date).format($translate.instant(\"WIKI.DATETIME\")),\n user: user\n };\n html = template(ctx);\n html = $compile(html)($scope);\n return $el.html(html);\n };\n $scope.$watch($attrs.ngModel, function(wikiPage) {\n if (!wikiPage) {\n return;\n }\n return render(wikiPage);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgWikiSummary\", [\"$log\", \"$tgTemplate\", \"$compile\", \"$translate\", WikiSummaryDirective]);\n\n EditableWikiContentDirective = function($window, $document, $repo, $confirm, $loading, $analytics, $qqueue) {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var cancelEdition, disableEdition, getSelectedText, isEditable, save, switchToEditMode, switchToReadMode;\n isEditable = function() {\n return $scope.project.my_permissions.indexOf(\"modify_wiki_page\") !== -1;\n };\n switchToEditMode = function() {\n $el.find('.edit-wiki-content').show();\n $el.find('.view-wiki-content').hide();\n return $el.find('textarea').focus();\n };\n switchToReadMode = function() {\n $el.find('.edit-wiki-content').hide();\n return $el.find('.view-wiki-content').show();\n };\n disableEdition = function() {\n $el.find(\".view-wiki-content .edit\").remove();\n return $el.find(\".edit-wiki-content\").remove();\n };\n cancelEdition = function() {\n if (!$model.$modelValue.id) {\n return;\n }\n $scope.$apply((function(_this) {\n return function() {\n return $model.$modelValue.revert();\n };\n })(this));\n return switchToReadMode();\n };\n getSelectedText = function() {\n if ($window.getSelection) {\n return $window.getSelection().toString();\n } else if ($document.selection) {\n return $document.selection.createRange().text;\n }\n return null;\n };\n save = $qqueue.bindAdd(function(wiki) {\n var currentLoading, onError, onSuccess, promise;\n onSuccess = function(wikiPage) {\n if (wiki.id == null) {\n $analytics.trackEvent(\"wikipage\", \"create\", \"create wiki page\", 1);\n }\n $model.$setViewValue(wikiPage.clone());\n $confirm.notify(\"success\");\n return switchToReadMode();\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n currentLoading = $loading().removeClasses(\"icon-floppy\").target($el.find('.icon-floppy')).start();\n if (wiki.id != null) {\n promise = $repo.save(wiki).then(onSuccess, onError);\n } else {\n promise = $repo.create(\"wiki\", wiki).then(onSuccess, onError);\n }\n return promise[\"finally\"](function() {\n return currentLoading.finish();\n });\n });\n $el.on(\"click\", \"a\", function(event) {\n var href, target;\n target = angular.element(event.target);\n href = target.attr('href');\n if (href.indexOf(\"#\") === 0) {\n event.preventDefault();\n return $('body').scrollTop($(href).offset().top);\n }\n });\n $el.on(\"mousedown\", \".view-wiki-content\", function(event) {\n var target;\n target = angular.element(event.target);\n if (!isEditable()) {\n return;\n }\n if (event.button === 2) {\n\n }\n });\n $el.on(\"mouseup\", \".view-wiki-content\", function(event) {\n var target;\n target = angular.element(event.target);\n if (getSelectedText()) {\n return;\n }\n if (!isEditable()) {\n return;\n }\n if (target.is('a')) {\n return;\n }\n if (target.is('pre')) {\n return;\n }\n return switchToEditMode();\n });\n $el.on(\"click\", \".save\", debounce(2000, function() {\n return save($scope.wiki);\n }));\n $el.on(\"click\", \".cancel\", function() {\n return cancelEdition();\n });\n $el.on(\"keydown\", \"textarea\", function(event) {\n if (event.keyCode === 27) {\n return cancelEdition();\n }\n });\n $scope.$watch($attrs.ngModel, function(wikiPage) {\n if (!wikiPage) {\n return;\n }\n if (isEditable()) {\n $el.addClass('editable');\n if ((wikiPage.id == null) || $.trim(wikiPage.content).length === 0) {\n return switchToEditMode();\n }\n } else {\n return disableEdition();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\",\n templateUrl: \"wiki/editable-wiki-content.html\"\n };\n };\n\n module.directive(\"tgEditableWikiContent\", [\"$window\", \"$document\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgAnalytics\", \"$tgQqueue\", EditableWikiContentDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/wiki/detail.coffee\n */\n\n(function() {\n var WikiNavDirective, bindOnce, groupBy, mixOf, module, taiga;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaWiki\");\n\n WikiNavDirective = function($tgrepo, $log, $location, $confirm, $navUrls, $analytics, $loading, $template, $compile, $translate) {\n var link, template;\n template = $template.get(\"wiki/wiki-nav.html\", true);\n link = function($scope, $el, $attrs) {\n var $ctrl, render;\n $ctrl = $el.controller();\n if ($attrs.ngModel == null) {\n return $log.error(\"WikiNavDirective: no ng-model attr is defined\");\n }\n render = function(wikiLinks) {\n var addWikiLinkPermission, deleteWikiLinkPermission, html;\n addWikiLinkPermission = $scope.project.my_permissions.indexOf(\"add_wiki_link\") > -1;\n deleteWikiLinkPermission = $scope.project.my_permissions.indexOf(\"delete_wiki_link\") > -1;\n html = template({\n wikiLinks: wikiLinks,\n projectSlug: $scope.projectSlug,\n addWikiLinkPermission: addWikiLinkPermission,\n deleteWikiLinkPermission: deleteWikiLinkPermission\n });\n html = $compile(html)($scope);\n $el.off();\n $el.html(html);\n $el.on(\"click\", \".wiki-link .link-title\", function(event) {\n var linkId, linkSlug, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n linkId = target.parents('.wiki-link').data('id');\n linkSlug = $scope.wikiLinks[linkId].href;\n return $scope.$apply(function() {\n var ctx;\n ctx = {\n project: $scope.projectSlug,\n slug: linkSlug\n };\n return $location.path($navUrls.resolve(\"project-wiki-page\", ctx));\n });\n });\n $el.on(\"click\", \".add-button\", function(event) {\n event.preventDefault();\n $el.find(\".new\").removeClass(\"hidden\");\n $el.find(\".new input\").focus();\n return $el.find(\".add-button\").hide();\n });\n $el.on(\"click\", \".wiki-link .icon-delete\", function(event) {\n var linkId, message, target, title;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n linkId = target.parents('.wiki-link').data('id');\n title = $translate.instant(\"WIKI.DELETE_LIGHTBOX_TITLE\");\n message = $scope.wikiLinks[linkId].title;\n return $confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var promise;\n promise = $tgrepo.remove($scope.wikiLinks[linkId]);\n promise.then(function() {\n promise = $ctrl.loadWikiLinks();\n promise.then(function() {\n askResponse.finish();\n return render($scope.wikiLinks);\n });\n return promise.then(null, function() {\n return askResponse.finish();\n });\n });\n return promise.then(null, function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n });\n };\n })(this));\n });\n return $el.on(\"keyup\", \".new input\", function(event) {\n var currentLoading, newLink, promise, target;\n event.preventDefault();\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n newLink = target.val();\n currentLoading = $loading().target($el.find(\".new\")).start();\n promise = $tgrepo.create(\"wiki-links\", {\n project: $scope.projectId,\n title: newLink\n });\n promise.then(function() {\n var loadPromise;\n $analytics.trackEvent(\"wikilink\", \"create\", \"create wiki link\", 1);\n loadPromise = $ctrl.loadWikiLinks();\n loadPromise.then(function() {\n currentLoading.finish();\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new input\").val('');\n $el.find(\".add-button\").show();\n return render($scope.wikiLinks);\n });\n return loadPromise.then(null, function() {\n currentLoading.finish();\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new input\").val('');\n $el.find(\".add-button\").show();\n return $confirm.notify(\"error\", \"Error loading wiki links\");\n });\n });\n return promise.then(null, function(error) {\n var ref;\n currentLoading.finish();\n $el.find(\".new input\").val(newLink);\n $el.find(\".new input\").focus().select();\n if ((error != null ? (ref = error.__all__) != null ? ref[0] : void 0 : void 0) != null) {\n return $confirm.notify(\"error\", \"The link already exists\");\n } else {\n return $confirm.notify(\"error\");\n }\n });\n } else if (event.keyCode === 27) {\n target = angular.element(event.currentTarget);\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new input\").val('');\n return $el.find(\".add-button\").show();\n }\n });\n };\n return bindOnce($scope, $attrs.ngModel, render);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgWikiNav\", [\"$tgRepo\", \"$log\", \"$tgLocation\", \"$tgConfirm\", \"$tgNavUrls\", \"$tgAnalytics\", \"$tgLoading\", \"$tgTemplate\", \"$compile\", \"$translate\", WikiNavDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/lightboxes.coffee\n */\n\n(function() {\n var CreateMembersDirective, MAX_MEMBERSHIP_FIELDSETS, debounce, module, taiga;\n\n taiga = this.taiga;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaKanban\");\n\n MAX_MEMBERSHIP_FIELDSETS = 4;\n\n CreateMembersDirective = function($rs, $rootScope, $confirm, $loading, lightboxService, $compile) {\n var extraTextTemplate, link, template;\n extraTextTemplate = \"
\\n \\n
\";\n template = _.template(\"
\\n
\\n data-required=\\\"true\\\" <% } %> data-type=\\\"email\\\" />\\n
\\n
\\n \\n \\n
\\n
\");\n link = function($scope, $el, $attrs) {\n var createFieldSet, resetForm, submit, submitButton;\n createFieldSet = function(required) {\n var ctx;\n if (required == null) {\n required = true;\n }\n ctx = {\n roleList: $scope.project.roles,\n required: required\n };\n return $compile(template(ctx))($scope);\n };\n resetForm = function() {\n var fieldSet, invitations;\n $el.find(\"form textarea\").remove();\n $el.find(\"form .add-member-wrapper\").remove();\n invitations = $el.find(\".add-member-forms\");\n invitations.html($compile(extraTextTemplate)($scope));\n fieldSet = createFieldSet();\n return invitations.prepend(fieldSet);\n };\n $scope.$on(\"membersform:new\", function() {\n resetForm();\n return lightboxService.open($el);\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n $el.on(\"click\", \".delete-fieldset\", function(event) {\n var fieldSet, lastActionButton, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n fieldSet = target.closest('.add-member-wrapper');\n fieldSet.remove();\n lastActionButton = $el.find(\".add-member-wrapper fieldset:last > a\");\n if (lastActionButton.hasClass(\"icon-delete delete-fieldset\")) {\n return lastActionButton.removeClass(\"icon-delete delete-fieldset\").addClass(\"icon-plus add-fieldset\");\n }\n });\n $el.on(\"click\", \".add-fieldset\", function(event) {\n var fieldSet, newFieldSet, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n fieldSet = target.closest('.add-member-wrapper');\n target.removeClass(\"icon-plus add-fieldset\").addClass(\"icon-delete delete-fieldset\");\n newFieldSet = createFieldSet(false);\n fieldSet.after(newFieldSet);\n $scope.$digest();\n if ($el.find(\".add-member-wrapper\").length === MAX_MEMBERSHIP_FIELDSETS) {\n return $el.find(\".add-member-wrapper fieldset:last > a\").removeClass(\"icon-plus add-fieldset\").addClass(\"icon-delete delete-fieldset\");\n }\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, form, invitation_extra_text, invitations, memberWrappers, onError, onSuccess, promise;\n event.preventDefault();\n currentLoading = $loading().target(submitButton).start();\n onSuccess = function(data) {\n currentLoading.finish();\n lightboxService.close($el);\n $confirm.notify(\"success\");\n return $rootScope.$broadcast(\"membersform:new:success\");\n };\n onError = function(data) {\n currentLoading.finish();\n lightboxService.close($el);\n $confirm.notify(\"error\");\n return $rootScope.$broadcast(\"membersform:new:error\");\n };\n form = $el.find(\"form\").checksley();\n form.destroy();\n form.initialize();\n if (!form.validate()) {\n return;\n }\n memberWrappers = $el.find(\"form .add-member-wrapper\");\n memberWrappers = _.filter(memberWrappers, function(mw) {\n return angular.element(mw).find(\"input\").hasClass('checksley-ok');\n });\n invitations = _.map(memberWrappers, function(mw) {\n var email, memberWrapper, role;\n memberWrapper = angular.element(mw);\n email = memberWrapper.find(\"input\");\n role = memberWrapper.find(\"select\");\n return {\n email: email.val(),\n role_id: role.val()\n };\n });\n if (invitations.length) {\n invitation_extra_text = $el.find(\"form textarea\").val();\n promise = $rs.memberships.bulkCreateMemberships($scope.project.id, invitations, invitation_extra_text);\n return promise.then(onSuccess, onError);\n }\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbCreateMembers\", [\"$tgResources\", \"$rootScope\", \"$tgConfirm\", \"$tgLoading\", \"lightboxService\", \"$compile\", CreateMembersDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/memberships.coffee\n */\n\n(function() {\n var MembershipsController, MembershipsDirective, MembershipsRowActionsDirective, MembershipsRowAdminCheckboxDirective, MembershipsRowAvatarDirective, MembershipsRowRoleSelectorDirective, bindMethods, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaAdmin\");\n\n MembershipsController = (function(superClass) {\n extend(MembershipsController, superClass);\n\n MembershipsController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgAnalytics\", \"tgAppMetaService\", \"$translate\"];\n\n function MembershipsController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, analytics, appMetaService, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.analytics = analytics;\n this.appMetaService = appMetaService;\n this.translate = translate;\n bindMethods(this);\n this.scope.project = {};\n this.scope.filters = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.MEMBERSHIPS.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"membersform:new:success\", (function(_this) {\n return function() {\n _this.loadMembers();\n return _this.analytics.trackEvent(\"membership\", \"create\", \"create memberships on admin\", 1);\n };\n })(this));\n }\n\n MembershipsController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n if (!project.i_am_owner) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n return project;\n };\n })(this));\n };\n\n MembershipsController.prototype.loadMembers = function() {\n var httpFilters;\n httpFilters = this.getUrlFilters();\n return this.rs.memberships.list(this.scope.projectId, httpFilters).then((function(_this) {\n return function(data) {\n _this.scope.memberships = _.filter(data.models, function(membership) {\n return membership.user === null || membership.is_user_active;\n });\n _this.scope.page = data.current;\n _this.scope.count = data.count;\n _this.scope.paginatedBy = data.paginatedBy;\n return data;\n };\n })(this));\n };\n\n MembershipsController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n promise.then((function(_this) {\n return function() {\n return _this.loadMembers();\n };\n })(this));\n return promise;\n };\n\n MembershipsController.prototype.getUrlFilters = function() {\n var filters;\n filters = _.pick(this.location.search(), \"page\");\n if (!filters.page) {\n filters.page = 1;\n }\n return filters;\n };\n\n MembershipsController.prototype.addNewMembers = function() {\n return this.rootscope.$broadcast(\"membersform:new\");\n };\n\n return MembershipsController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"MembershipsController\", MembershipsController);\n\n MembershipsDirective = function($template, $compile) {\n var link, linkPagination, template;\n template = $template.get(\"admin/admin-membership-paginator.html\", true);\n linkPagination = function($scope, $el, $attrs, $ctrl) {\n var $pagEl, afterCurrent, atBegin, atEnd, beforeCurrent, getNumPages, renderPagination;\n afterCurrent = 2;\n beforeCurrent = 4;\n atBegin = 2;\n atEnd = 2;\n $pagEl = $el.find(\".memberships-paginator\");\n getNumPages = function() {\n var numPages;\n numPages = $scope.count / $scope.paginatedBy;\n if (parseInt(numPages, 10) < numPages) {\n numPages = parseInt(numPages, 10) + 1;\n } else {\n numPages = parseInt(numPages, 10);\n }\n return numPages;\n };\n renderPagination = function() {\n var cpage, html, i, j, numPages, options, pages, ref;\n numPages = getNumPages();\n if (numPages <= 1) {\n $pagEl.hide();\n return;\n }\n pages = [];\n options = {};\n options.pages = pages;\n options.showPrevious = $scope.page > 1;\n options.showNext = !($scope.page === numPages);\n cpage = $scope.page;\n for (i = j = 1, ref = numPages; 1 <= ref ? j <= ref : j >= ref; i = 1 <= ref ? ++j : --j) {\n if (i === (cpage + afterCurrent) && numPages > (cpage + afterCurrent + atEnd)) {\n pages.push({\n classes: \"dots\",\n type: \"dots\"\n });\n } else if (i === (cpage - beforeCurrent) && cpage > (atBegin + beforeCurrent)) {\n pages.push({\n classes: \"dots\",\n type: \"dots\"\n });\n } else if (i > (cpage + afterCurrent) && i <= (numPages - atEnd)) {\n\n } else if (i < (cpage - beforeCurrent) && i > atBegin) {\n\n } else if (i === cpage) {\n pages.push({\n classes: \"active\",\n num: i,\n type: \"page-active\"\n });\n } else {\n pages.push({\n classes: \"page\",\n num: i,\n type: \"page\"\n });\n }\n }\n html = template(options);\n html = $compile(html)($scope);\n $pagEl.html(html);\n return $pagEl.show();\n };\n $scope.$watch(\"memberships\", function(value) {\n if (!value) {\n return;\n }\n return renderPagination();\n });\n $el.on(\"click\", \".memberships-paginator a.next\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", $scope.page + 1);\n return $ctrl.loadMembers();\n });\n });\n $el.on(\"click\", \".memberships-paginator a.previous\", function(event) {\n event.preventDefault();\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", $scope.page - 1);\n return $ctrl.loadMembers();\n });\n });\n return $el.on(\"click\", \".memberships-paginator li.page > a\", function(event) {\n var pagenum, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n pagenum = target.data(\"pagenum\");\n return $scope.$apply(function() {\n $ctrl.selectFilter(\"page\", pagenum);\n return $ctrl.loadMembers();\n });\n });\n };\n link = function($scope, $el, $attrs) {\n var $ctrl;\n $ctrl = $el.controller();\n linkPagination($scope, $el, $attrs, $ctrl);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMemberships\", [\"$tgTemplate\", \"$compile\", MembershipsDirective]);\n\n MembershipsRowAvatarDirective = function($log, $template, $translate) {\n var link, template;\n template = $template.get(\"admin/memberships-row-avatar.html\", true);\n link = function($scope, $el, $attrs) {\n var member, pending, render;\n pending = $translate.instant(\"ADMIN.MEMBERSHIP.STATUS_PENDING\");\n render = function(member) {\n var ctx, html;\n ctx = {\n full_name: member.full_name ? member.full_name : \"\",\n email: member.user_email ? member.user_email : member.email,\n imgurl: member.photo ? member.photo : \"/\" + window._version + \"/images/unnamed.png\",\n pending: !member.is_user_active ? pending : \"\"\n };\n html = template(ctx);\n return $el.html(html);\n };\n if ($attrs.tgMembershipsRowAvatar == null) {\n return $log.error(\"MembershipsRowAvatarDirective: the directive need a member\");\n }\n member = $scope.$eval($attrs.tgMembershipsRowAvatar);\n render(member);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMembershipsRowAvatar\", [\"$log\", \"$tgTemplate\", '$translate', MembershipsRowAvatarDirective]);\n\n MembershipsRowAdminCheckboxDirective = function($log, $repo, $confirm, $template, $compile) {\n var link, template;\n template = $template.get(\"admin/admin-memberships-row-checkbox.html\", true);\n link = function($scope, $el, $attrs) {\n var html, member, render;\n render = function(member) {\n var ctx, html;\n ctx = {\n inputId: \"is-admin-\" + member.id\n };\n html = template(ctx);\n html = $compile(html)($scope);\n return $el.html(html);\n };\n if ($attrs.tgMembershipsRowAdminCheckbox == null) {\n return $log.error(\"MembershipsRowAdminCheckboxDirective: the directive need a member\");\n }\n member = $scope.$eval($attrs.tgMembershipsRowAdminCheckbox);\n html = render(member);\n if (member.is_owner) {\n $el.find(\":checkbox\").prop(\"checked\", true);\n }\n $el.on(\"click\", \":checkbox\", (function(_this) {\n return function(event) {\n var onError, onSuccess, target;\n onSuccess = function() {\n return $confirm.notify(\"success\");\n };\n onError = function(data) {\n member.revert();\n $el.find(\":checkbox\").prop(\"checked\", member.is_owner);\n return $confirm.notify(\"error\", data.is_owner[0]);\n };\n target = angular.element(event.currentTarget);\n member.is_owner = target.prop(\"checked\");\n return $repo.save(member).then(onSuccess, onError);\n };\n })(this));\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMembershipsRowAdminCheckbox\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgTemplate\", \"$compile\", MembershipsRowAdminCheckboxDirective]);\n\n MembershipsRowRoleSelectorDirective = function($log, $repo, $confirm) {\n var link, template;\n template = _.template(\"\");\n link = function($scope, $el, $attrs) {\n var $ctrl, html, member, render;\n render = function(member) {\n var ctx, html;\n ctx = {\n roleList: $scope.project.roles,\n selectedRole: member.role\n };\n html = template(ctx);\n return $el.html(html);\n };\n if ($attrs.tgMembershipsRowRoleSelector == null) {\n return $log.error(\"MembershipsRowRoleSelectorDirective: the directive need a member\");\n }\n $ctrl = $el.controller();\n member = $scope.$eval($attrs.tgMembershipsRowRoleSelector);\n html = render(member);\n $el.on(\"change\", \"select\", (function(_this) {\n return function(event) {\n var newRole, onError, onSuccess, target;\n onSuccess = function() {\n return $confirm.notify(\"success\");\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n target = angular.element(event.currentTarget);\n newRole = parseInt(target.val(), 10);\n if (member.role !== newRole) {\n member.role = newRole;\n return $repo.save(member).then(onSuccess, onError);\n }\n };\n })(this));\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMembershipsRowRoleSelector\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", MembershipsRowRoleSelectorDirective]);\n\n MembershipsRowActionsDirective = function($log, $repo, $rs, $confirm, $compile, $translate) {\n var activedTemplate, link, pendingTemplate;\n activedTemplate = \"
\\n
\\n\\n \\n\";\n pendingTemplate = \"\\n\\n\\n \\n\";\n link = function($scope, $el, $attrs) {\n var $ctrl, member, render;\n render = function(member) {\n var html;\n if (member.user) {\n html = $compile(activedTemplate)($scope);\n } else {\n html = $compile(pendingTemplate)($scope);\n }\n return $el.html(html);\n };\n if ($attrs.tgMembershipsRowActions == null) {\n return $log.error(\"MembershipsRowActionsDirective: the directive need a member\");\n }\n $ctrl = $el.controller();\n member = $scope.$eval($attrs.tgMembershipsRowActions);\n render(member);\n $el.on(\"click\", \".js-resend\", function(event) {\n var onError, onSuccess;\n event.preventDefault();\n onSuccess = function() {\n var text;\n text = $translate.instant(\"ADMIN.MEMBERSHIP.SUCCESS_SEND_INVITATION\", {\n email: $scope.member.email\n });\n return $confirm.notify(\"success\", text);\n };\n onError = function() {\n var text;\n text = $translate.instant(\"ADMIM.MEMBERSHIP.ERROR_SEND_INVITATION\");\n return $confirm.notify(\"error\", text);\n };\n return $rs.memberships.resendInvitation($scope.member.id).then(onSuccess, onError);\n });\n $el.on(\"click\", \".delete\", function(event) {\n var defaultMsg, message, title;\n event.preventDefault();\n title = $translate.instant(\"ADMIN.MEMBERSHIP.DELETE_MEMBER\");\n defaultMsg = $translate.instant(\"ADMIN.MEMBERSHIP.DEFAULT_DELETE_MESSAGE\", {\n email: member.email\n });\n message = member.user ? member.full_name : defaultMsg;\n return $confirm.askOnDelete(title, message).then(function(askResponse) {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n var text;\n askResponse.finish();\n if ($scope.page > 1 && ($scope.count - 1) <= $scope.paginatedBy) {\n $ctrl.selectFilter(\"page\", $scope.page - 1);\n }\n $ctrl.loadMembers();\n text = $translate.instant(\"ADMIN.MEMBERSHIP.SUCCESS_DELETE\");\n return $confirm.notify(\"success\", null, text);\n };\n })(this);\n onError = (function(_this) {\n return function() {\n var text;\n askResponse.finish(false);\n text = $translate.instant(\"ADMIN.MEMBERSHIP.ERROR_DELETE\", {\n message: message\n });\n return $confirm.notify(\"error\", null, text);\n };\n })(this);\n return $repo.remove(member).then(onSuccess, onError);\n });\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgMembershipsRowActions\", [\"$log\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\", \"$compile\", \"$translate\", MembershipsRowActionsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/nav.coffee\n */\n\n(function() {\n var AdminNavigationDirective, module;\n\n AdminNavigationDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var section;\n section = $attrs.tgAdminNavigation;\n $el.find(\".active\").removeClass(\"active\");\n $el.find(\"#adminmenu-\" + section + \" a\").addClass(\"active\");\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module = angular.module(\"taigaAdmin\");\n\n module.directive(\"tgAdminNavigation\", AdminNavigationDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/project-profile.coffee\n */\n\n(function() {\n var CsvExporterController, CsvExporterIssuesController, CsvExporterTasksController, CsvExporterUserstoriesController, CsvIssueDirective, CsvTaskDirective, CsvUsDirective, ProjectDefaultValuesDirective, ProjectExportDirective, ProjectLogoDirective, ProjectLogoModelDirective, ProjectModulesDirective, ProjectProfileController, ProjectProfileDirective, bindOnce, debounce, groupBy, joinStr, mixOf, module, taiga, toString, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n trim = this.taiga.trim;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaAdmin\");\n\n ProjectProfileController = (function(superClass) {\n extend(ProjectProfileController, superClass);\n\n ProjectProfileController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"$translate\"];\n\n function ProjectProfileController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, appMetaService, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, sectionName, title;\n sectionName = _this.translate.instant(_this.scope.sectionName);\n title = _this.translate.instant(\"ADMIN.PROJECT_PROFILE.PAGE_TITLE\", {\n sectionName: sectionName,\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"project:loaded\", (function(_this) {\n return function() {\n var description, sectionName, title;\n sectionName = _this.translate.instant(_this.scope.sectionName);\n title = _this.translate.instant(\"ADMIN.PROJECT_PROFILE.PAGE_TITLE\", {\n sectionName: sectionName,\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n }\n\n ProjectProfileController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n if (!project.i_am_owner) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.pointsList = _.sortBy(project.points, \"order\");\n _this.scope.usStatusList = _.sortBy(project.us_statuses, \"order\");\n _this.scope.taskStatusList = _.sortBy(project.task_statuses, \"order\");\n _this.scope.prioritiesList = _.sortBy(project.priorities, \"order\");\n _this.scope.severitiesList = _.sortBy(project.severities, \"order\");\n _this.scope.issueTypesList = _.sortBy(project.issue_types, \"order\");\n _this.scope.issueStatusList = _.sortBy(project.issue_statuses, \"order\");\n _this.scope.$emit('project:loaded', project);\n return project;\n };\n })(this));\n };\n\n ProjectProfileController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise;\n };\n\n ProjectProfileController.prototype.openDeleteLightbox = function() {\n return this.rootscope.$broadcast(\"deletelightbox:new\", this.scope.project);\n };\n\n return ProjectProfileController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"ProjectProfileController\", ProjectProfileController);\n\n ProjectProfileDirective = function($repo, $confirm, $loading, $navurls, $location, projectService, currentUserService) {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl, form, submit, submitButton;\n $ctrl = $el.controller();\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.save($scope.project);\n promise.then(function() {\n var newUrl;\n currentLoading.finish();\n $confirm.notify(\"success\");\n newUrl = $navurls.resolve(\"project-admin-project-profile-details\", {\n project: $scope.project.slug\n });\n $location.path(newUrl);\n $ctrl.loadInitialData();\n projectService.fetchProject();\n return currentUserService.loadProjects();\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectProfile\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$tgNavUrls\", \"$tgLocation\", \"tgProjectService\", \"tgCurrentUserService\", ProjectProfileDirective]);\n\n ProjectDefaultValuesDirective = function($repo, $confirm, $loading) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, submit, submitButton;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.save($scope.project);\n promise.then(function() {\n currentLoading.finish();\n return $confirm.notify(\"success\");\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectDefaultValues\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", ProjectDefaultValuesDirective]);\n\n ProjectModulesDirective = function($repo, $confirm, $loading, projectService) {\n var link;\n link = function($scope, $el, $attrs) {\n var submit;\n submit = (function(_this) {\n return function() {\n var currentLoading, form, promise, target;\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n target = angular.element(\".admin-functionalities .submit-button\");\n currentLoading = $loading().target(target).start();\n promise = $repo.save($scope.project);\n promise.then(function() {\n currentLoading.finish();\n $confirm.notify(\"success\");\n $scope.$emit(\"project:loaded\", $scope.project);\n return projectService.fetchProject();\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n return $confirm.notify(\"error\", data._error_message);\n });\n };\n })(this);\n $el.on(\"submit\", \"form\", function(event) {\n event.preventDefault();\n return submit();\n });\n $el.on(\"click\", \".admin-functionalities a.button-green\", function(event) {\n event.preventDefault();\n return submit();\n });\n $scope.$watch(\"isVideoconferenceActivated\", function(isVideoconferenceActivated) {\n if (isVideoconferenceActivated) {\n return $el.find(\".videoconference-attributes\").removeClass(\"hidden\");\n } else {\n $el.find(\".videoconference-attributes\").addClass(\"hidden\");\n $scope.project.videoconferences = null;\n return $scope.project.videoconferences_extra_data = \"\";\n }\n });\n return $scope.$watch(\"project\", function(project) {\n if (project.videoconferences != null) {\n return $scope.isVideoconferenceActivated = true;\n } else {\n return $scope.isVideoconferenceActivated = false;\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectModules\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"tgProjectService\", ProjectModulesDirective]);\n\n ProjectExportDirective = function($window, $rs, $confirm, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var asyn_message, buttonsEl, dump_ready_text, hideButtons, hideResult, hideSpinner, loading_msg, loading_title, resultEl, resultMessageEl, resultTitleEl, setAsyncMessage, setAsyncTitle, setLoadingMessage, setLoadingTitle, setSyncMessage, setSyncTitle, showButtons, showErrorMode, showExportResultAsyncMode, showExportResultSyncMode, showLoadingMode, showResult, showSpinner, spinnerEl, syn_message;\n buttonsEl = $el.find(\".admin-project-export-buttons\");\n showButtons = function() {\n return buttonsEl.removeClass(\"hidden\");\n };\n hideButtons = function() {\n return buttonsEl.addClass(\"hidden\");\n };\n resultEl = $el.find(\".admin-project-export-result\");\n showResult = function() {\n return resultEl.removeClass(\"hidden\");\n };\n hideResult = function() {\n return resultEl.addClass(\"hidden\");\n };\n spinnerEl = $el.find(\".spin\");\n showSpinner = function() {\n return spinnerEl.removeClass(\"hidden\");\n };\n hideSpinner = function() {\n return spinnerEl.addClass(\"hidden\");\n };\n resultTitleEl = $el.find(\".result-title\");\n loading_title = $translate.instant(\"ADMIN.PROJECT_EXPORT.LOADING_TITLE\");\n loading_msg = $translate.instant(\"ADMIN.PROJECT_EXPORT.LOADING_MESSAGE\");\n dump_ready_text = function() {\n return resultTitleEl.html($translate.instant(\"ADMIN.PROJECT_EXPORT.DUMP_READY\"));\n };\n asyn_message = function() {\n return resultTitleEl.html($translate.instant(\"ADMIN.PROJECT_EXPORT.ASYNC_MESSAGE\"));\n };\n syn_message = function(url) {\n return resultTitleEl.html($translate.instant(\"ADMIN.PROJECT_EXPORT.SYNC_MESSAGE\", {\n url: url\n }));\n };\n setLoadingTitle = function() {\n return resultTitleEl.html(loading_title);\n };\n setAsyncTitle = function() {\n return resultTitleEl.html(loading_msg);\n };\n setSyncTitle = function() {\n return resultTitleEl.html(dump_ready_text);\n };\n resultMessageEl = $el.find(\".result-message \");\n setLoadingMessage = function() {\n return resultMessageEl.html(loading_msg);\n };\n setAsyncMessage = function() {\n return resultMessageEl.html(asyn_message);\n };\n setSyncMessage = function(url) {\n return resultMessageEl.html(syn_message(url));\n };\n showLoadingMode = function() {\n showSpinner();\n setLoadingTitle();\n setLoadingMessage();\n hideButtons();\n return showResult();\n };\n showExportResultAsyncMode = function() {\n hideSpinner();\n setAsyncTitle();\n return setAsyncMessage();\n };\n showExportResultSyncMode = function(url) {\n hideSpinner();\n setSyncTitle();\n return setSyncMessage(url);\n };\n showErrorMode = function() {\n hideSpinner();\n hideResult();\n return showButtons();\n };\n return $el.on(\"click\", \"a.button-export\", debounce(2000, (function(_this) {\n return function(event) {\n var onError, onSuccess;\n event.preventDefault();\n onSuccess = function(result) {\n var dumpUrl;\n if (result.status === 202) {\n return showExportResultAsyncMode();\n } else {\n dumpUrl = result.data.url;\n showExportResultSyncMode(dumpUrl);\n return $window.open(dumpUrl, \"_blank\");\n }\n };\n onError = function(result) {\n var errorMsg, ref;\n showErrorMode();\n errorMsg = $translate.instant(\"ADMIN.PROJECT_EXPORT.ERROR\");\n if (result.status === 429) {\n errorMsg = $translate.instant(\"ADMIN.PROJECT_EXPORT.ERROR_BUSY\");\n } else if ((ref = result.data) != null ? ref._error_message : void 0) {\n errorMsg = $translate.instant(\"ADMIN.PROJECT_EXPORT.ERROR_BUSY\", {\n message: result.data._error_message\n });\n }\n return $confirm.notify(\"error\", errorMsg);\n };\n showLoadingMode();\n return $rs.projects[\"export\"]($scope.projectId).then(onSuccess, onError);\n };\n })(this)));\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectExport\", [\"$window\", \"$tgResources\", \"$tgConfirm\", \"$translate\", ProjectExportDirective]);\n\n CsvExporterController = (function(superClass) {\n extend(CsvExporterController, superClass);\n\n CsvExporterController.$inject = [\"$scope\", \"$rootScope\", \"$tgUrls\", \"$tgConfirm\", \"$tgResources\", \"$translate\"];\n\n function CsvExporterController(scope, rootscope, urls, confirm, rs, translate) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.urls = urls;\n this.confirm = confirm;\n this.rs = rs;\n this.translate = translate;\n this._generateUuid = bind(this._generateUuid, this);\n this.setCsvUuid = bind(this.setCsvUuid, this);\n this.rootscope.$on(\"project:loaded\", this.setCsvUuid);\n this.scope.$watch(\"csvUuid\", (function(_this) {\n return function(value) {\n if (value) {\n return _this.scope.csvUrl = _this.urls.resolveAbsolute(_this.type + \"-csv\", value);\n } else {\n return _this.scope.csvUrl = \"\";\n }\n };\n })(this));\n }\n\n CsvExporterController.prototype.setCsvUuid = function() {\n return this.scope.csvUuid = this.scope.project[this.type + \"_csv_uuid\"];\n };\n\n CsvExporterController.prototype._generateUuid = function(response) {\n var promise;\n if (response == null) {\n response = null;\n }\n promise = this.rs.projects[\"regenerate_\" + this.type + \"_csv_uuid\"](this.scope.projectId);\n promise.then((function(_this) {\n return function(data) {\n var ref;\n return _this.scope.csvUuid = (ref = data.data) != null ? ref.uuid : void 0;\n };\n })(this));\n promise.then(null, (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this));\n promise[\"finally\"](function() {\n if (response) {\n return response.finish();\n }\n });\n return promise;\n };\n\n CsvExporterController.prototype.regenerateUuid = function() {\n var subtitle, title;\n if (this.scope.csvUuid) {\n title = this.translate.instant(\"ADMIN.REPORTS.REGENERATE_TITLE\");\n subtitle = this.translate.instant(\"ADMIN.REPORTS.REGENERATE_SUBTITLE\");\n return this.confirm.ask(title, subtitle).then(this._generateUuid);\n } else {\n return this._generateUuid();\n }\n };\n\n return CsvExporterController;\n\n })(taiga.Controller);\n\n CsvExporterUserstoriesController = (function(superClass) {\n extend(CsvExporterUserstoriesController, superClass);\n\n function CsvExporterUserstoriesController() {\n return CsvExporterUserstoriesController.__super__.constructor.apply(this, arguments);\n }\n\n CsvExporterUserstoriesController.prototype.type = \"userstories\";\n\n return CsvExporterUserstoriesController;\n\n })(CsvExporterController);\n\n CsvExporterTasksController = (function(superClass) {\n extend(CsvExporterTasksController, superClass);\n\n function CsvExporterTasksController() {\n return CsvExporterTasksController.__super__.constructor.apply(this, arguments);\n }\n\n CsvExporterTasksController.prototype.type = \"tasks\";\n\n return CsvExporterTasksController;\n\n })(CsvExporterController);\n\n CsvExporterIssuesController = (function(superClass) {\n extend(CsvExporterIssuesController, superClass);\n\n function CsvExporterIssuesController() {\n return CsvExporterIssuesController.__super__.constructor.apply(this, arguments);\n }\n\n CsvExporterIssuesController.prototype.type = \"issues\";\n\n return CsvExporterIssuesController;\n\n })(CsvExporterController);\n\n module.controller(\"CsvExporterUserstoriesController\", CsvExporterUserstoriesController);\n\n module.controller(\"CsvExporterTasksController\", CsvExporterTasksController);\n\n module.controller(\"CsvExporterIssuesController\", CsvExporterIssuesController);\n\n CsvUsDirective = function($translate) {\n var link;\n link = function($scope) {\n return $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_US\";\n };\n return {\n controller: \"CsvExporterUserstoriesController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgCsvUs\", [\"$translate\", CsvUsDirective]);\n\n CsvTaskDirective = function($translate) {\n var link;\n link = function($scope) {\n return $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_TASK\";\n };\n return {\n controller: \"CsvExporterTasksController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgCsvTask\", [\"$translate\", CsvTaskDirective]);\n\n CsvIssueDirective = function($translate) {\n var link;\n link = function($scope) {\n return $scope.sectionTitle = \"ADMIN.CSV.SECTION_TITLE_ISSUE\";\n };\n return {\n controller: \"CsvExporterIssuesController\",\n controllerAs: \"ctrl\",\n templateUrl: \"admin/project-csv.html\",\n link: link,\n scope: true\n };\n };\n\n module.directive(\"tgCsvIssue\", [\"$translate\", CsvIssueDirective]);\n\n ProjectLogoDirective = function($auth, $model, $rs, $confirm) {\n var link;\n link = function($scope, $el, $attrs) {\n var onError, onSuccess, showSizeInfo;\n showSizeInfo = function() {\n return $el.find(\".size-info\").addClass(\"active\");\n };\n onSuccess = function(response) {\n var project;\n project = $model.make_model(\"projects\", response.data);\n $scope.project = project;\n $el.find('.loading-overlay').removeClass('active');\n return $confirm.notify('success');\n };\n onError = function(response) {\n if (response.status === 413) {\n showSizeInfo();\n }\n $el.find('.loading-overlay').removeClass('active');\n return $confirm.notify('error', response.data._error_message);\n };\n $el.on(\"click\", \".js-change-logo\", function() {\n return $el.find(\"#logo-field\").click();\n });\n $el.on(\"change\", \"#logo-field\", function(event) {\n if ($scope.logoAttachment) {\n $el.find('.loading-overlay').addClass(\"active\");\n return $rs.projects.changeLogo($scope.project.id, $scope.logoAttachment).then(onSuccess, onError);\n }\n });\n $el.on(\"click\", \"a.js-use-default-logo\", function(event) {\n $el.find('.loading-overlay').addClass(\"active\");\n return $rs.projects.removeLogo($scope.project.id).then(onSuccess, onError);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectLogo\", [\"$tgAuth\", \"$tgModel\", \"$tgResources\", \"$tgConfirm\", ProjectLogoDirective]);\n\n ProjectLogoModelDirective = function($parse) {\n var link;\n link = function($scope, $el, $attrs) {\n var model, modelSetter;\n model = $parse($attrs.tgProjectLogoModel);\n modelSetter = model.assign;\n return $el.bind('change', function() {\n return $scope.$apply(function() {\n return modelSetter($scope, $el[0].files[0]);\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive('tgProjectLogoModel', ['$parse', ProjectLogoModelDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/project-profile.coffee\n */\n\n(function() {\n var ColorSelectionDirective, DATE_TYPE, MULTILINE_TYPE, ProjectCustomAttributesController, ProjectCustomAttributesDirective, ProjectValuesController, ProjectValuesDirective, ProjectValuesSectionController, TEXT_TYPE, TYPE_CHOICES, bindOnce, debounce, groupBy, joinStr, mixOf, module, taiga, toString, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; };\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n trim = this.taiga.trim;\n\n toString = this.taiga.toString;\n\n joinStr = this.taiga.joinStr;\n\n groupBy = this.taiga.groupBy;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaAdmin\");\n\n ProjectValuesSectionController = (function(superClass) {\n extend(ProjectValuesSectionController, superClass);\n\n ProjectValuesSectionController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"$translate\"];\n\n function ProjectValuesSectionController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, appMetaService, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, sectionName, title;\n sectionName = _this.translate.instant(_this.scope.sectionName);\n title = _this.translate.instant(\"ADMIN.PROJECT_VALUES.PAGE_TITLE\", {\n \"sectionName\": sectionName,\n \"projectName\": _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n ProjectValuesSectionController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n if (!project.i_am_owner) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n return project;\n };\n })(this));\n };\n\n ProjectValuesSectionController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n return promise;\n };\n\n return ProjectValuesSectionController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"ProjectValuesSectionController\", ProjectValuesSectionController);\n\n ProjectValuesController = (function(superClass) {\n extend(ProjectValuesController, superClass);\n\n ProjectValuesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\"];\n\n function ProjectValuesController(scope, rootscope, repo, confirm, rs) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.moveValue = bind(this.moveValue, this);\n this.loadValues = bind(this.loadValues, this);\n this.scope.$on(\"admin:project-values:move\", this.moveValue);\n this.rootscope.$on(\"project:loaded\", this.loadValues);\n }\n\n ProjectValuesController.prototype.loadValues = function() {\n return this.rs[this.scope.resource].listValues(this.scope.projectId, this.scope.type).then((function(_this) {\n return function(values) {\n _this.scope.values = values;\n _this.scope.maxValueOrder = _.max(values, \"order\").order;\n return values;\n };\n })(this));\n };\n\n ProjectValuesController.prototype.moveValue = function(ctx, itemValue, itemIndex) {\n var r, values;\n values = this.scope.values;\n r = values.indexOf(itemValue);\n values.splice(r, 1);\n values.splice(itemIndex, 0, itemValue);\n _.each(values, function(value, index) {\n return value.order = index;\n });\n return this.repo.saveAll(values);\n };\n\n return ProjectValuesController;\n\n })(taiga.Controller);\n\n module.controller(\"ProjectValuesController\", ProjectValuesController);\n\n ProjectValuesDirective = function($log, $repo, $confirm, $location, animationFrame, $translate, $rootscope) {\n var link, linkDragAndDrop, linkValue;\n linkDragAndDrop = function($scope, $el, $attrs) {\n var itemEl, newParentScope, oldParentScope, tdom;\n oldParentScope = null;\n newParentScope = null;\n itemEl = null;\n tdom = $el.find(\".sortable\");\n tdom.sortable({\n handle: \".row.table-main.visualization\",\n dropOnEmpty: true,\n connectWith: \".project-values-body\",\n revert: 400,\n axis: \"y\"\n });\n tdom.on(\"sortstop\", function(event, ui) {\n var itemIndex, itemValue;\n itemEl = ui.item;\n itemValue = itemEl.scope().value;\n itemIndex = itemEl.index();\n return $scope.$broadcast(\"admin:project-values:move\", itemValue, itemIndex);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n linkValue = function($scope, $el, $attrs) {\n var $ctrl, cancel, goToBottomList, initializeNewValue, initializeTextTranslations, objName, saveNewValue, saveValue, valueType;\n $ctrl = $el.controller();\n valueType = $attrs.type;\n objName = $attrs.objname;\n initializeNewValue = function() {\n return $scope.newValue = {\n \"name\": \"\",\n \"is_closed\": false,\n \"is_archived\": false\n };\n };\n initializeTextTranslations = function() {\n return $scope.addNewElementText = $translate.instant(\"ADMIN.PROJECT_VALUES_\" + (objName.toUpperCase()) + \".ACTION_ADD\");\n };\n initializeNewValue();\n initializeTextTranslations();\n $rootscope.$on(\"$translateChangeEnd\", function() {\n return $scope.$evalAsync(initializeTextTranslations);\n });\n goToBottomList = (function(_this) {\n return function(focus) {\n var table;\n if (focus == null) {\n focus = false;\n }\n table = $el.find(\".table-main\");\n $(document.body).scrollTop(table.offset().top + table.height());\n if (focus) {\n return $el.find(\".new-value input:visible\").first().focus();\n }\n };\n })(this);\n saveValue = function(target) {\n var form, formEl, promise, value;\n formEl = target.parents(\"form\");\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n value = formEl.scope().value;\n promise = $repo.save(value);\n promise.then((function(_this) {\n return function() {\n var row;\n row = target.parents(\".row.table-main\");\n row.addClass(\"hidden\");\n return row.siblings(\".visualization\").removeClass('hidden');\n };\n })(this));\n return promise.then(null, function(data) {\n return form.setErrors(data);\n });\n };\n saveNewValue = function(target) {\n var form, formEl, promise;\n formEl = target.parents(\"form\");\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n $scope.newValue.project = $scope.project.id;\n $scope.newValue.order = $scope.maxValueOrder ? $scope.maxValueOrder + 1 : 1;\n promise = $repo.create(valueType, $scope.newValue);\n promise.then((function(_this) {\n return function(data) {\n target.addClass(\"hidden\");\n $scope.values.push(data);\n $scope.maxValueOrder = data.order;\n return initializeNewValue();\n };\n })(this));\n return promise.then(null, function(data) {\n return form.setErrors(data);\n });\n };\n cancel = function(target) {\n var formEl, row, value;\n row = target.parents(\".row.table-main\");\n formEl = target.parents(\"form\");\n value = formEl.scope().value;\n return $scope.$apply(function() {\n row.addClass(\"hidden\");\n value.revert();\n return row.siblings(\".visualization\").removeClass('hidden');\n });\n };\n $el.on(\"click\", \".show-add-new\", function(event) {\n event.preventDefault();\n $el.find(\".new-value\").removeClass('hidden');\n return goToBottomList(true);\n });\n $el.on(\"click\", \".add-new\", debounce(2000, function(event) {\n var target;\n event.preventDefault();\n target = $el.find(\".new-value\");\n return saveNewValue(target);\n }));\n $el.on(\"click\", \".delete-new\", function(event) {\n event.preventDefault();\n $el.find(\".new-value\").addClass(\"hidden\");\n return initializeNewValue();\n });\n $el.on(\"click\", \".edit-value\", function(event) {\n var editionRow, row, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n row = target.parents(\".row.table-main\");\n row.addClass(\"hidden\");\n editionRow = row.siblings(\".edition\");\n editionRow.removeClass('hidden');\n return editionRow.find('input:visible').first().focus().select();\n });\n $el.on(\"keyup\", \".edition input\", function(event) {\n var target;\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n return saveValue(target);\n } else if (event.keyCode === 27) {\n target = angular.element(event.currentTarget);\n return cancel(target);\n }\n });\n $el.on(\"keyup\", \".new-value input\", function(event) {\n var target;\n if (event.keyCode === 13) {\n target = $el.find(\".new-value\");\n return saveNewValue(target);\n } else if (event.keyCode === 27) {\n $el.find(\".new-value\").addClass(\"hidden\");\n return initializeNewValue();\n }\n });\n $el.on(\"click\", \".save\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return saveValue(target);\n });\n $el.on(\"click\", \".cancel\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return cancel(target);\n });\n return $el.on(\"click\", \".delete-value\", function(event) {\n var choices, formEl, subtitle, target, text, title, value;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.parents(\"form\");\n value = formEl.scope().value;\n choices = {};\n _.each($scope.values, function(option) {\n if (value.id !== option.id) {\n return choices[option.id] = option.name;\n }\n });\n subtitle = value.name;\n if (_.keys(choices).length === 0) {\n return $confirm.error($translate.instant(\"ADMIN.PROJECT_VALUES.ERROR_DELETE_ALL\"));\n }\n title = $translate.instant(\"ADMIN.COMMON.TITLE_ACTION_DELETE_VALUE\");\n text = $translate.instant(\"ADMIN.PROJECT_VALUES.REPLACEMENT\");\n return $confirm.askChoice(title, subtitle, choices, text).then(function(response) {\n var onError, onSucces;\n onSucces = function() {\n return $ctrl.loadValues()[\"finally\"](function() {\n return response.finish();\n });\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n return $repo.remove(value, {\n \"moveTo\": response.selected\n }).then(onSucces, onError);\n });\n });\n };\n link = function($scope, $el, $attrs) {\n linkDragAndDrop($scope, $el, $attrs);\n linkValue($scope, $el, $attrs);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectValues\", [\"$log\", \"$tgRepo\", \"$tgConfirm\", \"$tgLocation\", \"animationFrame\", \"$translate\", \"$rootScope\", ProjectValuesDirective]);\n\n ColorSelectionDirective = function() {\n var link;\n link = function($scope, $el, $attrs, $model) {\n var $ctrl;\n $ctrl = $el.controller();\n $scope.$watch($attrs.ngModel, function(element) {\n return $scope.color = element.color;\n });\n $el.on(\"click\", \".current-color\", function(event) {\n var body, target;\n event.preventDefault();\n event.stopPropagation();\n target = angular.element(event.currentTarget);\n $el.find(\".select-color\").hide();\n target.siblings(\".select-color\").show();\n body = angular.element(\"body\");\n return body.on(\"click\", (function(_this) {\n return function(event) {\n if (angular.element(event.target).parent(\".select-color\").length === 0) {\n $el.find(\".select-color\").hide();\n return body.unbind(\"click\");\n }\n };\n })(this));\n });\n $el.on(\"click\", \".select-color .color\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n $scope.$apply(function() {\n return $model.$modelValue.color = target.data(\"color\");\n });\n return $el.find(\".select-color\").hide();\n });\n $el.on(\"click\", \".select-color .selected-color\", function(event) {\n event.preventDefault();\n $scope.$apply(function() {\n return $model.$modelValue.color = $scope.color;\n });\n return $el.find(\".select-color\").hide();\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link,\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgColorSelection\", ColorSelectionDirective);\n\n TEXT_TYPE = \"text\";\n\n MULTILINE_TYPE = \"multiline\";\n\n DATE_TYPE = \"date\";\n\n TYPE_CHOICES = [\n {\n key: TEXT_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_TEXT\"\n }, {\n key: MULTILINE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_MULTI\"\n }, {\n key: DATE_TYPE,\n name: \"ADMIN.CUSTOM_FIELDS.FIELD_TYPE_DATE\"\n }\n ];\n\n ProjectCustomAttributesController = (function(superClass) {\n extend(ProjectCustomAttributesController, superClass);\n\n ProjectCustomAttributesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"$translate\"];\n\n function ProjectCustomAttributesController(scope, rootscope, repo, rs, params, q, location, navUrls, appMetaService, translate) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.moveCustomAttributes = bind(this.moveCustomAttributes, this);\n this.deleteCustomAttribute = bind(this.deleteCustomAttribute, this);\n this.saveCustomAttribute = bind(this.saveCustomAttribute, this);\n this.createCustomAttribute = bind(this.createCustomAttribute, this);\n this.loadCustomAttributes = bind(this.loadCustomAttributes, this);\n this.scope.TYPE_CHOICES = TYPE_CHOICES;\n this.scope.project = {};\n this.rootscope.$on(\"project:loaded\", (function(_this) {\n return function() {\n var description, sectionName, title;\n _this.loadCustomAttributes();\n sectionName = _this.translate.instant(_this.scope.sectionName);\n title = _this.translate.instant(\"ADMIN.CUSTOM_ATTRIBUTES.PAGE_TITLE\", {\n \"sectionName\": sectionName,\n \"projectName\": _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n }\n\n ProjectCustomAttributesController.prototype.loadCustomAttributes = function() {\n return this.rs.customAttributes[this.scope.type].list(this.scope.projectId).then((function(_this) {\n return function(customAttributes) {\n _this.scope.customAttributes = customAttributes;\n _this.scope.maxOrder = _.max(customAttributes, \"order\").order;\n return customAttributes;\n };\n })(this));\n };\n\n ProjectCustomAttributesController.prototype.createCustomAttribute = function(attrValues) {\n return this.repo.create(\"custom-attributes/\" + this.scope.type, attrValues);\n };\n\n ProjectCustomAttributesController.prototype.saveCustomAttribute = function(attrModel) {\n return this.repo.save(attrModel);\n };\n\n ProjectCustomAttributesController.prototype.deleteCustomAttribute = function(attrModel) {\n return this.repo.remove(attrModel);\n };\n\n ProjectCustomAttributesController.prototype.moveCustomAttributes = function(attrModel, newIndex) {\n var customAttributes, r;\n customAttributes = this.scope.customAttributes;\n r = customAttributes.indexOf(attrModel);\n customAttributes.splice(r, 1);\n customAttributes.splice(newIndex, 0, attrModel);\n _.each(customAttributes, function(val, idx) {\n return val.order = idx;\n });\n return this.repo.saveAll(customAttributes);\n };\n\n return ProjectCustomAttributesController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"ProjectCustomAttributesController\", ProjectCustomAttributesController);\n\n ProjectCustomAttributesDirective = function($log, $confirm, animationFrame, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl, cancelCreate, cancelUpdate, create, deleteCustomAttribute, hideAddButton, hideCancelButton, hideCreateForm, hideEditForm, resetNewAttr, revertChangesInCustomAttribute, showAddButton, showCancelButton, showCreateForm, showEditForm, sortableEl, update;\n $ctrl = $el.controller();\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n sortableEl = $el.find(\".js-sortable\");\n sortableEl.sortable({\n handle: \".js-view-custom-field\",\n dropOnEmpty: true,\n revert: 400,\n axis: \"y\"\n });\n sortableEl.on(\"sortstop\", function(event, ui) {\n var itemAttr, itemEl, itemIndex;\n itemEl = ui.item;\n itemAttr = itemEl.scope().attr;\n itemIndex = itemEl.index();\n return $ctrl.moveCustomAttributes(itemAttr, itemIndex);\n });\n showCreateForm = function() {\n $el.find(\".js-new-custom-field\").removeClass(\"hidden\");\n return $el.find(\".js-new-custom-field input:visible\").first().focus();\n };\n hideCreateForm = function() {\n return $el.find(\".js-new-custom-field\").addClass(\"hidden\");\n };\n showAddButton = function() {\n return $el.find(\".js-add-custom-field-button\").removeClass(\"hidden\");\n };\n hideAddButton = function() {\n return $el.find(\".js-add-custom-field-button\").addClass(\"hidden\");\n };\n showCancelButton = function() {\n return $el.find(\".js-cancel-new-custom-field-button\").removeClass(\"hidden\");\n };\n hideCancelButton = function() {\n return $el.find(\".js-cancel-new-custom-field-button\").addClass(\"hidden\");\n };\n resetNewAttr = function() {\n return $scope.newAttr = {};\n };\n create = function(formEl) {\n var attr, form, onError, onSucces;\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n onSucces = (function(_this) {\n return function() {\n $ctrl.loadCustomAttributes();\n hideCreateForm();\n resetNewAttr();\n return $confirm.notify(\"success\");\n };\n })(this);\n onError = (function(_this) {\n return function(data) {\n return form.setErrors(data);\n };\n })(this);\n attr = $scope.newAttr;\n attr.project = $scope.projectId;\n attr.order = $scope.maxOrder ? $scope.maxOrder + 1 : 1;\n return $ctrl.createCustomAttribute(attr).then(onSucces, onError);\n };\n cancelCreate = function() {\n hideCreateForm();\n return resetNewAttr();\n };\n $scope.$watch(\"customAttributes\", function(customAttributes) {\n if (!customAttributes) {\n return;\n }\n if (customAttributes.length === 0) {\n hideCancelButton();\n hideAddButton();\n return showCreateForm();\n } else {\n hideCreateForm();\n showAddButton();\n return showCancelButton();\n }\n });\n $el.on(\"click\", \".js-add-custom-field-button\", function(event) {\n event.preventDefault();\n return showCreateForm();\n });\n $el.on(\"click\", \".js-create-custom-field-button\", debounce(2000, function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return create(formEl);\n }));\n $el.on(\"click\", \".js-cancel-new-custom-field-button\", function(event) {\n event.preventDefault();\n return cancelCreate();\n });\n $el.on(\"keyup\", \".js-new-custom-field input\", function(event) {\n var formEl, target;\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return create(formEl);\n } else if (event.keyCode === 27) {\n return cancelCreate();\n }\n });\n showEditForm = function(formEl) {\n formEl.find(\".js-view-custom-field\").addClass(\"hidden\");\n formEl.find(\".js-edit-custom-field\").removeClass(\"hidden\");\n return formEl.find(\".js-edit-custom-field input:visible\").first().focus().select();\n };\n hideEditForm = function(formEl) {\n formEl.find(\".js-edit-custom-field\").addClass(\"hidden\");\n return formEl.find(\".js-view-custom-field\").removeClass(\"hidden\");\n };\n revertChangesInCustomAttribute = function(formEl) {\n return $scope.$apply(function() {\n return formEl.scope().attr.revert();\n });\n };\n update = function(formEl) {\n var attr, form, onError, onSucces;\n form = formEl.checksley();\n if (!form.validate()) {\n return;\n }\n onSucces = (function(_this) {\n return function() {\n $ctrl.loadCustomAttributes();\n hideEditForm(formEl);\n return $confirm.notify(\"success\");\n };\n })(this);\n onError = (function(_this) {\n return function(data) {\n return form.setErrors(data);\n };\n })(this);\n attr = formEl.scope().attr;\n return $ctrl.saveCustomAttribute(attr).then(onSucces, onError);\n };\n cancelUpdate = function(formEl) {\n hideEditForm(formEl);\n return revertChangesInCustomAttribute(formEl);\n };\n $el.on(\"click\", \".js-edit-custom-field-button\", function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return showEditForm(formEl);\n });\n $el.on(\"click\", \".js-update-custom-field-button\", debounce(2000, function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return update(formEl);\n }));\n $el.on(\"click\", \".js-cancel-edit-custom-field-button\", function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return cancelUpdate(formEl);\n });\n $el.on(\"keyup\", \".js-edit-custom-field input\", function(event) {\n var formEl, target;\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return update(formEl);\n } else if (event.keyCode === 27) {\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return cancelUpdate(formEl);\n }\n });\n deleteCustomAttribute = function(formEl) {\n var attr, message, text, title;\n attr = formEl.scope().attr;\n message = attr.name;\n title = $translate.instant(\"COMMON.CUSTOM_ATTRIBUTES.DELETE\");\n text = $translate.instant(\"COMMON.CUSTOM_ATTRIBUTES.CONFIRM_DELETE\");\n return $confirm.ask(title, text, message).then(function(response) {\n var onError, onSucces;\n onSucces = function() {\n return $ctrl.loadCustomAttributes()[\"finally\"](function() {\n return response.finish();\n });\n };\n onError = function() {\n return $confirm.notify(\"error\", null, \"We have not been able to delete '\" + message + \"'.\");\n };\n return $ctrl.deleteCustomAttribute(attr).then(onSucces, onError);\n });\n };\n return $el.on(\"click\", \".js-delete-custom-field-button\", debounce(2000, function(event) {\n var formEl, target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n formEl = target.closest(\"form\");\n return deleteCustomAttribute(formEl);\n }));\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgProjectCustomAttributes\", [\"$log\", \"$tgConfirm\", \"animationFrame\", \"$translate\", ProjectCustomAttributesDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/memberships.coffee\n */\n\n(function() {\n var EditRoleDirective, NewRoleDirective, RolePermissionsDirective, RolesController, RolesDirective, bindMethods, bindOnce, debounce, mixOf, module, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n bindMethods = this.taiga.bindMethods;\n\n module = angular.module(\"taigaAdmin\");\n\n RolesController = (function(superClass) {\n extend(RolesController, superClass);\n\n RolesController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"$translate\"];\n\n function RolesController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, appMetaService, translate) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this._disableComputable = bind(this._disableComputable, this);\n this._enableComputable = bind(this._enableComputable, this);\n bindMethods(this);\n this.scope.sectionName = \"ADMIN.MENU.PERMISSIONS\";\n this.scope.project = {};\n this.scope.anyComputableRole = true;\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.ROLES.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n RolesController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n if (!project.i_am_owner) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n _this.scope.anyComputableRole = _.some(_.map(project.roles, function(point) {\n return point.computable;\n }));\n return project;\n };\n })(this));\n };\n\n RolesController.prototype.loadRoles = function() {\n return this.rs.roles.list(this.scope.projectId).then((function(_this) {\n return function(roles) {\n var public_permission;\n roles = roles.map(function(role) {\n role.external_user = false;\n return role;\n });\n public_permission = {\n \"name\": _this.translate.instant(\"ADMIN.ROLES.EXTERNAL_USER\"),\n \"permissions\": _this.scope.project.public_permissions,\n \"external_user\": true\n };\n roles.push(public_permission);\n _this.scope.roles = roles;\n _this.scope.role = _this.scope.roles[0];\n return roles;\n };\n })(this));\n };\n\n RolesController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n promise.then((function(_this) {\n return function() {\n return _this.loadRoles();\n };\n })(this));\n return promise;\n };\n\n RolesController.prototype.setRole = function(role) {\n this.scope.role = role;\n return this.scope.$broadcast(\"role:changed\", this.scope.role);\n };\n\n RolesController.prototype[\"delete\"] = function() {\n var choices, i, len, ref, replacement, role, subtitle, title, warning;\n choices = {};\n ref = this.scope.roles;\n for (i = 0, len = ref.length; i < len; i++) {\n role = ref[i];\n if (role.id !== this.scope.role.id) {\n choices[role.id] = role.name;\n }\n }\n if (_.keys(choices).length === 0) {\n return this.confirm.error(this.translate.instant(\"ADMIN.ROLES.ERROR_DELETE_ALL\"));\n }\n title = this.translate.instant(\"ADMIN.ROLES.TITLE_DELETE_ROLE\");\n subtitle = this.scope.role.name;\n replacement = this.translate.instant(\"ADMIN.ROLES.REPLACEMENT_ROLE\");\n warning = this.translate.instant(\"ADMIN.ROLES.WARNING_DELETE_ROLE\");\n return this.confirm.askChoice(title, subtitle, choices, replacement, warning).then((function(_this) {\n return function(response) {\n var onError, onSuccess;\n onSuccess = function() {\n _this.loadProject();\n return _this.loadRoles()[\"finally\"](function() {\n return response.finish();\n });\n };\n onError = function() {\n return _this.confirm.notify('error');\n };\n return _this.repo.remove(_this.scope.role, {\n moveTo: response.selected\n }).then(onSuccess, onError);\n };\n })(this));\n };\n\n RolesController.prototype._enableComputable = function() {\n var onError, onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this.confirm.notify(\"success\");\n return _this.loadProject();\n };\n })(this);\n onError = (function(_this) {\n return function() {\n _this.confirm.notify(\"error\");\n return _this.scope.role.revert();\n };\n })(this);\n return this.repo.save(this.scope.role).then(onSuccess, onError);\n };\n\n RolesController.prototype._disableComputable = function() {\n var askOnError, askOnSuccess, message, subtitle, title;\n askOnSuccess = (function(_this) {\n return function(response) {\n var onError, onSuccess;\n onSuccess = function() {\n response.finish();\n _this.confirm.notify(\"success\");\n return _this.loadProject();\n };\n onError = function() {\n response.finish();\n _this.confirm.notify(\"error\");\n return _this.scope.role.revert();\n };\n return _this.repo.save(_this.scope.role).then(onSuccess, onError);\n };\n })(this);\n askOnError = (function(_this) {\n return function(response) {\n return _this.scope.role.revert();\n };\n })(this);\n title = this.translate.instant(\"ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_TITLE\");\n subtitle = this.translate.instant(\"ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_SUBTITLE\", {\n roleName: this.scope.role.name\n });\n message = this.translate.instant(\"ADMIN.ROLES.DISABLE_COMPUTABLE_ALERT_MESSAGE\");\n return this.confirm.ask(title, subtitle, message).then(askOnSuccess, askOnError);\n };\n\n RolesController.prototype.toggleComputable = debounce(2000, function() {\n if (!this.scope.role.computable) {\n return this._disableComputable();\n } else {\n return this._enableComputable();\n }\n });\n\n return RolesController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"RolesController\", RolesController);\n\n EditRoleDirective = function($repo, $confirm) {\n var link;\n link = function($scope, $el, $attrs) {\n var submit, toggleView;\n toggleView = function() {\n $el.find('.total').toggle();\n return $el.find('.edit-role').toggle();\n };\n submit = function() {\n var promise;\n $scope.role.name = $el.find(\"input\").val();\n promise = $repo.save($scope.role);\n promise.then(function() {\n return $confirm.notify(\"success\");\n });\n promise.then(null, function(data) {\n return $confirm.notify(\"error\");\n });\n return toggleView();\n };\n $el.on(\"click\", \"a.icon-edit\", function() {\n toggleView();\n $el.find(\"input\").focus();\n return $el.find(\"input\").val($scope.role.name);\n });\n $el.on(\"click\", \"a.save\", submit);\n $el.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === 13) {\n return submit();\n } else if (event.keyCode === 27) {\n return toggleView();\n }\n });\n $scope.$on(\"role:changed\", function() {\n if ($el.find('.edit-role').is(\":visible\")) {\n return toggleView();\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgEditRole\", [\"$tgRepo\", \"$tgConfirm\", EditRoleDirective]);\n\n RolesDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var $ctrl;\n $ctrl = $el.controller();\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRoles\", RolesDirective);\n\n NewRoleDirective = function($tgrepo, $confirm) {\n var DEFAULT_PERMISSIONS, link;\n DEFAULT_PERMISSIONS = [\"view_project\", \"view_milestones\", \"view_us\", \"view_tasks\", \"view_issues\"];\n link = function($scope, $el, $attrs) {\n var $ctrl;\n $ctrl = $el.controller();\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n $el.on(\"click\", \"a.add-button\", function(event) {\n event.preventDefault();\n $el.find(\".new\").removeClass(\"hidden\");\n $el.find(\".new\").focus();\n return $el.find(\".add-button\").hide();\n });\n return $el.on(\"keyup\", \".new\", function(event) {\n var newRole, onError, onSuccess, target;\n event.preventDefault();\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n newRole = {\n project: $scope.projectId,\n name: target.val(),\n permissions: DEFAULT_PERMISSIONS,\n order: _.max($scope.roles, function(r) {\n return r.order;\n }).order + 1,\n computable: false\n };\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new\").val('');\n onSuccess = function(role) {\n var insertPosition;\n insertPosition = $scope.roles.length - 1;\n $scope.roles.splice(insertPosition, 0, role);\n $ctrl.setRole(role);\n $el.find(\".add-button\").show();\n return $ctrl.loadProject();\n };\n onError = function() {\n return $confirm.notify(\"error\");\n };\n return $tgrepo.create(\"roles\", newRole).then(onSuccess, onError);\n } else if (event.keyCode === 27) {\n target = angular.element(event.currentTarget);\n $el.find(\".new\").addClass(\"hidden\");\n $el.find(\".new\").val('');\n return $el.find(\".add-button\").show();\n }\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgNewRole\", [\"$tgRepo\", \"$tgConfirm\", NewRoleDirective]);\n\n RolePermissionsDirective = function($rootscope, $repo, $confirm, $compile) {\n var baseTemplate, categoryTemplate, link, resumeTemplate;\n resumeTemplate = _.template(\"
\\\">
\\n
\\n
<%- category.activePermissions %>/<%- category.permissions.length %>
\\n <% _.each(category.permissions, function(permission) { %>\\n
active<% } %>\\\"\\n title=\\\"{{ '<%- permission.name %>' | translate }}\\\">
\\n <% }) %>\\n
\\n
\");\n categoryTemplate = _.template(\"
\\\">\\n
\\n
\\n
\\n
\\n <% _.each(category.permissions, function(permission) { %>\\n
\\\">\\n \\\">\\n
\\n disabled=\\\"disabled\\\" <% } %>\\n <% if(permission.active) { %> checked=\\\"checked\\\" <% } %>/>\\n
\\n \\n \\n
\\n
\\n <% }) %>\\n
\\n
\\n
\");\n baseTemplate = _.template(\"
\");\n link = function($scope, $el, $attrs) {\n var $ctrl, generateCategoriesFromRole, renderCategory, renderPermissions, renderResume;\n $ctrl = $el.controller();\n generateCategoriesFromRole = function(role) {\n var categories, isPermissionEditable, issuePermissions, milestonePermissions, setActivePermissions, setActivePermissionsPerCategory, taskPermissions, userStoryPermissions, wikiPermissions;\n setActivePermissions = function(permissions) {\n return _.map(permissions, function(x) {\n var ref;\n return _.extend({}, x, {\n active: (ref = x[\"key\"], indexOf.call(role.permissions, ref) >= 0)\n });\n });\n };\n isPermissionEditable = function(permission, role, project) {\n if (role.external_user && !project.is_private && permission.key.indexOf(\"view_\") === 0) {\n return false;\n } else {\n return true;\n }\n };\n setActivePermissionsPerCategory = function(category) {\n return _.map(category, function(cat) {\n cat.permissions = cat.permissions.map(function(permission) {\n permission.editable = isPermissionEditable(permission, role, $scope.project);\n return permission;\n });\n return _.extend({}, cat, {\n activePermissions: _.filter(cat[\"permissions\"], \"active\").length\n });\n });\n };\n categories = [];\n milestonePermissions = [\n {\n key: \"view_milestones\",\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.VIEW_SPRINTS\"\n }, {\n key: \"add_milestone\",\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.ADD_SPRINTS\"\n }, {\n key: \"modify_milestone\",\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.MODIFY_SPRINTS\"\n }, {\n key: \"delete_milestone\",\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.DELETE_SPRINTS\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.SPRINTS.NAME\",\n permissions: setActivePermissions(milestonePermissions)\n });\n userStoryPermissions = [\n {\n key: \"view_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.VIEW_USER_STORIES\"\n }, {\n key: \"add_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.ADD_USER_STORIES\"\n }, {\n key: \"modify_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.MODIFY_USER_STORIES\"\n }, {\n key: \"delete_us\",\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.DELETE_USER_STORIES\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.USER_STORIES.NAME\",\n permissions: setActivePermissions(userStoryPermissions)\n });\n taskPermissions = [\n {\n key: \"view_tasks\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.VIEW_TASKS\"\n }, {\n key: \"add_task\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.ADD_TASKS\"\n }, {\n key: \"modify_task\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.MODIFY_TASKS\"\n }, {\n key: \"delete_task\",\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.DELETE_TASKS\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.TASKS.NAME\",\n permissions: setActivePermissions(taskPermissions)\n });\n issuePermissions = [\n {\n key: \"view_issues\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.VIEW_ISSUES\"\n }, {\n key: \"add_issue\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.ADD_ISSUES\"\n }, {\n key: \"modify_issue\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.MODIFY_ISSUES\"\n }, {\n key: \"delete_issue\",\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.DELETE_ISSUES\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.ISSUES.NAME\",\n permissions: setActivePermissions(issuePermissions)\n });\n wikiPermissions = [\n {\n key: \"view_wiki_pages\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_PAGES\"\n }, {\n key: \"add_wiki_page\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_PAGES\"\n }, {\n key: \"modify_wiki_page\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.MODIFY_WIKI_PAGES\"\n }, {\n key: \"delete_wiki_page\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_PAGES\"\n }, {\n key: \"view_wiki_links\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.VIEW_WIKI_LINKS\"\n }, {\n key: \"add_wiki_link\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.ADD_WIKI_LINKS\"\n }, {\n key: \"delete_wiki_link\",\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.DELETE_WIKI_LINKS\"\n }\n ];\n categories.push({\n name: \"COMMON.PERMISIONS_CATEGORIES.WIKI.NAME\",\n permissions: setActivePermissions(wikiPermissions)\n });\n return setActivePermissionsPerCategory(categories);\n };\n renderResume = function(element, category) {\n return element.find(\".resume\").html($compile(resumeTemplate({\n category: category\n }))($scope));\n };\n renderCategory = function(category, index) {\n var html;\n html = categoryTemplate({\n category: category,\n index: index\n });\n html = angular.element(html);\n renderResume(html, category);\n return $compile(html)($scope);\n };\n renderPermissions = function() {\n var html;\n $el.off();\n html = baseTemplate();\n _.each(generateCategoriesFromRole($scope.role), function(category, index) {\n return html = angular.element(html).append(renderCategory(category, index));\n });\n $el.html(html);\n $el.on(\"click\", \".resume\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return target.next().toggleClass(\"open\");\n });\n return $el.on(\"change\", \".category-item input\", function(event) {\n var getActivePermissions, onError, onSuccess, target;\n getActivePermissions = function() {\n var activePermissions;\n activePermissions = _.filter($el.find(\".category-item input\"), function(t) {\n return angular.element(t).is(\":checked\");\n });\n activePermissions = _.sortBy(_.map(activePermissions, function(t) {\n var permission;\n return permission = angular.element(t).parents(\".category-item\").data(\"id\");\n }));\n if (activePermissions.length) {\n activePermissions.push(\"view_project\");\n }\n return activePermissions;\n };\n target = angular.element(event.currentTarget);\n $scope.role.permissions = getActivePermissions();\n onSuccess = function() {\n var categories, categoryId;\n categories = generateCategoriesFromRole($scope.role);\n categoryId = target.parents(\".category-config\").data(\"id\");\n renderResume(target.parents(\".category-config\"), categories[categoryId]);\n $rootscope.$broadcast(\"projects:reload\");\n $confirm.notify(\"success\");\n return $ctrl.loadProject();\n };\n onError = function() {\n $confirm.notify(\"error\");\n target.prop(\"checked\", !target.prop(\"checked\"));\n return $scope.role.permissions = getActivePermissions();\n };\n if ($scope.role.external_user) {\n $scope.project.public_permissions = $scope.role.permissions;\n $scope.project.anon_permissions = $scope.role.permissions.filter(function(permission) {\n return permission.indexOf(\"view_\") === 0;\n });\n return $repo.save($scope.project).then(onSuccess, onError);\n } else {\n return $repo.save($scope.role).then(onSuccess, onError);\n }\n });\n };\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n $scope.$on(\"role:changed\", function() {\n return renderPermissions();\n });\n return bindOnce($scope, $attrs.ngModel, renderPermissions);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgRolePermissions\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$compile\", RolePermissionsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/admin/third-parties.coffee\n */\n\n(function() {\n var BitbucketController, BitbucketWebhooksDirective, GithubController, GithubWebhooksDirective, GitlabController, GitlabWebhooksDirective, NewWebhookDirective, SelectInputText, ValidOriginIpsDirective, WebhookDirective, WebhooksController, bindMethods, debounce, mixOf, module, taiga, timeout,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n bindMethods = this.taiga.bindMethods;\n\n debounce = this.taiga.debounce;\n\n timeout = this.taiga.timeout;\n\n module = angular.module(\"taigaAdmin\");\n\n WebhooksController = (function(superClass) {\n extend(WebhooksController, superClass);\n\n WebhooksController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"$tgLocation\", \"$tgNavUrls\", \"tgAppMetaService\", \"$translate\"];\n\n function WebhooksController(scope, repo, rs, params, location, navUrls, appMetaService, translate) {\n var promise;\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n bindMethods(this);\n this.scope.sectionName = \"ADMIN.WEBHOOKS.SECTION_NAME\";\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.WEBHOOKS.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"webhooks:reload\", this.loadWebhooks);\n }\n\n WebhooksController.prototype.loadWebhooks = function() {\n return this.rs.webhooks.list(this.scope.projectId).then((function(_this) {\n return function(webhooks) {\n return _this.scope.webhooks = webhooks;\n };\n })(this));\n };\n\n WebhooksController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n if (!project.i_am_owner) {\n _this.location.path(_this.navUrls.resolve(\"permission-denied\"));\n }\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n return project;\n };\n })(this));\n };\n\n WebhooksController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n promise.then((function(_this) {\n return function() {\n return _this.loadWebhooks();\n };\n })(this));\n return promise;\n };\n\n return WebhooksController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"WebhooksController\", WebhooksController);\n\n WebhookDirective = function($rs, $repo, $confirm, $loading, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var cancel, openHistory, save, showEditMode, showVisualizationMode, updateLogs, updateShowHideHistoryText, webhook;\n webhook = $scope.$eval($attrs.tgWebhook);\n updateLogs = function() {\n var prettyDate;\n prettyDate = $translate.instant(\"ADMIN.WEBHOOKS.DATE\");\n return $rs.webhooklogs.list(webhook.id).then((function(_this) {\n return function(webhooklogs) {\n var i, len, log, ref;\n for (i = 0, len = webhooklogs.length; i < len; i++) {\n log = webhooklogs[i];\n log.validStatus = (200 <= (ref = log.status) && ref < 300);\n log.prettySentHeaders = _.map(_.pairs(log.request_headers), function(arg) {\n var header, value;\n header = arg[0], value = arg[1];\n return header + \": \" + value;\n }).join(\"\\n\");\n log.prettySentData = JSON.stringify(log.request_data);\n log.prettyDate = moment(log.created).format(prettyDate);\n }\n webhook.logs_counter = webhooklogs.length;\n webhook.logs = webhooklogs;\n return updateShowHideHistoryText();\n };\n })(this));\n };\n updateShowHideHistoryText = function() {\n var historyElement, text, textElement, title;\n textElement = $el.find(\".toggle-history\");\n historyElement = textElement.parents(\".single-webhook-wrapper\").find(\".webhooks-history\");\n if (historyElement.hasClass(\"open\")) {\n text = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_HIDE_HISTORY\");\n title = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_HIDE_HISTORY_TITLE\");\n } else {\n text = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_SHOW_HISTORY\");\n title = $translate.instant(\"ADMIN.WEBHOOKS.ACTION_SHOW_HISTORY_TITLE\");\n }\n textElement.text(text);\n return textElement.prop(\"title\", title);\n };\n showVisualizationMode = function() {\n $el.find(\".edition-mode\").addClass(\"hidden\");\n return $el.find(\".visualization-mode\").removeClass(\"hidden\");\n };\n showEditMode = function() {\n $el.find(\".visualization-mode\").addClass(\"hidden\");\n return $el.find(\".edition-mode\").removeClass(\"hidden\");\n };\n openHistory = function() {\n return $el.find(\".webhooks-history\").addClass(\"open\");\n };\n cancel = function() {\n showVisualizationMode();\n return $scope.$apply(function() {\n return webhook.revert();\n });\n };\n save = debounce(2000, function(target) {\n var form, promise;\n form = target.parents(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n promise = $repo.save(webhook);\n promise.then((function(_this) {\n return function() {\n return showVisualizationMode();\n };\n })(this));\n return promise.then(null, function(data) {\n $confirm.notify(\"error\");\n return form.setErrors(data);\n });\n });\n $el.on(\"click\", \".test-webhook\", function() {\n openHistory();\n return $rs.webhooks.test(webhook.id).then((function(_this) {\n return function() {\n return updateLogs();\n };\n })(this));\n });\n $el.on(\"click\", \".edit-webhook\", function() {\n return showEditMode();\n });\n $el.on(\"click\", \".cancel-existing\", function() {\n return cancel();\n });\n $el.on(\"click\", \".edit-existing\", function(event) {\n var target;\n event.preventDefault();\n target = angular.element(event.currentTarget);\n return save(target);\n });\n $el.on(\"keyup\", \".edition-mode input\", function(event) {\n var target;\n if (event.keyCode === 13) {\n target = angular.element(event.currentTarget);\n return save(target);\n } else if (event.keyCode === 27) {\n target = angular.element(event.currentTarget);\n return cancel(target);\n }\n });\n $el.on(\"click\", \".delete-webhook\", function() {\n var message, title;\n title = $translate.instant(\"ADMIN.WEBHOOKS.DELETE\");\n message = $translate.instant(\"ADMIN.WEBHOOKS.WEBHOOK_NAME\", {\n name: webhook.name\n });\n return $confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var onError, onSucces;\n onSucces = function() {\n askResponse.finish();\n return $scope.$emit(\"webhooks:reload\");\n };\n onError = function() {\n askResponse.finish(false);\n return $confirm.notify(\"error\");\n };\n return $repo.remove(webhook).then(onSucces, onError);\n };\n })(this));\n });\n $el.on(\"click\", \".toggle-history\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n if ((webhook.logs == null) || webhook.logs.length === 0) {\n return updateLogs().then(function() {\n return timeout(0, function() {\n $el.find(\".webhooks-history\").toggleClass(\"open\");\n return updateShowHideHistoryText();\n });\n });\n } else {\n $el.find(\".webhooks-history\").toggleClass(\"open\");\n return $scope.$apply(function() {\n return updateShowHideHistoryText();\n });\n }\n });\n $el.on(\"click\", \".history-single\", function(event) {\n var target;\n target = angular.element(event.currentTarget);\n target.toggleClass(\"history-single-open\");\n return target.siblings(\".history-single-response\").toggleClass(\"open\");\n });\n return $el.on(\"click\", \".resend-request\", function(event) {\n var log, target;\n target = angular.element(event.currentTarget);\n log = target.data(\"log\");\n return $rs.webhooklogs.resend(log).then((function(_this) {\n return function() {\n return updateLogs();\n };\n })(this));\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgWebhook\", [\"$tgResources\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", \"$translate\", WebhookDirective]);\n\n NewWebhookDirective = function($rs, $repo, $confirm, $loading) {\n var link;\n link = function($scope, $el, $attrs) {\n var addWebhookDOMNode, formDOMNode, initializeNewValue, save, webhook;\n webhook = $scope.$eval($attrs.tgWebhook);\n formDOMNode = $el.find(\".new-webhook-form\");\n addWebhookDOMNode = $el.find(\".add-webhook\");\n initializeNewValue = function() {\n return $scope.newValue = {\n \"name\": \"\",\n \"url\": \"\",\n \"key\": \"\"\n };\n };\n initializeNewValue();\n $scope.$watch(\"webhooks\", function(webhooks) {\n if (webhooks != null) {\n if (webhooks.length === 0) {\n formDOMNode.removeClass(\"hidden\");\n addWebhookDOMNode.addClass(\"hidden\");\n return formDOMNode.find(\"input\")[0].focus();\n } else {\n formDOMNode.addClass(\"hidden\");\n return addWebhookDOMNode.removeClass(\"hidden\");\n }\n }\n });\n save = debounce(2000, function() {\n var form, promise;\n form = formDOMNode.checksley();\n if (!form.validate()) {\n return;\n }\n $scope.newValue.project = $scope.project.id;\n promise = $repo.create(\"webhooks\", $scope.newValue);\n promise.then((function(_this) {\n return function() {\n $scope.$emit(\"webhooks:reload\");\n return initializeNewValue();\n };\n })(this));\n return promise.then(null, function(data) {\n $confirm.notify(\"error\");\n return form.setErrors(data);\n });\n });\n formDOMNode.on(\"click\", \".add-new\", function(event) {\n event.preventDefault();\n return save();\n });\n formDOMNode.on(\"keyup\", \"input\", function(event) {\n if (event.keyCode === 13) {\n return save();\n }\n });\n formDOMNode.on(\"click\", \".cancel-new\", function(event) {\n return $scope.$apply(function() {\n return initializeNewValue();\n });\n });\n return addWebhookDOMNode.on(\"click\", function(event) {\n formDOMNode.removeClass(\"hidden\");\n return formDOMNode.find(\"input\")[0].focus();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgNewWebhook\", [\"$tgResources\", \"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", NewWebhookDirective]);\n\n GithubController = (function(superClass) {\n extend(GithubController, superClass);\n\n GithubController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"tgAppMetaService\", \"$translate\"];\n\n function GithubController(scope, repo, rs, params, appMetaService, translate) {\n var promise;\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.appMetaService = appMetaService;\n this.translate = translate;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"ADMIN.GITHUB.SECTION_NAME\");\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.GITHUB.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n GithubController.prototype.loadModules = function() {\n return this.rs.modules.list(this.scope.projectId, \"github\").then((function(_this) {\n return function(github) {\n return _this.scope.github = github;\n };\n })(this));\n };\n\n GithubController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n return project;\n };\n })(this));\n };\n\n GithubController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n promise.then((function(_this) {\n return function() {\n return _this.loadModules();\n };\n })(this));\n return promise;\n };\n\n return GithubController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"GithubController\", GithubController);\n\n GitlabController = (function(superClass) {\n extend(GitlabController, superClass);\n\n GitlabController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"tgAppMetaService\", \"$translate\"];\n\n function GitlabController(scope, repo, rs, params, appMetaService, translate) {\n var promise;\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.appMetaService = appMetaService;\n this.translate = translate;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"ADMIN.GITLAB.SECTION_NAME\");\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.GITLAB.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"project:modules:reload\", (function(_this) {\n return function() {\n return _this.loadModules();\n };\n })(this));\n }\n\n GitlabController.prototype.loadModules = function() {\n return this.rs.modules.list(this.scope.projectId, \"gitlab\").then((function(_this) {\n return function(gitlab) {\n return _this.scope.gitlab = gitlab;\n };\n })(this));\n };\n\n GitlabController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n return project;\n };\n })(this));\n };\n\n GitlabController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n promise.then((function(_this) {\n return function() {\n return _this.loadModules();\n };\n })(this));\n return promise;\n };\n\n return GitlabController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"GitlabController\", GitlabController);\n\n BitbucketController = (function(superClass) {\n extend(BitbucketController, superClass);\n\n BitbucketController.$inject = [\"$scope\", \"$tgRepo\", \"$tgResources\", \"$routeParams\", \"tgAppMetaService\", \"$translate\"];\n\n function BitbucketController(scope, repo, rs, params, appMetaService, translate) {\n var promise;\n this.scope = scope;\n this.repo = repo;\n this.rs = rs;\n this.params = params;\n this.appMetaService = appMetaService;\n this.translate = translate;\n bindMethods(this);\n this.scope.sectionName = this.translate.instant(\"ADMIN.BITBUCKET.SECTION_NAME\");\n this.scope.project = {};\n promise = this.loadInitialData();\n promise.then((function(_this) {\n return function() {\n var description, title;\n title = _this.translate.instant(\"ADMIN.BITBUCKET.PAGE_TITLE\", {\n projectName: _this.scope.project.name\n });\n description = _this.scope.project.description;\n return _this.appMetaService.setAll(title, description);\n };\n })(this));\n promise.then(null, this.onInitialDataError.bind(this));\n this.scope.$on(\"project:modules:reload\", (function(_this) {\n return function() {\n return _this.loadModules();\n };\n })(this));\n }\n\n BitbucketController.prototype.loadModules = function() {\n return this.rs.modules.list(this.scope.projectId, \"bitbucket\").then((function(_this) {\n return function(bitbucket) {\n return _this.scope.bitbucket = bitbucket;\n };\n })(this));\n };\n\n BitbucketController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n return project;\n };\n })(this));\n };\n\n BitbucketController.prototype.loadInitialData = function() {\n var promise;\n promise = this.loadProject();\n promise.then((function(_this) {\n return function() {\n return _this.loadModules();\n };\n })(this));\n return promise;\n };\n\n return BitbucketController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n module.controller(\"BitbucketController\", BitbucketController);\n\n SelectInputText = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $el.on(\"click\", \".select-input-content\", function() {\n $el.find(\"input\").select();\n return $el.find(\".help-copy\").addClass(\"visible\");\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgSelectInputText\", SelectInputText);\n\n GithubWebhooksDirective = function($repo, $confirm, $loading) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, submit, submitButton;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.saveAttribute($scope.github, \"github\");\n promise.then(function() {\n currentLoading.finish();\n return $confirm.notify(\"success\");\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgGithubWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", GithubWebhooksDirective]);\n\n GitlabWebhooksDirective = function($repo, $confirm, $loading) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, submit, submitButton;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.saveAttribute($scope.gitlab, \"gitlab\");\n promise.then(function() {\n currentLoading.finish();\n $confirm.notify(\"success\");\n return $scope.$emit(\"project:modules:reload\");\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgGitlabWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", GitlabWebhooksDirective]);\n\n BitbucketWebhooksDirective = function($repo, $confirm, $loading) {\n var link;\n link = function($scope, $el, $attrs) {\n var form, submit, submitButton;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.saveAttribute($scope.bitbucket, \"bitbucket\");\n promise.then(function() {\n currentLoading.finish();\n $confirm.notify(\"success\");\n return $scope.$emit(\"project:modules:reload\");\n });\n return promise.then(null, function(data) {\n currentLoading.finish();\n form.setErrors(data);\n if (data._error_message) {\n return $confirm.notify(\"error\", data._error_message);\n }\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n return $el.on(\"submit\", \"form\", submit);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgBitbucketWebhooks\", [\"$tgRepo\", \"$tgConfirm\", \"$tgLoading\", BitbucketWebhooksDirective]);\n\n ValidOriginIpsDirective = function() {\n var link;\n link = function($scope, $el, $attrs, $ngModel) {\n return $ngModel.$parsers.push(function(value) {\n value = $.trim(value);\n if (value === \"\") {\n return [];\n }\n return value.split(\",\");\n });\n };\n return {\n link: link,\n restrict: \"EA\",\n require: \"ngModel\"\n };\n };\n\n module.directive(\"tgValidOriginIps\", ValidOriginIpsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/common/attachments.coffee\n */\n\n(function() {\n var CreateProject, DeleteProjectDirective, bindOnce, debounce, module, taiga, timeout;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n timeout = this.taiga.timeout;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaProject\");\n\n CreateProject = function($rootscope, $repo, $confirm, $location, $navurls, $rs, $projectUrl, $loading, lightboxService, $cacheFactory, $translate, currentUserService) {\n var directive, link;\n link = function($scope, $el, attrs) {\n var currentLoading, form, onErrorSubmit, onSuccessSubmit, openLightbox, submit, submitButton;\n $scope.data = {};\n $scope.templates = [];\n currentLoading = null;\n form = $el.find(\"form\").checksley({\n \"onlyOneErrorElement\": true\n });\n onSuccessSubmit = function(response) {\n $cacheFactory.get('$http').removeAll();\n currentLoading.finish();\n $rootscope.$broadcast(\"projects:reload\");\n $confirm.notify(\"success\", $translate.instant(\"COMMON.SAVE\"));\n $location.url($projectUrl.get(response));\n lightboxService.close($el);\n return currentUserService.loadProjects();\n };\n onErrorSubmit = function(response) {\n var error_field, error_step, i, len, ref, selectors;\n currentLoading.finish();\n form.setErrors(response);\n selectors = [];\n ref = _.keys(response);\n for (i = 0, len = ref.length; i < len; i++) {\n error_field = ref[i];\n selectors.push(\"[name=\" + error_field + \"]\");\n }\n $el.find(\".active\").removeClass(\"active\");\n error_step = $el.find(selectors.join(\",\")).first().parents(\".wizard-step\");\n error_step.addClass(\"active\");\n return $el.find('.progress-bar').removeClass().addClass('progress-bar').addClass(error_step.data(\"step\"));\n };\n submit = (function(_this) {\n return function(event) {\n var promise;\n event.preventDefault();\n if (!form.validate()) {\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $repo.create(\"projects\", $scope.data);\n return promise.then(onSuccessSubmit, onErrorSubmit);\n };\n })(this);\n openLightbox = function() {\n $scope.data = {};\n if (!$scope.templates.length) {\n $rs.projects.templates().then((function(_this) {\n return function(result) {\n $scope.templates = result;\n return $scope.data.creation_template = _.head(_.filter($scope.templates, function(x) {\n return x.slug === \"scrum\";\n })).id;\n };\n })(this));\n } else {\n $scope.data.creation_template = _.head(_.filter($scope.templates, function(x) {\n return x.slug === \"scrum\";\n })).id;\n }\n $el.find(\".active\").removeClass(\"active\");\n $el.find(\".create-step1\").addClass(\"active\");\n lightboxService.open($el);\n return timeout(600, function() {\n return $el.find(\".progress-bar\").addClass('step1');\n });\n };\n $el.on(\"click\", \".button-next\", function(event) {\n var current, field, i, len, next, ref, step, valid;\n event.preventDefault();\n current = $el.find(\".active\");\n valid = true;\n ref = form.fields;\n for (i = 0, len = ref.length; i < len; i++) {\n field = ref[i];\n if (current.find(\"[name=\" + (field.element.attr('name')) + \"]\").length) {\n valid = field.validate() !== false && valid;\n }\n }\n if (!valid) {\n return;\n }\n next = current.next();\n current.toggleClass('active');\n next.toggleClass('active');\n step = next.data('step');\n return $el.find('.progress-bar').removeClass().addClass('progress-bar').addClass(step);\n });\n $el.on(\"click\", \".button-prev\", function(event) {\n var current, prev, step;\n event.preventDefault();\n current = $el.find(\".active\");\n prev = current.prev();\n current.toggleClass('active');\n prev.toggleClass('active');\n step = prev.data('step');\n return $el.find('.progress-bar').removeClass().addClass('progress-bar').addClass(step);\n });\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n $el.on(\"click\", \".close\", function(event) {\n event.preventDefault();\n return lightboxService.close($el);\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return openLightbox();\n };\n directive = {\n link: link,\n templateUrl: \"project/wizard-create-project.html\",\n scope: {}\n };\n return directive;\n };\n\n module.directive(\"tgLbCreateProject\", [\"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$location\", \"$tgNavUrls\", \"$tgResources\", \"$projectUrl\", \"$tgLoading\", \"lightboxService\", \"$cacheFactory\", \"$translate\", \"tgCurrentUserService\", CreateProject]);\n\n DeleteProjectDirective = function($repo, $rootscope, $auth, $location, $navUrls, $confirm, lightboxService, tgLoader, currentUserService) {\n var link;\n link = function($scope, $el, $attrs) {\n var projectToDelete, submit;\n projectToDelete = null;\n $scope.$on(\"deletelightbox:new\", function(ctx, project) {\n lightboxService.open($el);\n return projectToDelete = project;\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n submit = function() {\n var promise;\n tgLoader.start();\n lightboxService.close($el);\n promise = $repo.remove(projectToDelete);\n promise.then(function(data) {\n tgLoader.pageLoaded();\n $rootscope.$broadcast(\"projects:reload\");\n $location.path($navUrls.resolve(\"home\"));\n $confirm.notify(\"success\");\n return currentUserService.loadProjects();\n });\n return promise.then(null, function() {\n $confirm.notify(\"error\");\n return lightboxService.close($el);\n });\n };\n $el.on(\"click\", \".button-red\", function(event) {\n event.preventDefault();\n return lightboxService.close($el);\n });\n return $el.on(\"click\", \".button-green\", function(event) {\n event.preventDefault();\n return submit();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgLbDeleteProject\", [\"$tgRepo\", \"$rootScope\", \"$tgAuth\", \"$tgLocation\", \"$tgNavUrls\", \"$tgConfirm\", \"lightboxService\", \"tgLoader\", \"tgCurrentUserService\", DeleteProjectDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/bind.coffee\n */\n\n(function() {\n var BindHtmlDirective, BindOnceAltDirective, BindOnceBindDirective, BindOnceHrefDirective, BindOnceHtmlDirective, BindOnceRefDirective, BindOnceSrcDirective, BindOnceTitleDirective, BindTitleDirective, bindOnce, module;\n\n bindOnce = this.taiga.bindOnce;\n\n BindOnceBindDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoBind, function(val) {\n return $el.text(val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceHtmlDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoHtml, function(val) {\n return $el.html(val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceRefDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoRef, function(val) {\n return $el.html(\"#\" + val + \" \");\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceSrcDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoSrc, function(val) {\n return $el.attr(\"src\", val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceHrefDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoHref, function(val) {\n return $el.attr(\"href\", val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceAltDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoAlt, function(val) {\n return $el.attr(\"alt\", val);\n });\n };\n return {\n link: link\n };\n };\n\n BindOnceTitleDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return bindOnce($scope, $attrs.tgBoTitle, function(val) {\n return $el.attr(\"title\", val);\n });\n };\n return {\n link: link\n };\n };\n\n BindTitleDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $scope.$watch($attrs.tgTitleHtml, function(val) {\n if (val != null) {\n return $el.attr(\"title\", val);\n }\n });\n };\n return {\n link: link\n };\n };\n\n BindHtmlDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $scope.$watch($attrs.tgBindHtml, function(val) {\n if (val != null) {\n return $el.html(val);\n }\n });\n };\n return {\n link: link\n };\n };\n\n module = angular.module(\"taigaBase\");\n\n module.directive(\"tgBoBind\", BindOnceBindDirective);\n\n module.directive(\"tgBoHtml\", BindOnceHtmlDirective);\n\n module.directive(\"tgBoRef\", BindOnceRefDirective);\n\n module.directive(\"tgBoSrc\", BindOnceSrcDirective);\n\n module.directive(\"tgBoHref\", BindOnceHrefDirective);\n\n module.directive(\"tgBoAlt\", BindOnceAltDirective);\n\n module.directive(\"tgBoTitle\", BindOnceTitleDirective);\n\n module.directive(\"tgBindTitle\", BindTitleDirective);\n\n module.directive(\"tgBindHtml\", BindHtmlDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/conf.coffee\n */\n\n(function() {\n var ConfigurationService, module;\n\n ConfigurationService = (function() {\n function ConfigurationService() {\n this.config = window.taigaConfig;\n }\n\n ConfigurationService.prototype.get = function(key, defaultValue) {\n if (defaultValue == null) {\n defaultValue = null;\n }\n if (_.has(this.config, key)) {\n return this.config[key];\n }\n return defaultValue;\n };\n\n return ConfigurationService;\n\n })();\n\n module = angular.module(\"taigaBase\");\n\n module.service(\"$tgConfig\", ConfigurationService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/contrib.coffee\n */\n\n(function() {\n var ContribController, module,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n module = angular.module(\"taigaBase\");\n\n ContribController = (function(superClass) {\n extend(ContribController, superClass);\n\n ContribController.$inject = [\"$rootScope\", \"$scope\", \"$routeParams\", \"$tgRepo\", \"$tgResources\", \"$tgConfirm\"];\n\n function ContribController(rootScope, scope, params, repo, rs, confirm) {\n var promise;\n this.rootScope = rootScope;\n this.scope = scope;\n this.params = params;\n this.repo = repo;\n this.rs = rs;\n this.confirm = confirm;\n this.scope.currentPlugin = _.first(_.where(this.rootScope.adminPlugins, {\n \"slug\": this.params.plugin\n }));\n this.scope.projectSlug = this.params.pslug;\n promise = this.loadInitialData();\n promise.then(null, (function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this));\n }\n\n ContribController.prototype.loadProject = function() {\n return this.rs.projects.getBySlug(this.params.pslug).then((function(_this) {\n return function(project) {\n _this.scope.projectId = project.id;\n _this.scope.project = project;\n _this.scope.$emit('project:loaded', project);\n _this.scope.$broadcast('project:loaded', project);\n return project;\n };\n })(this));\n };\n\n ContribController.prototype.loadInitialData = function() {\n return this.loadProject();\n };\n\n return ContribController;\n\n })(taiga.Controller);\n\n module.controller(\"ContribController\", ContribController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/filters.coffee\n */\n\n(function() {\n var FiltersStorageService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n FiltersStorageService = (function(superClass) {\n extend(FiltersStorageService, superClass);\n\n FiltersStorageService.$inject = [\"$tgStorage\", \"$routeParams\"];\n\n function FiltersStorageService(storage, params) {\n this.storage = storage;\n this.params = params;\n }\n\n FiltersStorageService.prototype.generateHash = function(components) {\n if (components == null) {\n components = [];\n }\n components = _.map(components, function(x) {\n return JSON.stringify(x);\n });\n return hex_sha1(components.join(\":\"));\n };\n\n return FiltersStorageService;\n\n })(taiga.Service);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/http.coffee\n */\n\n(function() {\n var HttpService, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n HttpService = (function(superClass) {\n extend(HttpService, superClass);\n\n HttpService.$inject = [\"$http\", \"$q\", \"$tgStorage\", \"$rootScope\", \"$cacheFactory\", \"$translate\"];\n\n function HttpService(http, q, storage, rootScope, cacheFactory, translate) {\n this.http = http;\n this.q = q;\n this.storage = storage;\n this.rootScope = rootScope;\n this.cacheFactory = cacheFactory;\n this.translate = translate;\n HttpService.__super__.constructor.call(this);\n this.cache = this.cacheFactory(\"httpget\");\n }\n\n HttpService.prototype.headers = function() {\n var headers, lang, token;\n headers = {};\n token = this.storage.get('token');\n if (token) {\n headers[\"Authorization\"] = \"Bearer \" + token;\n }\n lang = this.translate.preferredLanguage();\n if (lang) {\n headers[\"Accept-Language\"] = lang;\n }\n return headers;\n };\n\n HttpService.prototype.request = function(options) {\n options.headers = _.merge({}, options.headers || {}, this.headers());\n return this.http(options);\n };\n\n HttpService.prototype.get = function(url, params, options) {\n options = _.merge({\n method: \"GET\",\n url: url\n }, options);\n if (params) {\n options.params = params;\n }\n options.cache = this.cache;\n return this.request(options)[\"finally\"]((function(_this) {\n return function(data) {\n return _this.cache.removeAll();\n };\n })(this));\n };\n\n HttpService.prototype.post = function(url, data, params, options) {\n options = _.merge({\n method: \"POST\",\n url: url\n }, options);\n if (data) {\n options.data = data;\n }\n if (params) {\n options.params = params;\n }\n return this.request(options);\n };\n\n HttpService.prototype.put = function(url, data, params, options) {\n options = _.merge({\n method: \"PUT\",\n url: url\n }, options);\n if (data) {\n options.data = data;\n }\n if (params) {\n options.params = params;\n }\n return this.request(options);\n };\n\n HttpService.prototype.patch = function(url, data, params, options) {\n options = _.merge({\n method: \"PATCH\",\n url: url\n }, options);\n if (data) {\n options.data = data;\n }\n if (params) {\n options.params = params;\n }\n return this.request(options);\n };\n\n HttpService.prototype[\"delete\"] = function(url, data, params, options) {\n options = _.merge({\n method: \"DELETE\",\n url: url\n }, options);\n if (data) {\n options.data = data;\n }\n if (params) {\n options.params = params;\n }\n return this.request(options);\n };\n\n return HttpService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaBase\");\n\n module.service(\"$tgHttp\", HttpService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/location.coffee\n */\n\n(function() {\n var locationFactory, module;\n\n locationFactory = function($location, $route, $rootscope) {\n $location.noreload = function(scope) {\n var lastRoute, un;\n lastRoute = $route.current;\n un = scope.$on(\"$locationChangeSuccess\", function() {\n $route.current = lastRoute;\n return un();\n });\n return $location;\n };\n $location.isInCurrentRouteParams = function(name, value) {\n var params;\n params = $location.search() || {};\n return params[name] === value;\n };\n return $location;\n };\n\n module = angular.module(\"taigaBase\");\n\n module.factory(\"$tgLocation\", [\"$location\", \"$route\", \"$rootScope\", locationFactory]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/model.coffee\n */\n\n(function() {\n var Model, ModelService, module, provider, taiga,\n indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n Model = (function() {\n function Model(name, data, dataTypes) {\n this._attrs = data;\n this._name = name;\n this._dataTypes = dataTypes;\n this.setAttrs(data);\n this.initialize();\n }\n\n Model.prototype.clone = function() {\n var instance;\n instance = new Model(this._name, this._attrs, this._dataTypes);\n instance._modifiedAttrs = this._modifiedAttrs;\n instance._isModified = this._isModified;\n return instance;\n };\n\n Model.prototype.applyCasts = function() {\n var attrName, castMethod, castName, ref, results;\n ref = this._dataTypes;\n results = [];\n for (attrName in ref) {\n castName = ref[attrName];\n castMethod = service.casts[castName];\n if (!castMethod) {\n continue;\n }\n results.push(this._attrs[attrName] = castMethod(this._attrs[attrName]));\n }\n return results;\n };\n\n Model.prototype.getIdAttrName = function() {\n return \"id\";\n };\n\n Model.prototype.getName = function() {\n return this._name;\n };\n\n Model.prototype.getAttrs = function(patch) {\n if (patch == null) {\n patch = false;\n }\n if (this._attrs.version != null) {\n this._modifiedAttrs.version = this._attrs.version;\n }\n if (patch) {\n return _.extend({}, this._modifiedAttrs);\n }\n return _.extend({}, this._attrs, this._modifiedAttrs);\n };\n\n Model.prototype.setAttrs = function(attrs) {\n this._attrs = attrs;\n this._modifiedAttrs = {};\n this.applyCasts();\n return this._isModified = false;\n };\n\n Model.prototype.setAttr = function(name, value) {\n this._modifiedAttrs[name] = value;\n return this._isModified = true;\n };\n\n Model.prototype.initialize = function() {\n var getter, self, setter;\n self = this;\n getter = function(name) {\n return function() {\n if (typeof name === 'string' && name.substr(0, 2) === \"__\") {\n return self[name];\n }\n if (indexOf.call(_.keys(self._modifiedAttrs), name) < 0) {\n return self._attrs[name];\n }\n return self._modifiedAttrs[name];\n };\n };\n setter = function(name) {\n return function(value) {\n if (typeof name === 'string' && name.substr(0, 2) === \"__\") {\n self[name] = value;\n return;\n }\n if (self._attrs[name] !== value) {\n self._modifiedAttrs[name] = value;\n self._isModified = true;\n } else {\n delete self._modifiedAttrs[name];\n }\n };\n };\n return _.each(this._attrs, function(value, name) {\n var options;\n options = {\n get: getter(name),\n set: setter(name),\n enumerable: true,\n configurable: true\n };\n return Object.defineProperty(self, name, options);\n });\n };\n\n Model.prototype.serialize = function() {\n var data;\n data = {\n \"data\": _.clone(this._attrs),\n \"name\": this._name\n };\n return JSON.stringify(data);\n };\n\n Model.prototype.isModified = function() {\n return this._isModified;\n };\n\n Model.prototype.isAttributeModified = function(attribute) {\n return this._modifiedAttrs[attribute] != null;\n };\n\n Model.prototype.markSaved = function() {\n this._isModified = false;\n this._attrs = this.getAttrs();\n return this._modifiedAttrs = {};\n };\n\n Model.prototype.revert = function() {\n this._modifiedAttrs = {};\n return this._isModified = false;\n };\n\n Model.desSerialize = function(sdata) {\n var ddata, model;\n ddata = JSON.parse(sdata);\n model = new Model(ddata.url, ddata.data);\n return model;\n };\n\n return Model;\n\n })();\n\n taiga = this.taiga;\n\n ModelService = (function(superClass) {\n extend(ModelService, superClass);\n\n ModelService.$inject = [\"$q\", \"$tgUrls\", \"$tgStorage\", \"$tgHttp\"];\n\n function ModelService(q, urls, storage, http) {\n this.q = q;\n this.urls = urls;\n this.storage = storage;\n this.http = http;\n ModelService.__super__.constructor.call(this);\n }\n\n return ModelService;\n\n })(taiga.Service);\n\n provider = function($q, $http, $gmUrls, $gmStorage) {\n var service;\n service = {};\n service.make_model = function(name, data, cls, dataTypes) {\n if (cls == null) {\n cls = Model;\n }\n if (dataTypes == null) {\n dataTypes = {};\n }\n return new cls(name, data, dataTypes);\n };\n service.cls = Model;\n service.casts = {\n int: function(value) {\n return parseInt(value, 10);\n },\n float: function(value) {\n return parseFloat(value, 10);\n }\n };\n return service;\n };\n\n module = angular.module(\"taigaBase\");\n\n module.factory(\"$tgModel\", [\"$q\", \"$http\", \"$tgUrls\", \"$tgStorage\", provider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/navurl.coffee\n */\n\n(function() {\n var NavigationUrlsDirective, NavigationUrlsService, bindOnce, module, taiga, trim,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n trim = this.taiga.trim;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaBase\");\n\n NavigationUrlsService = (function(superClass) {\n extend(NavigationUrlsService, superClass);\n\n function NavigationUrlsService() {\n this.urls = {};\n }\n\n NavigationUrlsService.prototype.update = function(urls) {\n return this.urls = _.merge({}, this.urls, urls || {});\n };\n\n NavigationUrlsService.prototype.formatUrl = function(url, ctx) {\n var replacer;\n if (ctx == null) {\n ctx = {};\n }\n replacer = function(match) {\n match = trim(match, \":\");\n return ctx[match] || \"undefined\";\n };\n return url.replace(/(:\\w+)/g, replacer);\n };\n\n NavigationUrlsService.prototype.resolve = function(name, ctx) {\n var url;\n url = this.urls[name];\n if (!url) {\n return \"\";\n }\n if (ctx) {\n return this.formatUrl(url, ctx);\n }\n return url;\n };\n\n return NavigationUrlsService;\n\n })(taiga.Service);\n\n module.service(\"$tgNavUrls\", NavigationUrlsService);\n\n NavigationUrlsDirective = function($navurls, $auth, $q, $location) {\n var bindOnceP, link, parseNav;\n bindOnceP = function($scope, attr) {\n var defered;\n defered = $q.defer();\n bindOnce($scope, attr, function(v) {\n return defered.resolve(v);\n });\n return defered.promise;\n };\n parseNav = function(data, $scope) {\n var index, name, obj, params, promises, ref, result, values;\n ref = _.map(data.split(\":\"), trim), name = ref[0], params = ref[1];\n if (params) {\n result = params.split(/(\\w+)=/);\n result = _.filter(result, function(str) {\n return str.length;\n });\n result = _.map(result, function(str) {\n return trim(str.replace(/,$/g, ''));\n });\n params = [];\n index = 0;\n while (index < result.length) {\n obj = {};\n obj[result[index]] = result[index + 1];\n params.push(obj);\n index = index + 2;\n }\n } else {\n params = [];\n }\n values = _.map(params, function(param) {\n return _.values(param)[0];\n });\n promises = _.map(values, function(x) {\n return bindOnceP($scope, x);\n });\n return $q.all(promises).then(function() {\n var i, key, len, options, param, value;\n options = {};\n for (i = 0, len = params.length; i < len; i++) {\n param = params[i];\n key = Object.keys(param)[0];\n value = param[key];\n options[key] = $scope.$eval(value);\n }\n return [name, options];\n });\n };\n link = function($scope, $el, $attrs) {\n if ($el.is(\"a\")) {\n $el.attr(\"href\", \"#\");\n }\n $el.on(\"mouseenter\", function(event) {\n var target;\n target = $(event.currentTarget);\n if (!target.data(\"fullUrl\") || $attrs.tgNavGetParams !== target.data(\"params\")) {\n return parseNav($attrs.tgNav, $scope).then(function(result) {\n var fullUrl, getURLParams, getURLParamsStr, name, options, url, user;\n name = result[0], options = result[1];\n user = $auth.getUser();\n if (user) {\n options.user = user.username;\n }\n url = $navurls.resolve(name);\n fullUrl = $navurls.formatUrl(url, options);\n if ($attrs.tgNavGetParams) {\n getURLParams = JSON.parse($attrs.tgNavGetParams);\n getURLParamsStr = $.param(getURLParams);\n fullUrl = fullUrl + \"?\" + getURLParamsStr;\n target.data(\"params\", $attrs.tgNavGetParams);\n }\n target.data(\"fullUrl\", fullUrl);\n if (target.is(\"a\")) {\n target.attr(\"href\", fullUrl);\n }\n return $el.on(\"click\", function(event) {\n if (event.metaKey || event.ctrlKey) {\n return;\n }\n event.preventDefault();\n target = $(event.currentTarget);\n if (target.hasClass('noclick')) {\n return;\n }\n fullUrl = target.data(\"fullUrl\");\n switch (event.which) {\n case 1:\n $location.url(fullUrl);\n return $scope.$apply();\n case 2:\n return window.open(fullUrl);\n }\n });\n });\n }\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgNav\", [\"$tgNavUrls\", \"$tgAuth\", \"$q\", \"$tgLocation\", NavigationUrlsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/repository.coffee\n */\n\n(function() {\n var RepositoryService, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n RepositoryService = (function(superClass) {\n extend(RepositoryService, superClass);\n\n RepositoryService.$inject = [\"$q\", \"$tgModel\", \"$tgStorage\", \"$tgHttp\", \"$tgUrls\"];\n\n function RepositoryService(q, model1, storage, http, urls) {\n this.q = q;\n this.model = model1;\n this.storage = storage;\n this.http = http;\n this.urls = urls;\n RepositoryService.__super__.constructor.call(this);\n }\n\n RepositoryService.prototype.resolveUrlForModel = function(model) {\n var idAttrName;\n idAttrName = model.getIdAttrName();\n return (this.urls.resolve(model.getName())) + \"/\" + model[idAttrName];\n };\n\n RepositoryService.prototype.resolveUrlForAttributeModel = function(model) {\n return this.urls.resolve(model.getName(), model.parent);\n };\n\n RepositoryService.prototype.create = function(name, data, dataTypes, extraParams) {\n var defered, promise, url;\n if (dataTypes == null) {\n dataTypes = {};\n }\n if (extraParams == null) {\n extraParams = {};\n }\n defered = this.q.defer();\n url = this.urls.resolve(name);\n promise = this.http.post(url, JSON.stringify(data));\n promise.success((function(_this) {\n return function(_data, _status) {\n return defered.resolve(_this.model.make_model(name, _data, null, dataTypes));\n };\n })(this));\n promise.error((function(_this) {\n return function(data, status) {\n return defered.reject(data);\n };\n })(this));\n return defered.promise;\n };\n\n RepositoryService.prototype.remove = function(model, params) {\n var defered, promise, url;\n if (params == null) {\n params = {};\n }\n defered = this.q.defer();\n url = this.resolveUrlForModel(model);\n promise = this.http[\"delete\"](url, {}, params);\n promise.success(function(data, status) {\n return defered.resolve(model);\n });\n promise.error(function(data, status) {\n return defered.reject(model);\n });\n return defered.promise;\n };\n\n RepositoryService.prototype.saveAll = function(models, patch) {\n var promises;\n if (patch == null) {\n patch = true;\n }\n promises = _.map(models, (function(_this) {\n return function(x) {\n return _this.save(x, true);\n };\n })(this));\n return this.q.all(promises);\n };\n\n RepositoryService.prototype.save = function(model, patch) {\n var data, defered, promise, url;\n if (patch == null) {\n patch = true;\n }\n defered = this.q.defer();\n if (!model.isModified() && patch) {\n defered.resolve(model);\n return defered.promise;\n }\n url = this.resolveUrlForModel(model);\n data = JSON.stringify(model.getAttrs(patch));\n if (patch) {\n promise = this.http.patch(url, data);\n } else {\n promise = this.http.put(url, data);\n }\n promise.success((function(_this) {\n return function(data, status) {\n model._isModified = false;\n model._attrs = _.extend(model.getAttrs(), data);\n model._modifiedAttrs = {};\n model.applyCasts();\n return defered.resolve(model);\n };\n })(this));\n promise.error(function(data, status) {\n return defered.reject(data);\n });\n return defered.promise;\n };\n\n RepositoryService.prototype.saveAttribute = function(model, attribute, patch) {\n var data, defered, promise, url;\n if (patch == null) {\n patch = true;\n }\n defered = this.q.defer();\n if (!model.isModified() && patch) {\n defered.resolve(model);\n return defered.promise;\n }\n url = this.resolveUrlForAttributeModel(model);\n data = {};\n data[attribute] = model.getAttrs();\n if (patch) {\n promise = this.http.patch(url, data);\n } else {\n promise = this.http.put(url, data);\n }\n promise.success((function(_this) {\n return function(data, status) {\n model._isModified = false;\n model._attrs = _.extend(model.getAttrs(), data);\n model._modifiedAttrs = {};\n model.applyCasts();\n return defered.resolve(model);\n };\n })(this));\n promise.error(function(data, status) {\n return defered.reject(data);\n });\n return defered.promise;\n };\n\n RepositoryService.prototype.refresh = function(model) {\n var defered, promise, url;\n defered = this.q.defer();\n url = this.resolveUrlForModel(model);\n promise = this.http.get(url);\n promise.success(function(data, status) {\n model._modifiedAttrs = {};\n model._attrs = data;\n model._isModified = false;\n model.applyCasts();\n return defered.resolve(model);\n });\n promise.error(function(data, status) {\n return defered.reject(data);\n });\n return defered.promise;\n };\n\n RepositoryService.prototype.queryMany = function(name, params, options, headers) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n if (headers == null) {\n headers = false;\n }\n url = this.urls.resolve(name);\n httpOptions = {\n headers: {}\n };\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n var result;\n result = _.map(data.data, function(x) {\n return _this.model.make_model(name, x);\n });\n if (headers) {\n return [result, data.headers];\n }\n return result;\n };\n })(this));\n };\n\n RepositoryService.prototype.queryOneAttribute = function(name, id, attribute, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name, id);\n httpOptions = {\n headers: {}\n };\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n var model;\n model = _this.model.make_model(name, data.data[attribute]);\n model.parent = id;\n return model;\n };\n })(this));\n };\n\n RepositoryService.prototype.queryOne = function(name, id, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name);\n if (id) {\n url = url + \"/\" + id;\n }\n httpOptions = {\n headers: {}\n };\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n return _this.model.make_model(name, data.data);\n };\n })(this));\n };\n\n RepositoryService.prototype.queryOneRaw = function(name, id, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name);\n if (id) {\n url = url + \"/\" + id;\n }\n httpOptions = _.merge({\n headers: {}\n }, options);\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n\n RepositoryService.prototype.queryPaginated = function(name, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name);\n httpOptions = _.merge({\n headers: {}\n }, options);\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n var headers, result;\n headers = data.headers();\n result = {};\n result.models = _.map(data.data, function(x) {\n return _this.model.make_model(name, x);\n });\n result.count = parseInt(headers[\"x-pagination-count\"], 10);\n result.current = parseInt(headers[\"x-pagination-current\"] || 1, 10);\n result.paginatedBy = parseInt(headers[\"x-paginated-by\"], 10);\n return result;\n };\n })(this));\n };\n\n RepositoryService.prototype.queryOnePaginatedRaw = function(name, id, params, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = this.urls.resolve(name);\n if (id) {\n url = url + \"/\" + id;\n }\n httpOptions = _.merge({\n headers: {}\n }, options);\n return this.http.get(url, params, httpOptions).then((function(_this) {\n return function(data) {\n var headers, result;\n headers = data.headers();\n result = {};\n result.data = data.data;\n result.count = parseInt(headers[\"x-pagination-count\"], 10);\n result.current = parseInt(headers[\"x-pagination-current\"] || 1, 10);\n result.paginatedBy = parseInt(headers[\"x-paginated-by\"], 10);\n return result;\n };\n })(this));\n };\n\n RepositoryService.prototype.resolve = function(options) {\n var cache, params;\n params = {};\n if (options.pslug != null) {\n params.project = options.pslug;\n }\n if (options.usref != null) {\n params.us = options.usref;\n }\n if (options.taskref != null) {\n params.task = options.taskref;\n }\n if (options.issueref != null) {\n params.issue = options.issueref;\n }\n if (options.sslug != null) {\n params.milestone = options.sslug;\n }\n if (options.wikipage != null) {\n params.wikipage = options.wikipage;\n }\n cache = !(options.wikipage || options.sslug);\n return this.queryOneRaw(\"resolver\", null, params, {\n cache: cache\n });\n };\n\n return RepositoryService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaBase\");\n\n module.service(\"$tgRepo\", RepositoryService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/storage.coffee\n */\n\n(function() {\n var StorageService, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n StorageService = (function(superClass) {\n extend(StorageService, superClass);\n\n StorageService.$inject = [\"$rootScope\"];\n\n function StorageService($rootScope) {\n StorageService.__super__.constructor.call(this);\n }\n\n StorageService.prototype.get = function(key, _default) {\n var serializedValue;\n serializedValue = localStorage.getItem(key);\n if (serializedValue === null) {\n return _default || null;\n }\n return JSON.parse(serializedValue);\n };\n\n StorageService.prototype.set = function(key, val) {\n if (_.isObject(key)) {\n return _.each(key, (function(_this) {\n return function(val, key) {\n return _this.set(key, val);\n };\n })(this));\n } else {\n return localStorage.setItem(key, JSON.stringify(val));\n }\n };\n\n StorageService.prototype.contains = function(key) {\n var value;\n value = this.get(key);\n return value !== null;\n };\n\n StorageService.prototype.remove = function(key) {\n return localStorage.removeItem(key);\n };\n\n StorageService.prototype.clear = function() {\n return localStorage.clear();\n };\n\n return StorageService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaBase\");\n\n module.service(\"$tgStorage\", StorageService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/base/http.coffee\n */\n\n(function() {\n var UrlsService, format, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n format = function(fmt, obj) {\n obj = _.clone(obj);\n return fmt.replace(/%s/g, function(match) {\n return String(obj.shift());\n });\n };\n\n taiga = this.taiga;\n\n UrlsService = (function(superClass) {\n extend(UrlsService, superClass);\n\n UrlsService.$inject = [\"$tgConfig\"];\n\n function UrlsService(config) {\n this.config = config;\n this.urls = {};\n this.mainUrl = this.config.get(\"api\");\n }\n\n UrlsService.prototype.update = function(urls) {\n return this.urls = _.merge(this.urls, urls);\n };\n\n UrlsService.prototype.resolve = function() {\n var args, name, url;\n args = _.toArray(arguments);\n if (args.length === 0) {\n throw Error(\"wrong arguments to setUrls\");\n }\n name = args.slice(0, 1)[0];\n url = format(this.urls[name], args.slice(1));\n return format(\"%s/%s\", [_.str.rtrim(this.mainUrl, \"/\"), _.str.ltrim(url, \"/\")]);\n };\n\n UrlsService.prototype.resolveAbsolute = function() {\n var url;\n url = this.resolve.apply(this, arguments);\n if (/^https?:\\/\\//i.test(url)) {\n return url;\n }\n if (/^\\//.test(url)) {\n return window.location.protocol + \"//\" + window.location.host + url;\n }\n return window.location.protocol + \"//\" + window.location.host + \"/\" + url;\n };\n\n return UrlsService;\n\n })(taiga.Service);\n\n module = angular.module(\"taigaBase\");\n\n module.service('$tgUrls', UrlsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/custom-field-values.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo) {\n var _get, service;\n _get = function(objectId, resource) {\n return $repo.queryOne(resource, objectId);\n };\n service = {\n userstory: {\n get: function(objectId) {\n return _get(objectId, \"custom-attributes-values/userstory\");\n }\n },\n task: {\n get: function(objectId) {\n return _get(objectId, \"custom-attributes-values/task\");\n }\n },\n issue: {\n get: function(objectId) {\n return _get(objectId, \"custom-attributes-values/issue\");\n }\n }\n };\n return function(instance) {\n return instance.customAttributesValues = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgCustomAttributesValuesResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/projects.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($repo) {\n var _list, service;\n _list = function(projectId, resource) {\n return $repo.queryMany(resource, {\n project: projectId\n });\n };\n service = {\n userstory: {\n list: function(projectId) {\n return _list(projectId, \"custom-attributes/userstory\");\n }\n },\n task: {\n list: function(projectId) {\n return _list(projectId, \"custom-attributes/task\");\n }\n },\n issue: {\n list: function(projectId) {\n return _list(projectId, \"custom-attributes/issue\");\n }\n }\n };\n return function(instance) {\n return instance.customAttributes = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgCustomAttributesResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/history.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(type, objectId) {\n return $repo.queryOneRaw(\"history/\" + type, objectId);\n };\n service.deleteComment = function(type, objectId, activityId) {\n var params, url;\n url = $urls.resolve(\"history/\" + type);\n url = url + \"/\" + objectId + \"/delete_comment\";\n params = {\n id: activityId\n };\n return $http.post(url, null, params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n service.undeleteComment = function(type, objectId, activityId) {\n var params, url;\n url = $urls.resolve(\"history/\" + type);\n url = url + \"/\" + objectId + \"/undelete_comment\";\n params = {\n id: activityId\n };\n return $http.post(url, null, params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n return function(instance) {\n return instance.history = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgHistoryResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/projects.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo) {\n var service;\n service = {};\n service.get = function(token) {\n return $repo.queryOne(\"invitations\", token);\n };\n return function(instance) {\n return instance.invitations = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgInvitationsResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/issues.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($repo, $http, $urls, $storage, $q) {\n var filtersHashSuffix, hashSuffix, myFiltersHashSuffix, service;\n service = {};\n hashSuffix = \"issues-queryparams\";\n filtersHashSuffix = \"issues-filters\";\n myFiltersHashSuffix = \"issues-my-filters\";\n service.get = function(projectId, issueId) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n return $repo.queryOne(\"issues\", issueId, params);\n };\n service.getByRef = function(projectId, ref) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params.ref = ref;\n return $repo.queryOne(\"issues\", \"by_ref\", params);\n };\n service.listInAllProjects = function(filters) {\n return $repo.queryMany(\"issues\", filters);\n };\n service.list = function(projectId, filters, options) {\n var params;\n params = {\n project: projectId\n };\n params = _.extend({}, params, filters || {});\n service.storeQueryParams(projectId, params);\n return $repo.queryPaginated(\"issues\", params, options);\n };\n service.bulkCreate = function(projectId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-create-issues\");\n params = {\n project_id: projectId,\n bulk_issues: data\n };\n return $http.post(url, params);\n };\n service.upvote = function(issueId) {\n var url;\n url = $urls.resolve(\"issue-upvote\", issueId);\n return $http.post(url);\n };\n service.downvote = function(issueId) {\n var url;\n url = $urls.resolve(\"issue-downvote\", issueId);\n return $http.post(url);\n };\n service.watch = function(issueId) {\n var url;\n url = $urls.resolve(\"issue-watch\", issueId);\n return $http.post(url);\n };\n service.unwatch = function(issueId) {\n var url;\n url = $urls.resolve(\"issue-unwatch\", issueId);\n return $http.post(url);\n };\n service.stats = function(projectId) {\n return $repo.queryOneRaw(\"projects\", projectId + \"/issues_stats\");\n };\n service.filtersData = function(params) {\n return $repo.queryOneRaw(\"issues-filters\", null, params);\n };\n service.listValues = function(projectId, type) {\n var params;\n params = {\n \"project\": projectId\n };\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(type, params);\n };\n service.storeQueryParams = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getQueryParams = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n service.storeFilters = function(projectSlug, params) {\n var hash, ns;\n ns = projectSlug + \":\" + filtersHashSuffix;\n hash = generateHash([projectSlug, ns]);\n return $storage.set(hash, params);\n };\n service.getFilters = function(projectSlug) {\n var hash, ns;\n ns = projectSlug + \":\" + filtersHashSuffix;\n hash = generateHash([projectSlug, ns]);\n return $storage.get(hash) || {};\n };\n service.storeMyFilters = function(projectId, myFilters) {\n var deferred, hash, ns, promise, url;\n deferred = $q.defer();\n url = $urls.resolve(\"user-storage\");\n ns = projectId + \":\" + myFiltersHashSuffix;\n hash = generateHash([projectId, ns]);\n if (_.isEmpty(myFilters)) {\n promise = $http[\"delete\"](url + \"/\" + hash, {\n key: hash,\n value: myFilters\n });\n promise.then(function() {\n return deferred.resolve();\n });\n promise.then(null, function() {\n return deferred.reject();\n });\n } else {\n promise = $http.put(url + \"/\" + hash, {\n key: hash,\n value: myFilters\n });\n promise.then(function(data) {\n return deferred.resolve();\n });\n promise.then(null, function(data) {\n var innerPromise;\n innerPromise = $http.post(\"\" + url, {\n key: hash,\n value: myFilters\n });\n innerPromise.then(function() {\n return deferred.resolve();\n });\n return innerPromise.then(null, function() {\n return deferred.reject();\n });\n });\n }\n return deferred.promise;\n };\n service.getMyFilters = function(projectId) {\n var deferred, hash, ns, promise, url;\n deferred = $q.defer();\n url = $urls.resolve(\"user-storage\");\n ns = projectId + \":\" + myFiltersHashSuffix;\n hash = generateHash([projectId, ns]);\n promise = $http.get(url + \"/\" + hash);\n promise.then(function(data) {\n return deferred.resolve(data.data.value);\n });\n promise.then(null, function(data) {\n return deferred.resolve({});\n });\n return deferred.promise;\n };\n return function(instance) {\n return instance.issues = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgIssuesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/kanban.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($storage) {\n var hashSuffixStatusColumnModes, hashSuffixStatusViewModes, service;\n service = {};\n hashSuffixStatusViewModes = \"kanban-statusviewmodels\";\n hashSuffixStatusColumnModes = \"kanban-statuscolumnmodels\";\n service.storeStatusViewModes = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusViewModes;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getStatusViewModes = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusViewModes;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n service.storeStatusColumnModes = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusColumnModes;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getStatusColumnModes = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusColumnModes;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n return function(instance) {\n return instance.kanban = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgKanbanResourcesProvider\", [\"$tgStorage\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/locales.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($repo) {\n var service;\n service = {\n list: function() {\n return $repo.queryMany(\"locales\");\n }\n };\n return function(instance) {\n return instance.locales = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgLocalesResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/mdrender.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $urls, $http) {\n var service;\n service = {};\n service.render = function(projectId, content) {\n var params, url;\n if ((content == null) || content === \"\") {\n content = ' ';\n }\n params = {\n project_id: projectId,\n content: content\n };\n url = $urls.resolve(\"wiki\");\n return $http.post(url + \"/render\", params).then((function(_this) {\n return function(data) {\n return data.data;\n };\n })(this));\n };\n return function(instance) {\n return instance.mdrender = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgMdRenderResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/memberships.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(id) {\n return $repo.queryOne(\"memberships\", id);\n };\n service.list = function(projectId, filters, enablePagination) {\n var options, params;\n if (enablePagination == null) {\n enablePagination = true;\n }\n params = {\n project: projectId\n };\n params = _.extend({}, params, filters || {});\n if (enablePagination) {\n return $repo.queryPaginated(\"memberships\", params);\n }\n return $repo.queryMany(\"memberships\", params, options = {\n enablePagination: enablePagination\n });\n };\n service.listByUser = function(userId, filters) {\n var params;\n params = {\n user: userId\n };\n params = _.extend({}, params, filters || {});\n return $repo.queryPaginated(\"memberships\", params);\n };\n service.resendInvitation = function(id) {\n var url;\n url = $urls.resolve(\"memberships\");\n return $http.post(url + \"/\" + id + \"/resend_invitation\", {});\n };\n service.bulkCreateMemberships = function(projectId, data, invitation_extra_text) {\n var params, url;\n url = $urls.resolve(\"bulk-create-memberships\");\n params = {\n project_id: projectId,\n bulk_memberships: data,\n invitation_extra_text: invitation_extra_text\n };\n return $http.post(url, params);\n };\n return function(instance) {\n return instance.memberships = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgMembershipsResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules.coffee\n */\n\n(function() {\n var module, resourceProvider;\n\n resourceProvider = function($repo) {\n var service;\n service = {};\n service.list = function(projectId, module) {\n return $repo.queryOneAttribute(\"project-modules\", projectId, module);\n };\n return function(instance) {\n return instance.modules = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgModulesResourcesProvider\", [\"$tgRepo\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/memberships.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(id) {\n return $repo.queryOne(\"notify-policies\", id);\n };\n service.list = function(filters) {\n var params;\n params = _.extend({}, params, filters || {});\n return $repo.queryMany(\"notify-policies\", params);\n };\n return function(instance) {\n return instance.notifyPolicies = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgNotifyPoliciesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/projects.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($config, $repo, $http, $urls, $auth, $q, $translate) {\n var service;\n service = {};\n service.get = function(projectId) {\n return $repo.queryOne(\"projects\", projectId);\n };\n service.getBySlug = function(projectSlug) {\n return $repo.queryOne(\"projects\", \"by_slug?slug=\" + projectSlug);\n };\n service.list = function() {\n return $repo.queryMany(\"projects\");\n };\n service.listByMember = function(memberId) {\n var params;\n params = {\n \"member\": memberId,\n \"order_by\": \"memberships__user_order\"\n };\n return $repo.queryMany(\"projects\", params);\n };\n service.templates = function() {\n return $repo.queryMany(\"project-templates\");\n };\n service.usersList = function(projectId) {\n var params;\n params = {\n \"project\": projectId\n };\n return $repo.queryMany(\"users\", params);\n };\n service.rolesList = function(projectId) {\n var params;\n params = {\n \"project\": projectId\n };\n return $repo.queryMany(\"roles\", params);\n };\n service.stats = function(projectId) {\n return $repo.queryOneRaw(\"projects\", projectId + \"/stats\");\n };\n service.bulkUpdateOrder = function(bulkData) {\n var url;\n url = $urls.resolve(\"bulk-update-projects-order\");\n return $http.post(url, bulkData);\n };\n service.regenerate_userstories_csv_uuid = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/regenerate_userstories_csv_uuid\";\n return $http.post(url);\n };\n service.regenerate_issues_csv_uuid = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/regenerate_issues_csv_uuid\";\n return $http.post(url);\n };\n service.regenerate_tasks_csv_uuid = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/regenerate_tasks_csv_uuid\";\n return $http.post(url);\n };\n service.leave = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/leave\";\n return $http.post(url);\n };\n service.memberStats = function(projectId) {\n return $repo.queryOneRaw(\"projects\", projectId + \"/member_stats\");\n };\n service.tagsColors = function(projectId) {\n return $repo.queryOne(\"projects\", projectId + \"/tags_colors\");\n };\n service[\"export\"] = function(projectId) {\n var url;\n url = ($urls.resolve(\"exporter\")) + \"/\" + projectId;\n return $http.get(url);\n };\n service[\"import\"] = function(file, statusUpdater) {\n var complete, data, defered, errorMsg, failed, maxFileSize, response, uploadComplete, uploadFailed, uploadProgress, xhr;\n defered = $q.defer();\n maxFileSize = $config.get(\"maxUploadFileSize\", null);\n if (maxFileSize && file.size > maxFileSize) {\n errorMsg = $translate.instant(\"PROJECT.IMPORT.ERROR_MAX_SIZE_EXCEEDED\", {\n fileName: file.name,\n fileSize: sizeFormat(file.size),\n maxFileSize: sizeFormat(maxFileSize)\n });\n response = {\n status: 413,\n data: {\n _error_message: errorMsg\n }\n };\n defered.reject(response);\n return defered.promise;\n }\n uploadProgress = (function(_this) {\n return function(evt) {\n var message, percent;\n percent = Math.round((evt.loaded / evt.total) * 100);\n message = $translate.instant(\"PROJECT.IMPORT.UPLOAD_IN_PROGRESS_MESSAGE\", {\n uploadedSize: sizeFormat(evt.loaded),\n totalSize: sizeFormat(evt.total)\n });\n return statusUpdater(\"in-progress\", null, message, percent);\n };\n })(this);\n uploadComplete = (function(_this) {\n return function(evt) {\n return statusUpdater(\"done\", $translate.instant(\"PROJECT.IMPORT.TITLE\"), $translate.instant(\"PROJECT.IMPORT.DESCRIPTION\"));\n };\n })(this);\n uploadFailed = (function(_this) {\n return function(evt) {\n return statusUpdater(\"error\");\n };\n })(this);\n complete = (function(_this) {\n return function(evt) {\n var error, ref;\n response = {};\n try {\n response.data = JSON.parse(evt.target.responseText);\n } catch (error) {\n response.data = {};\n }\n response.status = evt.target.status;\n if ((ref = response.status) === 201 || ref === 202) {\n defered.resolve(response);\n }\n return defered.reject(response);\n };\n })(this);\n failed = (function(_this) {\n return function(evt) {\n return defered.reject(\"fail\");\n };\n })(this);\n data = new FormData();\n data.append('dump', file);\n xhr = new XMLHttpRequest();\n xhr.upload.addEventListener(\"progress\", uploadProgress, false);\n xhr.upload.addEventListener(\"load\", uploadComplete, false);\n xhr.upload.addEventListener(\"error\", uploadFailed, false);\n xhr.upload.addEventListener(\"abort\", uploadFailed, false);\n xhr.addEventListener(\"load\", complete, false);\n xhr.addEventListener(\"error\", failed, false);\n xhr.open(\"POST\", $urls.resolve(\"importer\"));\n xhr.setRequestHeader(\"Authorization\", \"Bearer \" + ($auth.getToken()));\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send(data);\n return defered.promise;\n };\n service.changeLogo = function(projectId, file) {\n var data, defered, maxFileSize, options, response, url;\n maxFileSize = $config.get(\"maxUploadFileSize\", null);\n if (maxFileSize && file.size > maxFileSize) {\n response = {\n status: 413,\n data: {\n _error_message: \"'\" + file.name + \"' (\" + (sizeFormat(file.size)) + \") is too heavy for our oompa loompas, try it with a smaller than (\" + (sizeFormat(maxFileSize)) + \")\"\n }\n };\n defered = $q.defer();\n defered.reject(response);\n return defered.promise;\n }\n data = new FormData();\n data.append('logo', file);\n options = {\n transformRequest: angular.identity,\n headers: {\n 'Content-Type': void 0\n }\n };\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/change_logo\";\n return $http.post(url, data, {}, options);\n };\n service.removeLogo = function(projectId) {\n var url;\n url = ($urls.resolve(\"projects\")) + \"/\" + projectId + \"/remove_logo\";\n return $http.post(url);\n };\n return function(instance) {\n return instance.projects = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgProjectsResourcesProvider\", [\"$tgConfig\", \"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgAuth\", \"$q\", \"$translate\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/memberships.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(id) {\n return $repo.queryOne(\"roles\", id);\n };\n service.list = function(projectId) {\n return $repo.queryMany(\"roles\", {\n project: projectId\n });\n };\n return function(instance) {\n return instance.roles = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgRolesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/search.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $urls, $http, $q) {\n var service;\n service = {};\n service[\"do\"] = function(projectId, term) {\n var deferredAbort, params, request, url;\n deferredAbort = $q.defer();\n url = $urls.resolve(\"search\");\n params = {\n url: url,\n method: \"GET\",\n timeout: deferredAbort.promise,\n cancelable: true,\n params: {\n project: projectId,\n text: term,\n get_all: false\n }\n };\n request = $http.request(params).then(function(data) {\n return data.data;\n });\n request.abort = function() {\n return deferredAbort.resolve();\n };\n request[\"finally\"] = function() {\n request.abort = angular.noop;\n return deferredAbort = request = null;\n };\n return request;\n };\n return function(instance) {\n return instance.search = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgSearchResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/sprints.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($repo, $model, $storage) {\n var service;\n service = {};\n service.get = function(projectId, sprintId) {\n return $repo.queryOne(\"milestones\", sprintId).then(function(sprint) {\n var uses;\n uses = sprint.user_stories;\n uses = _.map(uses, function(u) {\n return $model.make_model(\"userstories\", u);\n });\n sprint._attrs.user_stories = uses;\n return sprint;\n });\n };\n service.stats = function(projectId, sprintId) {\n return $repo.queryOneRaw(\"milestones\", sprintId + \"/stats\");\n };\n service.list = function(projectId, filters) {\n var params;\n params = {\n \"project\": projectId\n };\n params = _.extend({}, params, filters || {});\n return $repo.queryMany(\"milestones\", params, {}, true).then((function(_this) {\n return function(result) {\n var headers, i, len, m, milestones, uses;\n milestones = result[0];\n headers = result[1];\n for (i = 0, len = milestones.length; i < len; i++) {\n m = milestones[i];\n uses = m.user_stories;\n uses = _.map(uses, function(u) {\n return $model.make_model(\"userstories\", u);\n });\n m._attrs.user_stories = uses;\n }\n return {\n milestones: milestones,\n closed: parseInt(headers(\"Taiga-Info-Total-Closed-Milestones\"), 10),\n open: parseInt(headers(\"Taiga-Info-Total-Opened-Milestones\"), 10)\n };\n };\n })(this));\n };\n return function(instance) {\n return instance.sprints = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgSprintsResourcesProvider\", [\"$tgRepo\", \"$tgModel\", \"$tgStorage\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/tasks.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($repo, $http, $urls, $storage) {\n var hashSuffix, hashSuffixStatusColumnModes, hashSuffixUsRowModes, service;\n service = {};\n hashSuffix = \"tasks-queryparams\";\n hashSuffixStatusColumnModes = \"tasks-statuscolumnmodels\";\n hashSuffixUsRowModes = \"tasks-usrowmodels\";\n service.get = function(projectId, taskId) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n return $repo.queryOne(\"tasks\", taskId, params);\n };\n service.getByRef = function(projectId, ref) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params.ref = ref;\n return $repo.queryOne(\"tasks\", \"by_ref\", params);\n };\n service.listInAllProjects = function(filters) {\n return $repo.queryMany(\"tasks\", filters);\n };\n service.list = function(projectId, sprintId, userStoryId) {\n var params;\n if (sprintId == null) {\n sprintId = null;\n }\n if (userStoryId == null) {\n userStoryId = null;\n }\n params = {\n project: projectId\n };\n if (sprintId) {\n params.milestone = sprintId;\n }\n if (userStoryId) {\n params.user_story = userStoryId;\n }\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(\"tasks\", params);\n };\n service.bulkCreate = function(projectId, sprintId, usId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-create-tasks\");\n params = {\n project_id: projectId,\n sprint_id: sprintId,\n us_id: usId,\n bulk_tasks: data\n };\n return $http.post(url, params).then(function(result) {\n return result.data;\n });\n };\n service.upvote = function(taskId) {\n var url;\n url = $urls.resolve(\"task-upvote\", taskId);\n return $http.post(url);\n };\n service.downvote = function(taskId) {\n var url;\n url = $urls.resolve(\"task-downvote\", taskId);\n return $http.post(url);\n };\n service.watch = function(taskId) {\n var url;\n url = $urls.resolve(\"task-watch\", taskId);\n return $http.post(url);\n };\n service.unwatch = function(taskId) {\n var url;\n url = $urls.resolve(\"task-unwatch\", taskId);\n return $http.post(url);\n };\n service.bulkUpdateTaskTaskboardOrder = function(projectId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-update-task-taskboard-order\");\n params = {\n project_id: projectId,\n bulk_tasks: data\n };\n return $http.post(url, params);\n };\n service.listValues = function(projectId, type) {\n var params;\n params = {\n \"project\": projectId\n };\n return $repo.queryMany(type, params);\n };\n service.storeQueryParams = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getQueryParams = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n service.storeStatusColumnModes = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusColumnModes;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getStatusColumnModes = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixStatusColumnModes;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n service.storeUsRowModes = function(projectId, sprintId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixUsRowModes;\n hash = generateHash([projectId, sprintId, ns]);\n return $storage.set(hash, params);\n };\n service.getUsRowModes = function(projectId, sprintId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffixUsRowModes;\n hash = generateHash([projectId, sprintId, ns]);\n return $storage.get(hash) || {};\n };\n return function(instance) {\n return instance.tasks = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgTasksResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/memberships.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($config, $repo, $http, $urls, $q) {\n var service;\n service = {};\n service.changeAvatar = function(file) {\n var data, defered, maxFileSize, options, response, url;\n maxFileSize = $config.get(\"maxUploadFileSize\", null);\n if (maxFileSize && file.size > maxFileSize) {\n response = {\n status: 413,\n data: {\n _error_message: \"'\" + file.name + \"' (\" + (sizeFormat(file.size)) + \") is too heavy for our oompa loompas, try it with a smaller than (\" + (sizeFormat(maxFileSize)) + \")\"\n }\n };\n defered = $q.defer();\n defered.reject(response);\n return defered.promise;\n }\n data = new FormData();\n data.append('avatar', file);\n options = {\n transformRequest: angular.identity,\n headers: {\n 'Content-Type': void 0\n }\n };\n url = ($urls.resolve(\"users\")) + \"/change_avatar\";\n return $http.post(url, data, {}, options);\n };\n service.removeAvatar = function() {\n var url;\n url = ($urls.resolve(\"users\")) + \"/remove_avatar\";\n return $http.post(url);\n };\n service.changePassword = function(currentPassword, newPassword) {\n var data, url;\n url = ($urls.resolve(\"users\")) + \"/change_password\";\n data = {\n current_password: currentPassword,\n password: newPassword\n };\n return $http.post(url, data);\n };\n return function(instance) {\n return instance.userSettings = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgUserSettingsResourcesProvider\", [\"$tgConfig\", \"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/user.coffee\n */\n\n(function() {\n var module, resourceProvider, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n resourceProvider = function($http, $urls) {\n var service;\n service = {};\n service.contacts = function(userId, options) {\n var httpOptions, url;\n if (options == null) {\n options = {};\n }\n url = $urls.resolve(\"user-contacts\", userId);\n httpOptions = {\n headers: {}\n };\n if (!options.enablePagination) {\n httpOptions.headers[\"x-disable-pagination\"] = \"1\";\n }\n return $http.get(url, {}, httpOptions).then(function(result) {\n return result.data;\n });\n };\n return function(instance) {\n return instance.users = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgUsersResourcesProvider\", [\"$tgHttp\", \"$tgUrls\", \"$q\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/userstories.coffee\n */\n\n(function() {\n var generateHash, module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n generateHash = taiga.generateHash;\n\n resourceProvider = function($repo, $http, $urls, $storage) {\n var hashSuffix, service;\n service = {};\n hashSuffix = \"userstories-queryparams\";\n service.get = function(projectId, usId) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n return $repo.queryOne(\"userstories\", usId, params);\n };\n service.getByRef = function(projectId, ref) {\n var params;\n params = service.getQueryParams(projectId);\n params.project = projectId;\n params.ref = ref;\n return $repo.queryOne(\"userstories\", \"by_ref\", params);\n };\n service.listInAllProjects = function(filters) {\n return $repo.queryMany(\"userstories\", filters);\n };\n service.filtersData = function(params) {\n return $repo.queryOneRaw(\"userstories-filters\", null, params);\n };\n service.listUnassigned = function(projectId, filters) {\n var params;\n params = {\n \"project\": projectId,\n \"milestone\": \"null\"\n };\n params = _.extend({}, params, filters || {});\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(\"userstories\", params);\n };\n service.listAll = function(projectId, filters) {\n var params;\n params = {\n \"project\": projectId\n };\n params = _.extend({}, params, filters || {});\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(\"userstories\", params);\n };\n service.bulkCreate = function(projectId, status, bulk) {\n var data, url;\n data = {\n project_id: projectId,\n status_id: status,\n bulk_stories: bulk\n };\n url = $urls.resolve(\"bulk-create-us\");\n return $http.post(url, data);\n };\n service.upvote = function(userStoryId) {\n var url;\n url = $urls.resolve(\"userstory-upvote\", userStoryId);\n return $http.post(url);\n };\n service.downvote = function(userStoryId) {\n var url;\n url = $urls.resolve(\"userstory-downvote\", userStoryId);\n return $http.post(url);\n };\n service.watch = function(userStoryId) {\n var url;\n url = $urls.resolve(\"userstory-watch\", userStoryId);\n return $http.post(url);\n };\n service.unwatch = function(userStoryId) {\n var url;\n url = $urls.resolve(\"userstory-unwatch\", userStoryId);\n return $http.post(url);\n };\n service.bulkUpdateBacklogOrder = function(projectId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-update-us-backlog-order\");\n params = {\n project_id: projectId,\n bulk_stories: data\n };\n return $http.post(url, params);\n };\n service.bulkUpdateSprintOrder = function(projectId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-update-us-sprint-order\");\n params = {\n project_id: projectId,\n bulk_stories: data\n };\n return $http.post(url, params);\n };\n service.bulkUpdateKanbanOrder = function(projectId, data) {\n var params, url;\n url = $urls.resolve(\"bulk-update-us-kanban-order\");\n params = {\n project_id: projectId,\n bulk_stories: data\n };\n return $http.post(url, params);\n };\n service.listValues = function(projectId, type) {\n var params;\n params = {\n \"project\": projectId\n };\n service.storeQueryParams(projectId, params);\n return $repo.queryMany(type, params);\n };\n service.storeQueryParams = function(projectId, params) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.set(hash, params);\n };\n service.getQueryParams = function(projectId) {\n var hash, ns;\n ns = projectId + \":\" + hashSuffix;\n hash = generateHash([projectId, ns]);\n return $storage.get(hash) || {};\n };\n service.storeShowTags = function(projectId, showTags) {\n var hash;\n hash = generateHash([projectId, 'showTags']);\n return $storage.set(hash, showTags);\n };\n service.getShowTags = function(projectId) {\n var hash;\n hash = generateHash([projectId, 'showTags']);\n return $storage.get(hash) || null;\n };\n return function(instance) {\n return instance.userstories = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgUserstoriesResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", \"$tgStorage\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: webhooklogs.coffee\n */\n\n(function() {\n var module, resourceProvider;\n\n resourceProvider = function($repo, $urls, $http) {\n var service;\n service = {};\n service.list = function(webhookId) {\n var params;\n params = {\n webhook: webhookId\n };\n return $repo.queryMany(\"webhooklogs\", params);\n };\n service.resend = function(webhooklogId) {\n var url;\n url = $urls.resolve(\"webhooklogs-resend\", webhooklogId);\n return $http.post(url);\n };\n return function(instance) {\n return instance.webhooklogs = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgWebhookLogsResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: webhooks.coffee\n */\n\n(function() {\n var module, resourceProvider;\n\n resourceProvider = function($repo, $urls, $http) {\n var service;\n service = {};\n service.list = function(projectId) {\n var params;\n params = {\n project: projectId\n };\n return $repo.queryMany(\"webhooks\", params);\n };\n service.test = function(webhookId) {\n var url;\n url = $urls.resolve(\"webhooks-test\", webhookId);\n return $http.post(url);\n };\n return function(instance) {\n return instance.webhooks = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgWebhooksResourcesProvider\", [\"$tgRepo\", \"$tgUrls\", \"$tgHttp\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/resources/wikis.coffee\n */\n\n(function() {\n var module, resourceProvider, taiga;\n\n taiga = this.taiga;\n\n resourceProvider = function($repo, $http, $urls) {\n var service;\n service = {};\n service.get = function(wikiId) {\n return $repo.queryOne(\"wiki\", wikiId);\n };\n service.getBySlug = function(projectId, slug) {\n return $repo.queryOne(\"wiki\", \"by_slug?project=\" + projectId + \"&slug=\" + slug);\n };\n service.listLinks = function(projectId) {\n return $repo.queryMany(\"wiki-links\", {\n project: projectId\n });\n };\n return function(instance) {\n return instance.wiki = service;\n };\n };\n\n module = angular.module(\"taigaResources\");\n\n module.factory(\"$tgWikiResourcesProvider\", [\"$tgRepo\", \"$tgHttp\", \"$tgUrls\", resourceProvider]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings/main.coffee\n */\n\n(function() {\n var UserChangePasswordController, UserChangePasswordDirective, debounce, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaUserSettings\");\n\n UserChangePasswordController = (function(superClass) {\n extend(UserChangePasswordController, superClass);\n\n UserChangePasswordController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgAuth\", \"$translate\"];\n\n function UserChangePasswordController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, auth, translate) {\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.auth = auth;\n this.translate = translate;\n this.scope.sectionName = this.translate.instant(\"CHANGE_PASSWORD.SECTION_NAME\");\n this.scope.user = this.auth.getUser();\n }\n\n return UserChangePasswordController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"UserChangePasswordController\", UserChangePasswordController);\n\n UserChangePasswordDirective = function($rs, $confirm, $loading, $translate) {\n var link;\n link = function($scope, $el, $attrs, ctrl) {\n var submit, submitButton;\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var currentLoading, promise;\n event.preventDefault();\n if ($scope.newPassword1 !== $scope.newPassword2) {\n $confirm.notify('error', $translate.instant(\"CHANGE_PASSWORD.ERROR_PASSWORD_MATCH\"));\n return;\n }\n currentLoading = $loading().target(submitButton).start();\n promise = $rs.userSettings.changePassword($scope.currentPassword, $scope.newPassword1);\n promise.then(function() {\n currentLoading.finish();\n return $confirm.notify('success');\n });\n return promise.then(null, function(response) {\n currentLoading.finish();\n return $confirm.notify('error', response.data._error_message);\n });\n };\n })(this));\n submitButton = $el.find(\".submit-button\");\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserChangePassword\", [\"$tgResources\", \"$tgConfirm\", \"$tgLoading\", \"$translate\", UserChangePasswordDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/issues/lightboxes.coffee\n */\n\n(function() {\n var DeleteUserDirective, bindOnce, debounce, module, taiga;\n\n taiga = this.taiga;\n\n bindOnce = this.taiga.bindOnce;\n\n debounce = this.taiga.debounce;\n\n module = angular.module(\"taigaUserSettings\");\n\n DeleteUserDirective = function($repo, $rootscope, $auth, $location, $navUrls, lightboxService) {\n var link;\n link = function($scope, $el, $attrs) {\n var submit;\n $scope.$on(\"deletelightbox:new\", function(ctx, user) {\n return lightboxService.open($el);\n });\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n submit = function() {\n var promise;\n promise = $repo.remove($scope.user);\n promise.then(function(data) {\n lightboxService.close($el);\n $auth.logout();\n return $location.path($navUrls.resolve(\"login\"));\n });\n return promise.then(null, function() {\n return console.log(\"FAIL\");\n });\n };\n $el.on(\"click\", \".button-red\", function(event) {\n event.preventDefault();\n return lightboxService.close($el);\n });\n return $el.on(\"click\", \".button-green\", debounce(2000, function(event) {\n event.preventDefault();\n return submit();\n }));\n };\n return {\n link: link,\n templateUrl: \"user/lightbox/lightbox-delete-account.html\"\n };\n };\n\n module.directive(\"tgLbDeleteUser\", [\"$tgRepo\", \"$rootScope\", \"$tgAuth\", \"$tgLocation\", \"$tgNavUrls\", \"lightboxService\", DeleteUserDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings/main.coffee\n */\n\n(function() {\n var TaigaAvatarModelDirective, UserAvatarDirective, UserProfileDirective, UserSettingsController, debounce, mixOf, module, sizeFormat, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n sizeFormat = this.taiga.sizeFormat;\n\n module = angular.module(\"taigaUserSettings\");\n\n debounce = this.taiga.debounce;\n\n UserSettingsController = (function(superClass) {\n extend(UserSettingsController, superClass);\n\n UserSettingsController.$inject = [\"$scope\", \"$rootScope\", \"$tgConfig\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgAuth\", \"$translate\"];\n\n function UserSettingsController(scope, rootscope, config, repo, confirm, rs, params, q, location, navUrls, auth, translate) {\n var maxFileSize, promise, text;\n this.scope = scope;\n this.rootscope = rootscope;\n this.config = config;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.auth = auth;\n this.translate = translate;\n this.scope.sectionName = \"USER_SETTINGS.MENU.SECTION_TITLE\";\n this.scope.project = {};\n this.scope.user = this.auth.getUser();\n if (!this.scope.user) {\n this.location.path(this.navUrls.resolve(\"permission-denied\"));\n this.location.replace();\n }\n this.scope.lang = this.getLan();\n this.scope.theme = this.getTheme();\n maxFileSize = this.config.get(\"maxUploadFileSize\", null);\n if (maxFileSize) {\n text = this.translate.instant(\"USER_SETTINGS.AVATAR_MAX_SIZE\", {\n \"maxFileSize\": sizeFormat(maxFileSize)\n });\n this.scope.maxFileSizeMsg = text;\n }\n promise = this.loadInitialData();\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n UserSettingsController.prototype.loadInitialData = function() {\n this.scope.availableThemes = this.config.get(\"themes\", []);\n return this.rs.locales.list().then((function(_this) {\n return function(locales) {\n _this.scope.locales = locales;\n return locales;\n };\n })(this));\n };\n\n UserSettingsController.prototype.openDeleteLightbox = function() {\n return this.rootscope.$broadcast(\"deletelightbox:new\", this.scope.user);\n };\n\n UserSettingsController.prototype.getLan = function() {\n return this.scope.user.lang || this.translate.preferredLanguage();\n };\n\n UserSettingsController.prototype.getTheme = function() {\n return this.scope.user.theme || this.config.get(\"defaultTheme\") || \"taiga\";\n };\n\n return UserSettingsController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"UserSettingsController\", UserSettingsController);\n\n UserProfileDirective = function($confirm, $auth, $repo, $translate) {\n var link;\n link = function($scope, $el, $attrs) {\n var submit;\n submit = debounce(2000, (function(_this) {\n return function(event) {\n var changeEmail, form, onError, onSuccess;\n event.preventDefault();\n form = $el.find(\"form\").checksley();\n if (!form.validate()) {\n return;\n }\n changeEmail = $scope.user.isAttributeModified(\"email\");\n $scope.user.lang = $scope.lang;\n $scope.user.theme = $scope.theme;\n onSuccess = function(data) {\n var text;\n $auth.setUser(data);\n if (changeEmail) {\n text = $translate.instant(\"USER_PROFILE.CHANGE_EMAIL_SUCCESS\");\n return $confirm.success(text);\n } else {\n return $confirm.notify('success');\n }\n };\n onError = function(data) {\n form.setErrors(data);\n return $confirm.notify('error', data._error_message);\n };\n return $repo.save($scope.user).then(onSuccess, onError);\n };\n })(this));\n $el.on(\"submit\", \"form\", submit);\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserProfile\", [\"$tgConfirm\", \"$tgAuth\", \"$tgRepo\", \"$translate\", UserProfileDirective]);\n\n UserAvatarDirective = function($auth, $model, $rs, $confirm) {\n var link;\n link = function($scope, $el, $attrs) {\n var onError, onSuccess, showSizeInfo;\n showSizeInfo = function() {\n return $el.find(\".size-info\").removeClass(\"hidden\");\n };\n onSuccess = function(response) {\n var user;\n user = $model.make_model(\"users\", response.data);\n $auth.setUser(user);\n $scope.user = user;\n $el.find('.loading-overlay').removeClass('active');\n return $confirm.notify('success');\n };\n onError = function(response) {\n if (response.status === 413) {\n showSizeInfo();\n }\n $el.find('.loading-overlay').removeClass('active');\n return $confirm.notify('error', response.data._error_message);\n };\n $el.on(\"click\", \".js-change-avatar\", function() {\n return $el.find(\"#avatar-field\").click();\n });\n $el.on(\"change\", \"#avatar-field\", function(event) {\n if ($scope.avatarAttachment) {\n $el.find('.loading-overlay').addClass(\"active\");\n return $rs.userSettings.changeAvatar($scope.avatarAttachment).then(onSuccess, onError);\n }\n });\n $el.on(\"click\", \"a.js-use-gravatar\", function(event) {\n $el.find('.loading-overlay').addClass(\"active\");\n return $rs.userSettings.removeAvatar().then(onSuccess, onError);\n });\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserAvatar\", [\"$tgAuth\", \"$tgModel\", \"$tgResources\", \"$tgConfirm\", UserAvatarDirective]);\n\n TaigaAvatarModelDirective = function($parse) {\n var link;\n link = function($scope, $el, $attrs) {\n var model, modelSetter;\n model = $parse($attrs.tgAvatarModel);\n modelSetter = model.assign;\n return $el.bind('change', function() {\n return $scope.$apply(function() {\n return modelSetter($scope, $el[0].files[0]);\n });\n });\n };\n return {\n link: link\n };\n };\n\n module.directive('tgAvatarModel', ['$parse', TaigaAvatarModelDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings/nav.coffee\n */\n\n(function() {\n var UserSettingsNavigationDirective, module;\n\n UserSettingsNavigationDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n var section;\n section = $attrs.tgUserSettingsNavigation;\n $el.find(\".active\").removeClass(\"active\");\n $el.find(\"#usersettingsmenu-\" + section + \" a\").addClass(\"active\");\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module = angular.module(\"taigaUserSettings\");\n\n module.directive(\"tgUserSettingsNavigation\", UserSettingsNavigationDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/user-settings/notifications.coffee\n */\n\n(function() {\n var UserNotificationsController, UserNotificationsDirective, UserNotificationsListDirective, bindOnce, mixOf, module, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n bindOnce = this.taiga.bindOnce;\n\n module = angular.module(\"taigaUserSettings\");\n\n UserNotificationsController = (function(superClass) {\n extend(UserNotificationsController, superClass);\n\n UserNotificationsController.$inject = [\"$scope\", \"$rootScope\", \"$tgRepo\", \"$tgConfirm\", \"$tgResources\", \"$routeParams\", \"$q\", \"$tgLocation\", \"$tgNavUrls\", \"$tgAuth\"];\n\n function UserNotificationsController(scope, rootscope, repo, confirm, rs, params, q, location, navUrls, auth) {\n var promise;\n this.scope = scope;\n this.rootscope = rootscope;\n this.repo = repo;\n this.confirm = confirm;\n this.rs = rs;\n this.params = params;\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n this.auth = auth;\n this.scope.sectionName = \"USER_SETTINGS.NOTIFICATIONS.SECTION_NAME\";\n this.scope.user = this.auth.getUser();\n promise = this.loadInitialData();\n promise.then(null, this.onInitialDataError.bind(this));\n }\n\n UserNotificationsController.prototype.loadInitialData = function() {\n return this.rs.notifyPolicies.list().then((function(_this) {\n return function(notifyPolicies) {\n _this.scope.notifyPolicies = notifyPolicies;\n return notifyPolicies;\n };\n })(this));\n };\n\n return UserNotificationsController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin));\n\n module.controller(\"UserNotificationsController\", UserNotificationsController);\n\n UserNotificationsDirective = function() {\n var link;\n link = function($scope, $el, $attrs) {\n return $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserNotifications\", UserNotificationsDirective);\n\n UserNotificationsListDirective = function($repo, $confirm, $compile) {\n var link, template;\n template = _.template(\"<% _.each(notifyPolicies, function (notifyPolicy, index) { %>\\n
\\\">\\n
<%- notifyPolicy.project_name %>
\\n
\\n
\\n \\\" id=\\\"policy-all-<%- notifyPolicy.id %>\\\"\\n value=\\\"2\\\" <% if (notifyPolicy.notify_level == 2) { %>checked=\\\"checked\\\"<% } %>/>\\n \\n
\\n
\\n
\\n
\\n \\\" id=\\\"policy-involved-<%- notifyPolicy.id %>\\\"\\n value=\\\"1\\\" <% if (notifyPolicy.notify_level == 1) { %>checked=\\\"checked\\\"<% } %> />\\n \\n
\\n
\\n
\\n
\\n \\\" id=\\\"policy-none-<%- notifyPolicy.id %>\\\"\\n value=\\\"3\\\" <% if (notifyPolicy.notify_level == 3) { %>checked=\\\"checked\\\"<% } %> />\\n \\n
\\n
\\n
\\n<% }) %>\");\n link = function($scope, $el, $attrs) {\n var render;\n render = function() {\n var ctx, html;\n $el.off();\n ctx = {\n notifyPolicies: $scope.notifyPolicies\n };\n html = template(ctx);\n $el.html($compile(html)($scope));\n return $el.on(\"change\", \"input[type=radio]\", function(event) {\n var onError, onSuccess, policy, policyIndex, prev_level, target;\n target = angular.element(event.currentTarget);\n policyIndex = target.parents(\".policy-table-row\").data('index');\n policy = $scope.notifyPolicies[policyIndex];\n prev_level = policy.notify_level;\n policy.notify_level = parseInt(target.val(), 10);\n onSuccess = function() {\n return $confirm.notify(\"success\");\n };\n onError = function() {\n $confirm.notify(\"error\");\n return target.parents(\".policy-table-row\").find(\"input[value=\" + prev_level + \"]\").prop(\"checked\", true);\n };\n return $repo.save(policy).then(onSuccess, onError);\n });\n };\n $scope.$on(\"$destroy\", function() {\n return $el.off();\n });\n return bindOnce($scope, $attrs.ngModel, render);\n };\n return {\n link: link\n };\n };\n\n module.directive(\"tgUserNotificationsList\", [\"$tgRepo\", \"$tgConfirm\", \"$compile\", UserNotificationsListDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: components.module.coffee\n */\n\n(function() {\n angular.module(\"taigaComponents\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaDiscover\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: external-apps.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaExternalApps\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: home.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaHome\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: navigation-bar.module.coffee\n */\n\n(function() {\n angular.module(\"taigaNavigationBar\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile.module.coffee\n */\n\n(function() {\n var module;\n\n module = angular.module(\"taigaProfile\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: projects.module.coffee\n */\n\n(function() {\n angular.module(\"taigaProjects\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: resources.module.coffee\n */\n\n(function() {\n angular.module(\"taigaResources2\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline.module.coffee\n */\n\n(function() {\n angular.module(\"taigaUserTimeline\", []);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachment-link.directive.coffee\n */\n\n(function() {\n var AttachmentLinkDirective;\n\n AttachmentLinkDirective = function($parse, lightboxFactory) {\n var link;\n link = function(scope, el, attrs) {\n var attachment;\n attachment = $parse(attrs.tgAttachmentLink)(scope);\n el.on(\"click\", function(event) {\n if (taiga.isImage(attachment.getIn(['file', 'name']))) {\n event.preventDefault();\n return scope.$apply(function() {\n return lightboxFactory.create('tg-lb-attachment-preview', {\n \"class\": 'lightbox lightbox-block'\n }, {\n file: attachment.get('file')\n });\n });\n }\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n };\n return {\n link: link\n };\n };\n\n AttachmentLinkDirective.$inject = [\"$parse\", \"tgLightboxFactory\"];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentLink\", AttachmentLinkDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachment-gallery.directive.coffee\n */\n\n(function() {\n var AttachmentGalleryDirective;\n\n AttachmentGalleryDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {};\n return {\n scope: {},\n bindToController: {\n attachment: \"=\",\n onDelete: \"&\",\n onUpdate: \"&\",\n type: \"=\"\n },\n controller: \"Attachment\",\n controllerAs: \"vm\",\n templateUrl: \"components/attachment/attachment-gallery.html\",\n link: link\n };\n };\n\n AttachmentGalleryDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentGallery\", AttachmentGalleryDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchment.controller.coffee\n */\n\n(function() {\n var AttachmentController;\n\n AttachmentController = (function() {\n AttachmentController.$inject = ['tgAttachmentsService', '$translate'];\n\n function AttachmentController(attachmentsService, translate) {\n this.attachmentsService = attachmentsService;\n this.translate = translate;\n this.form = {};\n this.form.description = this.attachment.getIn(['file', 'description']);\n this.form.is_deprecated = this.attachment.get(['file', 'is_deprecated']);\n this.title = this.translate.instant(\"ATTACHMENT.TITLE\", {\n fileName: this.attachment.get('name'),\n date: moment(this.attachment.get('created_date')).format(this.translate.instant(\"ATTACHMENT.DATE\"))\n });\n }\n\n AttachmentController.prototype.editMode = function(mode) {\n var attachment;\n attachment = this.attachment.set('editable', mode);\n return this.onUpdate({\n attachment: attachment\n });\n };\n\n AttachmentController.prototype[\"delete\"] = function() {\n return this.onDelete({\n attachment: this.attachment\n });\n };\n\n AttachmentController.prototype.save = function() {\n var attachment;\n attachment = this.attachment.set('loading', true);\n this.onUpdate({\n attachment: attachment\n });\n attachment = this.attachment.merge({\n editable: false,\n loading: false\n });\n attachment = attachment.mergeIn(['file'], {\n description: this.form.description,\n is_deprecated: !!this.form.is_deprecated\n });\n return this.onUpdate({\n attachment: attachment\n });\n };\n\n return AttachmentController;\n\n })();\n\n angular.module('taigaComponents').controller('Attachment', AttachmentController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachment.directive.coffee\n */\n\n(function() {\n var AttachmentDirective;\n\n AttachmentDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {};\n return {\n scope: {},\n bindToController: {\n attachment: \"=\",\n onDelete: \"&\",\n onUpdate: \"&\",\n type: \"=\"\n },\n controller: \"Attachment\",\n controllerAs: \"vm\",\n templateUrl: \"components/attachment/attachment.html\",\n link: link\n };\n };\n\n AttachmentDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachment\", AttachmentDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-drop.directive.coffee\n */\n\n(function() {\n var AttachmentsDropDirective;\n\n AttachmentsDropDirective = function($parse) {\n var link;\n link = function(scope, el, attrs) {\n var eventAttr;\n eventAttr = $parse(attrs.tgAttachmentsDrop);\n el.on('dragover', function(e) {\n e.preventDefault();\n return false;\n });\n el.on('drop', function(e) {\n var dataTransfer;\n e.stopPropagation();\n e.preventDefault();\n dataTransfer = e.dataTransfer || (e.originalEvent && e.originalEvent.dataTransfer);\n return scope.$apply(function() {\n return eventAttr(scope, {\n files: dataTransfer.files\n });\n });\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n };\n return {\n link: link\n };\n };\n\n AttachmentsDropDirective.$inject = [\"$parse\"];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentsDrop\", AttachmentsDropDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchments-full.controller.coffee\n */\n\n(function() {\n var AttachmentsFullController, sizeFormat;\n\n sizeFormat = this.taiga.sizeFormat;\n\n AttachmentsFullController = (function() {\n AttachmentsFullController.$inject = [\"$translate\", \"$tgConfirm\", \"$tgConfig\", \"$tgStorage\", \"tgAttachmentsFullService\"];\n\n function AttachmentsFullController(translate, confirm, config, storage, attachmentsFullService) {\n this.translate = translate;\n this.confirm = confirm;\n this.config = config;\n this.storage = storage;\n this.attachmentsFullService = attachmentsFullService;\n this.mode = this.storage.get('attachment-mode', 'list');\n this.maxFileSize = this.config.get(\"maxUploadFileSize\", null);\n if (this.maxFileSize) {\n this.maxFileSize = sizeFormat(this.maxFileSize);\n }\n this.maxFileSizeMsg = this.maxFileSize ? this.translate.instant(\"ATTACHMENT.MAX_UPLOAD_SIZE\", {\n maxFileSize: this.maxFileSize\n }) : \"\";\n taiga.defineImmutableProperty(this, 'attachments', (function(_this) {\n return function() {\n return _this.attachmentsFullService.attachments;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'deprecatedsCount', (function(_this) {\n return function() {\n return _this.attachmentsFullService.deprecatedsCount;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'attachmentsVisible', (function(_this) {\n return function() {\n return _this.attachmentsFullService.attachmentsVisible;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'deprecatedsVisible', (function(_this) {\n return function() {\n return _this.attachmentsFullService.deprecatedsVisible;\n };\n })(this));\n }\n\n AttachmentsFullController.prototype.uploadingAttachments = function() {\n return this.attachmentsFullService.uploadingAttachments;\n };\n\n AttachmentsFullController.prototype.addAttachment = function(file) {\n var editable;\n editable = this.mode === 'list';\n return this.attachmentsFullService.addAttachment(this.projectId, this.objId, this.type, file, editable);\n };\n\n AttachmentsFullController.prototype.setMode = function(mode) {\n this.mode = mode;\n return this.storage.set('attachment-mode', mode);\n };\n\n AttachmentsFullController.prototype.toggleDeprecatedsVisible = function() {\n return this.attachmentsFullService.toggleDeprecatedsVisible();\n };\n\n AttachmentsFullController.prototype.addAttachments = function(files) {\n return _.forEach(files, (function(_this) {\n return function(file) {\n return _this.addAttachment(file);\n };\n })(this));\n };\n\n AttachmentsFullController.prototype.loadAttachments = function() {\n return this.attachmentsFullService.loadAttachments(this.type, this.objId, this.projectId);\n };\n\n AttachmentsFullController.prototype.deleteAttachment = function(toDeleteAttachment) {\n var message, title;\n title = this.translate.instant(\"ATTACHMENT.TITLE_LIGHTBOX_DELETE_ATTACHMENT\");\n message = this.translate.instant(\"ATTACHMENT.MSG_LIGHTBOX_DELETE_ATTACHMENT\", {\n fileName: toDeleteAttachment.getIn(['file', 'name'])\n });\n return this.confirm.askOnDelete(title, message).then((function(_this) {\n return function(askResponse) {\n var onError, onSuccess;\n onError = function() {\n message = _this.translate.instant(\"ATTACHMENT.ERROR_DELETE_ATTACHMENT\", {\n errorMessage: message\n });\n _this.confirm.notify(\"error\", null, message);\n return askResponse.finish(false);\n };\n onSuccess = function() {\n return askResponse.finish();\n };\n return _this.attachmentsFullService.deleteAttachment(toDeleteAttachment, _this.type).then(onSuccess, onError);\n };\n })(this));\n };\n\n AttachmentsFullController.prototype.reorderAttachment = function(attachment, newIndex) {\n return this.attachmentsFullService.reorderAttachment(this.type, attachment, newIndex);\n };\n\n AttachmentsFullController.prototype.updateAttachment = function(toUpdateAttachment) {\n return this.attachmentsFullService.updateAttachment(toUpdateAttachment, this.type);\n };\n\n return AttachmentsFullController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"AttachmentsFull\", AttachmentsFullController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchments-full.directive.coffee\n */\n\n(function() {\n var AttachmentsFullDirective, bindOnce;\n\n bindOnce = this.taiga.bindOnce;\n\n AttachmentsFullDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return bindOnce(scope, 'vm.objId', function(value) {\n return ctrl.loadAttachments();\n });\n };\n return {\n scope: {},\n bindToController: {\n type: \"@\",\n objId: \"=\",\n projectId: \"=\"\n },\n controller: \"AttachmentsFull\",\n controllerAs: \"vm\",\n templateUrl: \"components/attachments-full/attachments-full.html\",\n link: link\n };\n };\n\n AttachmentsFullDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentsFull\", AttachmentsFullDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-full.service.coffee\n */\n\n(function() {\n var AttachmentsFullService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n AttachmentsFullService = (function(superClass) {\n extend(AttachmentsFullService, superClass);\n\n AttachmentsFullService.$inject = [\"tgAttachmentsService\", \"$rootScope\"];\n\n function AttachmentsFullService(attachmentsService, rootScope) {\n this.attachmentsService = attachmentsService;\n this.rootScope = rootScope;\n this._attachments = Immutable.List();\n this._deprecatedsCount = 0;\n this._attachmentsVisible = Immutable.List();\n this._deprecatedsVisible = false;\n this.uploadingAttachments = [];\n taiga.defineImmutableProperty(this, 'attachments', (function(_this) {\n return function() {\n return _this._attachments;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'deprecatedsCount', (function(_this) {\n return function() {\n return _this._deprecatedsCount;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'attachmentsVisible', (function(_this) {\n return function() {\n return _this._attachmentsVisible;\n };\n })(this));\n taiga.defineImmutableProperty(this, 'deprecatedsVisible', (function(_this) {\n return function() {\n return _this._deprecatedsVisible;\n };\n })(this));\n }\n\n AttachmentsFullService.prototype.toggleDeprecatedsVisible = function() {\n this._deprecatedsVisible = !this._deprecatedsVisible;\n return this.regenerate();\n };\n\n AttachmentsFullService.prototype.regenerate = function() {\n this._deprecatedsCount = this._attachments.count(function(it) {\n return it.getIn(['file', 'is_deprecated']);\n });\n if (this._deprecatedsVisible) {\n return this._attachmentsVisible = this._attachments;\n } else {\n return this._attachmentsVisible = this._attachments.filter(function(it) {\n return !it.getIn(['file', 'is_deprecated']);\n });\n }\n };\n\n AttachmentsFullService.prototype.addAttachment = function(projectId, objId, type, file, editable) {\n if (editable == null) {\n editable = true;\n }\n return new Promise((function(_this) {\n return function(resolve, reject) {\n var promise;\n if (_this.attachmentsService.validate(file)) {\n _this.uploadingAttachments.push(file);\n promise = _this.attachmentsService.upload(file, objId, projectId, type);\n return promise.then(function(file) {\n var attachment;\n _this.uploadingAttachments = _this.uploadingAttachments.filter(function(uploading) {\n return uploading.name !== file.get('name');\n });\n attachment = Immutable.Map();\n attachment = attachment.merge({\n file: file,\n editable: editable,\n loading: false\n });\n _this._attachments = _this._attachments.push(attachment);\n _this.regenerate();\n _this.rootScope.$broadcast(\"attachment:create\");\n return resolve(attachment);\n });\n } else {\n return reject(file);\n }\n };\n })(this));\n };\n\n AttachmentsFullService.prototype.loadAttachments = function(type, objId, projectId) {\n return this.attachmentsService.list(type, objId, projectId).then((function(_this) {\n return function(files) {\n _this._attachments = files.map(function(file) {\n var attachment;\n attachment = Immutable.Map();\n return attachment.merge({\n loading: false,\n editable: false,\n file: file\n });\n });\n return _this.regenerate();\n };\n })(this));\n };\n\n AttachmentsFullService.prototype.deleteAttachment = function(toDeleteAttachment, type) {\n var onSuccess;\n onSuccess = (function(_this) {\n return function() {\n _this._attachments = _this._attachments.filter(function(attachment) {\n return attachment !== toDeleteAttachment;\n });\n return _this.regenerate();\n };\n })(this);\n return this.attachmentsService[\"delete\"](type, toDeleteAttachment.getIn(['file', 'id'])).then(onSuccess);\n };\n\n AttachmentsFullService.prototype.reorderAttachment = function(type, attachment, newIndex) {\n var attachments, oldIndex, promises;\n oldIndex = this.attachments.findIndex(function(it) {\n return it === attachment;\n });\n if (oldIndex === newIndex) {\n return;\n }\n attachments = this.attachments.remove(oldIndex);\n attachments = attachments.splice(newIndex, 0, attachment);\n attachments = attachments.map(function(x, i) {\n return x.setIn(['file', 'order'], i + 1);\n });\n promises = [];\n attachments.forEach((function(_this) {\n return function(attachment) {\n var patch;\n patch = {\n order: attachment.getIn(['file', 'order'])\n };\n return promises.push(_this.attachmentsService.patch(attachment.getIn(['file', 'id']), type, patch));\n };\n })(this));\n return Promise.all(promises).then((function(_this) {\n return function() {\n _this._attachments = attachments;\n return _this.regenerate();\n };\n })(this));\n };\n\n AttachmentsFullService.prototype.updateAttachment = function(toUpdateAttachment, type) {\n var index, oldAttachment, patch;\n index = this._attachments.findIndex(function(attachment) {\n return attachment.getIn(['file', 'id']) === toUpdateAttachment.getIn(['file', 'id']);\n });\n oldAttachment = this._attachments.get(index);\n patch = taiga.patch(oldAttachment.get('file'), toUpdateAttachment.get('file'));\n if (toUpdateAttachment.get('loading')) {\n this._attachments = this._attachments.set(index, toUpdateAttachment);\n return this.regenerate();\n } else {\n return this.attachmentsService.patch(toUpdateAttachment.getIn(['file', 'id']), type, patch).then((function(_this) {\n return function() {\n _this._attachments = _this._attachments.set(index, toUpdateAttachment);\n return _this.regenerate();\n };\n })(this));\n }\n };\n\n return AttachmentsFullService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgAttachmentsFullService\", AttachmentsFullService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchments-simple.controller.coffee\n */\n\n(function() {\n var AttachmentsSimpleController;\n\n AttachmentsSimpleController = (function() {\n AttachmentsSimpleController.$inject = [\"tgAttachmentsService\"];\n\n function AttachmentsSimpleController(attachmentsService) {\n this.attachmentsService = attachmentsService;\n }\n\n AttachmentsSimpleController.prototype.addAttachment = function(file) {\n var attachment;\n attachment = Immutable.fromJS({\n file: file,\n name: file.name,\n size: file.size\n });\n if (this.attachmentsService.validate(file)) {\n this.attachments = this.attachments.push(attachment);\n if (this.onAdd) {\n return this.onAdd({\n attachment: attachment\n });\n }\n }\n };\n\n AttachmentsSimpleController.prototype.addAttachments = function(files) {\n return _.forEach(files, this.addAttachment.bind(this));\n };\n\n AttachmentsSimpleController.prototype.deleteAttachment = function(toDeleteAttachment) {\n this.attachments = this.attachments.filter(function(attachment) {\n return attachment !== toDeleteAttachment;\n });\n if (this.onDelete) {\n return this.onDelete({\n attachment: toDeleteAttachment\n });\n }\n };\n\n return AttachmentsSimpleController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"AttachmentsSimple\", AttachmentsSimpleController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attchments-simple.directive.coffee\n */\n\n(function() {\n var AttachmentsSimpleDirective;\n\n AttachmentsSimpleDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {};\n return {\n scope: {},\n bindToController: {\n attachments: \"=\",\n onAdd: \"&\",\n onDelete: \"&\"\n },\n controller: \"AttachmentsSimple\",\n controllerAs: \"vm\",\n templateUrl: \"components/attachments-simple/attachments-simple.html\",\n link: link\n };\n };\n\n AttachmentsSimpleDirective.$inject = [];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentsSimple\", AttachmentsSimpleDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-sortable.directive.coffee\n */\n\n(function() {\n var AttachmentSortableDirective;\n\n AttachmentSortableDirective = function($parse) {\n var link;\n link = function(scope, el, attrs) {\n var callback;\n callback = $parse(attrs.tgAttachmentsSortable);\n el.sortable({\n items: \"div[tg-bind-scope]\",\n handle: \"a.settings.icon.icon-drag-v\",\n containment: \".attachments\",\n dropOnEmpty: true,\n helper: 'clone',\n scroll: false,\n tolerance: \"pointer\",\n placeholder: \"sortable-placeholder single-attachment\"\n });\n el.on(\"sortstop\", function(event, ui) {\n var attachment, newIndex;\n attachment = ui.item.scope().attachment;\n newIndex = ui.item.index();\n return scope.$apply(function() {\n return callback(scope, {\n attachment: attachment,\n index: newIndex\n });\n });\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n };\n return {\n link: link\n };\n };\n\n AttachmentSortableDirective.$inject = [\"$parse\"];\n\n angular.module(\"taigaComponents\").directive(\"tgAttachmentsSortable\", AttachmentSortableDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: auto-select.directive.coffee\n */\n\n(function() {\n var AutoSelectDirective;\n\n AutoSelectDirective = function($timeout) {\n return {\n link: function(scope, elm) {\n return $timeout(function() {\n return elm[0].select();\n });\n }\n };\n };\n\n AutoSelectDirective.$inject = ['$timeout'];\n\n angular.module(\"taigaComponents\").directive(\"tgAutoSelect\", AutoSelectDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: file-change.directive.coffee\n */\n\n(function() {\n var FileChangeDirective;\n\n FileChangeDirective = function($parse) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var eventAttr;\n eventAttr = $parse(attrs.tgFileChange);\n el.on('change', function(event) {\n return scope.$apply(function() {\n return eventAttr(scope, {\n files: event.currentTarget.files\n });\n });\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n };\n return {\n require: \"ngModel\",\n restrict: \"A\",\n link: link\n };\n };\n\n FileChangeDirective.$inject = [\"$parse\"];\n\n angular.module(\"taigaComponents\").directive(\"tgFileChange\", FileChangeDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: joy-ride.directive.coffee\n */\n\n(function() {\n var JoyRideDirective, taiga;\n\n taiga = this.taiga;\n\n JoyRideDirective = function($rootScope, currentUserService, joyRideService, $location, $translate) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var initJoyrRide, intro, unsuscribe;\n unsuscribe = null;\n intro = introJs();\n intro.oncomplete(function() {\n return $('html,body').scrollTop(0);\n });\n intro.onexit(function() {\n return currentUserService.disableJoyRide();\n });\n initJoyrRide = function(next, config) {\n if (!config[next.joyride]) {\n return;\n }\n intro.setOptions({\n exitOnEsc: false,\n exitOnOverlayClick: false,\n showStepNumbers: false,\n nextLabel: $translate.instant('JOYRIDE.NAV.NEXT') + ' →',\n prevLabel: '← ' + $translate.instant('JOYRIDE.NAV.BACK'),\n skipLabel: $translate.instant('JOYRIDE.NAV.SKIP'),\n doneLabel: $translate.instant('JOYRIDE.NAV.DONE'),\n disableInteraction: true\n });\n intro.setOption('steps', joyRideService.get(next.joyride));\n return intro.start();\n };\n return $rootScope.$on('$routeChangeSuccess', function(event, next) {\n if (!next.joyride || !currentUserService.isAuthenticated()) {\n intro.exit();\n if (unsuscribe) {\n unsuscribe();\n }\n return;\n }\n intro.oncomplete(function() {\n return currentUserService.disableJoyRide(next.joyride);\n });\n if (next.loader) {\n return unsuscribe = $rootScope.$on('loader:end', function() {\n currentUserService.loadJoyRideConfig().then(function(config) {\n return initJoyrRide(next, config);\n });\n return unsuscribe();\n });\n } else {\n return currentUserService.loadJoyRideConfig().then(function(config) {\n return initJoyrRide(next, config);\n });\n }\n });\n };\n return {\n scope: {},\n link: link\n };\n };\n\n JoyRideDirective.$inject = [\"$rootScope\", \"tgCurrentUserService\", \"tgJoyRideService\", \"$location\", \"$translate\"];\n\n angular.module(\"taigaComponents\").directive(\"tgJoyRide\", JoyRideDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: joy-ride.service.coffee\n */\n\n(function() {\n var JoyRideService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n JoyRideService = (function(superClass) {\n extend(JoyRideService, superClass);\n\n JoyRideService.$inject = ['$translate', 'tgCheckPermissionsService'];\n\n function JoyRideService(translate, checkPermissionsService) {\n this.translate = translate;\n this.checkPermissionsService = checkPermissionsService;\n }\n\n JoyRideService.prototype.getConfig = function() {\n return {\n dashboard: (function(_this) {\n return function() {\n var steps;\n steps = [\n {\n element: '.project-list > section:not(.ng-hide)',\n position: 'left',\n joyride: {\n title: _this.translate.instant('JOYRIDE.DASHBOARD.STEP1.TITLE'),\n text: _this.translate.instant('JOYRIDE.DASHBOARD.STEP1.TEXT')\n }\n }, {\n element: '.working-on-container',\n position: 'right',\n joyride: {\n title: _this.translate.instant('JOYRIDE.DASHBOARD.STEP2.TITLE'),\n text: _this.translate.instant('JOYRIDE.DASHBOARD.STEP2.TEXT')\n }\n }, {\n element: '.watching-container',\n position: 'right',\n joyride: {\n title: _this.translate.instant('JOYRIDE.DASHBOARD.STEP3.TITLE'),\n text: [_this.translate.instant('JOYRIDE.DASHBOARD.STEP3.TEXT1'), _this.translate.instant('JOYRIDE.DASHBOARD.STEP3.TEXT2')]\n }\n }\n ];\n if (!$('.project-list .create-project-button').is(':hidden')) {\n steps.push({\n element: '.project-list .create-project-button',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.DASHBOARD.STEP4.TITLE'),\n text: [_this.translate.instant('JOYRIDE.DASHBOARD.STEP4.TEXT1'), _this.translate.instant('JOYRIDE.DASHBOARD.STEP4.TEXT2')]\n }\n });\n }\n return steps;\n };\n })(this),\n backlog: (function(_this) {\n return function() {\n var steps;\n steps = [\n {\n element: '.summary',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.BACKLOG.STEP1.TITLE'),\n text: [_this.translate.instant('JOYRIDE.BACKLOG.STEP1.TEXT1'), _this.translate.instant('JOYRIDE.BACKLOG.STEP1.TEXT2')]\n }\n }, {\n element: '.backlog-table-empty',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.BACKLOG.STEP2.TITLE'),\n text: _this.translate.instant('JOYRIDE.BACKLOG.STEP2.TEXT')\n }\n }, {\n element: '.sprints',\n position: 'left',\n joyride: {\n title: _this.translate.instant('JOYRIDE.BACKLOG.STEP3.TITLE'),\n text: _this.translate.instant('JOYRIDE.BACKLOG.STEP3.TEXT')\n }\n }\n ];\n if (_this.checkPermissionsService.check('add_us')) {\n steps.push({\n element: '.new-us',\n position: 'rigth',\n joyride: {\n title: _this.translate.instant('JOYRIDE.BACKLOG.STEP4.TITLE'),\n text: _this.translate.instant('JOYRIDE.BACKLOG.STEP4.TEXT')\n }\n });\n }\n return steps;\n };\n })(this),\n kanban: (function(_this) {\n return function() {\n var steps;\n steps = [\n {\n element: '.kanban-table-inner',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.KANBAN.STEP1.TITLE'),\n text: _this.translate.instant('JOYRIDE.KANBAN.STEP1.TEXT')\n }\n }, {\n element: '.card-placeholder',\n position: 'right',\n joyride: {\n title: _this.translate.instant('JOYRIDE.KANBAN.STEP2.TITLE'),\n text: _this.translate.instant('JOYRIDE.KANBAN.STEP2.TEXT')\n }\n }\n ];\n if (_this.checkPermissionsService.check('add_us')) {\n steps.push({\n element: '.icon-plus',\n position: 'bottom',\n joyride: {\n title: _this.translate.instant('JOYRIDE.KANBAN.STEP3.TITLE'),\n text: [_this.translate.instant('JOYRIDE.KANBAN.STEP3.TEXT1'), _this.translate.instant('JOYRIDE.KANBAN.STEP3.TEXT2')]\n }\n });\n }\n return steps;\n };\n })(this)\n };\n };\n\n JoyRideService.prototype.get = function(name) {\n var joyRide, joyRides;\n joyRides = this.getConfig();\n joyRide = joyRides[name].call(this);\n return _.map(joyRide, function(item) {\n var html;\n html = \"\";\n if (item.joyride.title) {\n html += \"

\" + item.joyride.title + \"

\";\n }\n if (_.isArray(item.joyride.text)) {\n _.forEach(item.joyride.text, function(text) {\n return html += \"

\" + text + \"

\";\n });\n } else {\n html += \"

\" + item.joyride.text + \"

\";\n }\n item.intro = html;\n return item;\n });\n };\n\n return JoyRideService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgJoyRideService\", JoyRideService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Andrey Antukh \n * Copyright (C) 2014-2015 Jesús Espino Garcia \n * Copyright (C) 2014-2015 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: live-announcement.directive.coffee\n */\n\n(function() {\n var LiveAnnouncementDirective;\n\n LiveAnnouncementDirective = function(liveAnnouncementService) {\n var link;\n link = function(scope, el, attrs) {};\n return {\n restrict: \"AE\",\n scope: {},\n controllerAs: 'vm',\n controller: function() {\n this.close = function() {\n return liveAnnouncementService.open = false;\n };\n return Object.defineProperties(this, {\n open: {\n get: function() {\n return liveAnnouncementService.open;\n }\n },\n title: {\n get: function() {\n return liveAnnouncementService.title;\n }\n },\n desc: {\n get: function() {\n return liveAnnouncementService.desc;\n }\n }\n });\n },\n link: link,\n templateUrl: \"components/live-announcement/live-announcement.html\"\n };\n };\n\n LiveAnnouncementDirective.$inject = [\"tgLiveAnnouncementService\"];\n\n angular.module(\"taigaComponents\").directive(\"tgLiveAnnouncement\", LiveAnnouncementDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: notification.service.coffee\n */\n\n(function() {\n var LiveAnnouncementService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n LiveAnnouncementService = (function(superClass) {\n extend(LiveAnnouncementService, superClass);\n\n function LiveAnnouncementService() {\n this.open = false;\n this.title = \"\";\n this.desc = \"\";\n }\n\n LiveAnnouncementService.prototype.show = function(title, desc) {\n this.open = true;\n this.title = title;\n return this.desc = desc;\n };\n\n return LiveAnnouncementService;\n\n })(taiga.Service);\n\n angular.module(\"taigaComponents\").service(\"tgLiveAnnouncementService\", LiveAnnouncementService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project-logo.directive.coffee\n */\n\n(function() {\n var COLORS, IMAGES, LOGOS, ProjectLogoSrcDirective,\n modulo = function(a, b) { return (+a % (b = +b) + b) % b; };\n\n IMAGES = [\"/\" + window._version + \"/images/project-logos/project-logo-01.png\", \"/\" + window._version + \"/images/project-logos/project-logo-02.png\", \"/\" + window._version + \"/images/project-logos/project-logo-03.png\", \"/\" + window._version + \"/images/project-logos/project-logo-04.png\", \"/\" + window._version + \"/images/project-logos/project-logo-05.png\"];\n\n COLORS = [\"rgba( 153, 214, 220, 1 )\", \"rgba( 213, 156, 156, 1 )\", \"rgba( 214, 161, 212, 1 )\", \"rgba( 164, 162, 219, 1 )\", \"rgba( 152, 224, 168, 1 )\"];\n\n LOGOS = _.cartesianProduct(IMAGES, COLORS);\n\n ProjectLogoSrcDirective = function($parse) {\n var _getDefaultProjectLogo, link;\n _getDefaultProjectLogo = function(project) {\n var idx, key, logo;\n key = (project.get(\"slug\")) + \"-\" + (project.get(\"id\"));\n idx = modulo(murmurhash3_32_gc(key, 42), LOGOS.length);\n logo = LOGOS[idx];\n return {\n src: logo[0],\n color: logo[1]\n };\n };\n link = function(scope, el, attrs) {\n scope.$watch(\"project\", function(project) {\n var logo, projectLogo;\n project = Immutable.fromJS(project);\n if (!project) {\n return;\n }\n projectLogo = project.get('logo_big_url');\n if (projectLogo) {\n el.attr(\"src\", projectLogo);\n return el.css('background', \"\");\n } else {\n logo = _getDefaultProjectLogo(project);\n el.attr(\"src\", logo.src);\n return el.css('background', logo.color);\n }\n });\n return scope.$on(\"$destroy\", function() {\n return el.off();\n });\n };\n return {\n link: link,\n scope: {\n project: \"=tgProjectLogoSrc\"\n }\n };\n };\n\n ProjectLogoSrcDirective.$inject = [\"$parse\"];\n\n angular.module(\"taigaComponents\").directive(\"tgProjectLogoSrc\", ProjectLogoSrcDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project-menu.controller.coffee\n */\n\n(function() {\n var ProjectMenuController;\n\n ProjectMenuController = (function() {\n ProjectMenuController.$inject = [\"tgProjectService\", \"tgLightboxFactory\"];\n\n function ProjectMenuController(projectService, lightboxFactory) {\n this.projectService = projectService;\n this.lightboxFactory = lightboxFactory;\n this.project = null;\n this.menu = Immutable.Map();\n }\n\n ProjectMenuController.prototype.show = function() {\n this.project = this.projectService.project;\n this.active = this._getActiveSection();\n this._setVideoConference();\n return this._setMenuPermissions();\n };\n\n ProjectMenuController.prototype.hide = function() {\n this.project = null;\n return this.menu = {};\n };\n\n ProjectMenuController.prototype.search = function() {\n return this.lightboxFactory.create(\"tg-search-box\", {\n \"class\": \"lightbox lightbox-search\"\n });\n };\n\n ProjectMenuController.prototype._setVideoConference = function() {\n var videoconferenceUrl;\n videoconferenceUrl = this._videoConferenceUrl();\n if (videoconferenceUrl) {\n return this.project = this.project.set(\"videoconferenceUrl\", videoconferenceUrl);\n }\n };\n\n ProjectMenuController.prototype._setMenuPermissions = function() {\n this.menu = Immutable.Map({\n backlog: false,\n kanban: false,\n issues: false,\n wiki: false\n });\n if (this.project.get(\"is_backlog_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_us\") !== -1) {\n this.menu = this.menu.set(\"backlog\", true);\n }\n if (this.project.get(\"is_kanban_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_us\") !== -1) {\n this.menu = this.menu.set(\"kanban\", true);\n }\n if (this.project.get(\"is_issues_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_issues\") !== -1) {\n this.menu = this.menu.set(\"issues\", true);\n }\n if (this.project.get(\"is_wiki_activated\") && this.project.get(\"my_permissions\").indexOf(\"view_wiki_pages\") !== -1) {\n return this.menu = this.menu.set(\"wiki\", true);\n }\n };\n\n ProjectMenuController.prototype._getActiveSection = function() {\n var indexBacklog, indexKanban, oldSectionName, sectionName, sectionsBreadcrumb;\n sectionName = this.projectService.section;\n sectionsBreadcrumb = this.projectService.sectionsBreadcrumb;\n indexBacklog = sectionsBreadcrumb.lastIndexOf(\"backlog\");\n indexKanban = sectionsBreadcrumb.lastIndexOf(\"kanban\");\n if (indexBacklog !== -1 || indexKanban !== -1) {\n if (indexKanban === -1 || indexBacklog > indexKanban) {\n oldSectionName = \"backlog\";\n } else {\n oldSectionName = \"kanban\";\n }\n }\n if (sectionName === \"backlog-kanban\") {\n if (oldSectionName === \"backlog\" || oldSectionName === \"kanban\") {\n sectionName = oldSectionName;\n } else if (this.project.get(\"is_backlog_activated\") && !this.project.get(\"is_kanban_activated\")) {\n sectionName = \"backlog\";\n } else if (!this.project.get(\"is_backlog_activated\") && this.project.get(\"is_kanban_activated\")) {\n sectionName = \"kanban\";\n }\n }\n return sectionName;\n };\n\n ProjectMenuController.prototype._videoConferenceUrl = function() {\n var baseUrl, url;\n if (this.project.get(\"videoconferences\") === \"appear-in\") {\n baseUrl = \"https://appear.in/\";\n } else if (this.project.get(\"videoconferences\") === \"talky\") {\n baseUrl = \"https://talky.io/\";\n } else if (this.project.get(\"videoconferences\") === \"jitsi\") {\n baseUrl = \"https://meet.jit.si/\";\n url = this.project.get(\"slug\") + \"-\" + taiga.slugify(this.project.get(\"videoconferences_extra_data\"));\n url = url.replace(/-/g, \"\");\n return baseUrl + url;\n } else if (this.project.get(\"videoconferences\") === \"custom\") {\n return this.project.get(\"videoconferences_extra_data\");\n } else {\n return \"\";\n }\n if (this.project.get(\"videoconferences_extra_data\")) {\n url = this.project.get(\"slug\") + \"-\" + this.project.get(\"videoconferences_extra_data\");\n } else {\n url = this.project.get(\"slug\");\n }\n return baseUrl + url;\n };\n\n return ProjectMenuController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"ProjectMenu\", ProjectMenuController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project-menu.directive.coffee\n */\n\n(function() {\n var ProjectMenuDirective, taiga;\n\n taiga = this.taiga;\n\n ProjectMenuDirective = function(projectService, lightboxFactory) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var projectChange;\n projectChange = function() {\n if (projectService.project) {\n return ctrl.show();\n } else {\n return ctrl.hide();\n }\n };\n scope.$watch((function() {\n return projectService.project;\n }), projectChange);\n scope.vm.fixed = false;\n return $(window).on(\"scroll\", function() {\n var position;\n position = $(window).scrollTop();\n if (position > 100 && scope.vm.fixed === false) {\n scope.vm.fixed = true;\n return scope.$digest();\n } else if (position < 100 && scope.vm.fixed === true) {\n scope.vm.fixed = false;\n return scope.$digest();\n }\n });\n };\n return {\n scope: {},\n controller: \"ProjectMenu\",\n controllerAs: \"vm\",\n templateUrl: \"components/project-menu/project-menu.html\",\n link: link\n };\n };\n\n ProjectMenuDirective.$inject = [\"tgProjectService\", \"tgLightboxFactory\"];\n\n angular.module(\"taigaComponents\").directive(\"tgProjectMenu\", ProjectMenuDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.directive.coffee\n */\n\n(function() {\n var TermsOfServiceAndPrivacyPolicyNoticeDirective;\n\n TermsOfServiceAndPrivacyPolicyNoticeDirective = function($config) {\n var link;\n link = function(scope, el, attrs) {\n scope.privacyPolicyUrl = $config.get(\"privacyPolicyUrl\");\n return scope.termsOfServiceUrl = $config.get(\"termsOfServiceUrl\");\n };\n return {\n restrict: \"AE\",\n scope: {},\n link: link,\n templateUrl: \"components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.html\"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgTermsOfServiceAndPrivacyPolicyNotice\", [\"$tgConfig\", TermsOfServiceAndPrivacyPolicyNoticeDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: vote-button.controller.coffee\n */\n\n(function() {\n var VoteButtonController;\n\n VoteButtonController = (function() {\n VoteButtonController.$inject = [\"tgCurrentUserService\"];\n\n function VoteButtonController(currentUserService) {\n this.currentUserService = currentUserService;\n this.user = this.currentUserService.getUser();\n this.isMouseOver = false;\n this.loading = false;\n }\n\n VoteButtonController.prototype.showTextWhenMouseIsOver = function() {\n return this.isMouseOver = true;\n };\n\n VoteButtonController.prototype.showTextWhenMouseIsLeave = function() {\n return this.isMouseOver = false;\n };\n\n VoteButtonController.prototype.toggleVote = function() {\n var promise;\n this.loading = true;\n if (!this.item.is_voter) {\n promise = this._upvote();\n } else {\n promise = this._downvote();\n }\n promise[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n return promise;\n };\n\n VoteButtonController.prototype._upvote = function() {\n return this.onUpvote().then((function(_this) {\n return function() {\n return _this.showTextWhenMouseIsLeave();\n };\n })(this));\n };\n\n VoteButtonController.prototype._downvote = function() {\n return this.onDownvote();\n };\n\n return VoteButtonController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"VoteButton\", VoteButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: vote-button.directive.coffee\n */\n\n(function() {\n var VoteButtonDirective;\n\n VoteButtonDirective = function() {\n return {\n scope: {},\n controller: \"VoteButton\",\n bindToController: {\n item: \"=\",\n onUpvote: \"=\",\n onDownvote: \"=\"\n },\n controllerAs: \"vm\",\n templateUrl: \"components/vote-button/vote-button.html\"\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgVoteButton\", VoteButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-button.controller.coffee\n */\n\n(function() {\n var WatchButtonController;\n\n WatchButtonController = (function() {\n WatchButtonController.$inject = [\"tgCurrentUserService\", \"$rootScope\"];\n\n function WatchButtonController(currentUserService, rootScope) {\n this.currentUserService = currentUserService;\n this.rootScope = rootScope;\n this.user = this.currentUserService.getUser();\n this.isMouseOver = false;\n this.loading = false;\n }\n\n WatchButtonController.prototype.showTextWhenMouseIsOver = function() {\n return this.isMouseOver = true;\n };\n\n WatchButtonController.prototype.showTextWhenMouseIsLeave = function() {\n return this.isMouseOver = false;\n };\n\n WatchButtonController.prototype.openWatchers = function() {\n return this.rootScope.$broadcast(\"watcher:add\", this.item);\n };\n\n WatchButtonController.prototype.getPerms = function() {\n var name, perms;\n if (!this.item) {\n return \"\";\n }\n name = this.item._name;\n perms = {\n userstories: 'modify_us',\n issues: 'modify_issue',\n tasks: 'modify_task'\n };\n return perms[name];\n };\n\n WatchButtonController.prototype.toggleWatch = function() {\n var promise;\n this.loading = true;\n if (!this.item.is_watcher) {\n promise = this._watch();\n } else {\n promise = this._unwatch();\n }\n promise[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n return promise;\n };\n\n WatchButtonController.prototype._watch = function() {\n return this.onWatch().then((function(_this) {\n return function() {\n return _this.showTextWhenMouseIsLeave();\n };\n })(this));\n };\n\n WatchButtonController.prototype._unwatch = function() {\n return this.onUnwatch();\n };\n\n return WatchButtonController;\n\n })();\n\n angular.module(\"taigaComponents\").controller(\"WatchButton\", WatchButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-button.directive.coffee\n */\n\n(function() {\n var WatchButtonDirective;\n\n WatchButtonDirective = function() {\n return {\n scope: {},\n controller: \"WatchButton\",\n bindToController: {\n item: \"=\",\n onWatch: \"=\",\n onUnwatch: \"=\"\n },\n controllerAs: \"vm\",\n templateUrl: function(item, attributes) {\n return \"components/watch-button/watch-button-\" + attributes.environment + \".html\";\n }\n };\n };\n\n angular.module(\"taigaComponents\").directive(\"tgWatchButton\", WatchButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-home-order-by.controller.coffee\n */\n\n(function() {\n var DiscoverHomeOrderByController;\n\n DiscoverHomeOrderByController = (function() {\n DiscoverHomeOrderByController.$inject = ['$translate'];\n\n function DiscoverHomeOrderByController(translate) {\n this.translate = translate;\n this.is_open = false;\n this.texts = {\n week: this.translate.instant('DISCOVER.FILTERS.WEEK'),\n month: this.translate.instant('DISCOVER.FILTERS.MONTH'),\n year: this.translate.instant('DISCOVER.FILTERS.YEAR'),\n all: this.translate.instant('DISCOVER.FILTERS.ALL_TIME')\n };\n }\n\n DiscoverHomeOrderByController.prototype.currentText = function() {\n return this.texts[this.currentOrderBy];\n };\n\n DiscoverHomeOrderByController.prototype.open = function() {\n return this.is_open = true;\n };\n\n DiscoverHomeOrderByController.prototype.close = function() {\n return this.is_open = false;\n };\n\n DiscoverHomeOrderByController.prototype.orderBy = function(type) {\n this.currentOrderBy = type;\n this.is_open = false;\n return this.onChange({\n orderBy: this.currentOrderBy\n });\n };\n\n return DiscoverHomeOrderByController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverHomeOrderBy\", DiscoverHomeOrderByController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-home-order-by.directive.coffee\n */\n\n(function() {\n var DiscoverHomeOrderByDirective;\n\n DiscoverHomeOrderByDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n controller: \"DiscoverHomeOrderBy\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"discover/components/discover-home-order-by/discover-home-order-by.html\",\n scope: {\n currentOrderBy: \"=orderBy\",\n onChange: \"&\"\n },\n link: link\n };\n };\n\n DiscoverHomeOrderByDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgDiscoverHomeOrderBy\", DiscoverHomeOrderByDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search-bar.controller.coffee\n */\n\n(function() {\n var DiscoverSearchBarController;\n\n DiscoverSearchBarController = (function() {\n DiscoverSearchBarController.$inject = ['tgDiscoverProjectsService'];\n\n function DiscoverSearchBarController(discoverProjectsService) {\n this.discoverProjectsService = discoverProjectsService;\n taiga.defineImmutableProperty(this, 'projects', (function(_this) {\n return function() {\n return _this.discoverProjectsService.projectsCount;\n };\n })(this));\n this.discoverProjectsService.fetchStats();\n }\n\n DiscoverSearchBarController.prototype.selectFilter = function(filter) {\n return this.onChange({\n filter: filter,\n q: this.q\n });\n };\n\n DiscoverSearchBarController.prototype.submitFilter = function() {\n return this.onChange({\n filter: this.filter,\n q: this.q\n });\n };\n\n return DiscoverSearchBarController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverSearchBar\", DiscoverSearchBarController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search.directive.coffee\n */\n\n(function() {\n var DiscoverSearchBarDirective;\n\n DiscoverSearchBarDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {};\n return {\n controller: \"DiscoverSearchBar\",\n controllerAs: \"vm\",\n templateUrl: 'discover/components/discover-search-bar/discover-search-bar.html',\n bindToController: true,\n scope: {\n q: \"=\",\n filter: \"=\",\n onChange: \"&\"\n },\n link: link\n };\n };\n\n DiscoverSearchBarDirective.$inject = [];\n\n angular.module('taigaDiscover').directive('tgDiscoverSearchBar', DiscoverSearchBarDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search-list-header.controller.coffee\n */\n\n(function() {\n var DiscoverSearchListHeaderController;\n\n DiscoverSearchListHeaderController = (function() {\n DiscoverSearchListHeaderController.$inject = [];\n\n function DiscoverSearchListHeaderController() {\n this.like_is_open = this.orderBy.indexOf('-total_fans') === 0;\n this.activity_is_open = this.orderBy.indexOf('-total_activity') === 0;\n }\n\n DiscoverSearchListHeaderController.prototype.openLike = function() {\n this.like_is_open = true;\n this.activity_is_open = false;\n return this.setOrderBy('-total_fans_last_week');\n };\n\n DiscoverSearchListHeaderController.prototype.openActivity = function() {\n this.activity_is_open = true;\n this.like_is_open = false;\n return this.setOrderBy('-total_activity_last_week');\n };\n\n DiscoverSearchListHeaderController.prototype.setOrderBy = function(type) {\n if (type == null) {\n type = '';\n }\n if (!type) {\n this.like_is_open = false;\n this.activity_is_open = false;\n }\n return this.onChange({\n orderBy: type\n });\n };\n\n return DiscoverSearchListHeaderController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverSearchListHeader\", DiscoverSearchListHeaderController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search-list-header.directive.coffee\n */\n\n(function() {\n var DiscoverSearchListHeaderDirective;\n\n DiscoverSearchListHeaderDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n controller: \"DiscoverSearchListHeader\",\n controllerAs: \"vm\",\n bindToController: true,\n templateUrl: \"discover/components/discover-search-list-header/discover-search-list-header.html\",\n scope: {\n onChange: \"&\",\n orderBy: \"=\"\n },\n link: link\n };\n };\n\n DiscoverSearchListHeaderDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgDiscoverSearchListHeader\", DiscoverSearchListHeaderDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: featured-projects.controller.coffee\n */\n\n(function() {\n var FeaturedProjectsController;\n\n FeaturedProjectsController = (function() {\n FeaturedProjectsController.$inject = [\"tgDiscoverProjectsService\"];\n\n function FeaturedProjectsController(discoverProjectsService) {\n this.discoverProjectsService = discoverProjectsService;\n taiga.defineImmutableProperty(this, \"featured\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.featured;\n };\n })(this));\n this.discoverProjectsService.fetchFeatured();\n }\n\n return FeaturedProjectsController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"FeaturedProjects\", FeaturedProjectsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: featured-projects.directive.coffee\n */\n\n(function() {\n var FeaturedProjectsDirective;\n\n FeaturedProjectsDirective = function() {\n var link;\n link = function(scope, el, attrs) {};\n return {\n controller: \"FeaturedProjects\",\n controllerAs: \"vm\",\n templateUrl: \"discover/components/featured-projects/featured-projects.html\",\n scope: {},\n link: link\n };\n };\n\n FeaturedProjectsDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgFeaturedProjects\", FeaturedProjectsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: highlighted.directive.coffee\n */\n\n(function() {\n var HighlightedDirective;\n\n HighlightedDirective = function() {\n return {\n templateUrl: \"discover/components/highlighted/highlighted.html\",\n scope: {\n loading: \"=\",\n highlighted: \"=\",\n orderBy: \"=\"\n }\n };\n };\n\n HighlightedDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgHighlighted\", HighlightedDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: most-active.controller.coffee\n */\n\n(function() {\n var MostActiveController;\n\n MostActiveController = (function() {\n MostActiveController.$inject = [\"tgDiscoverProjectsService\"];\n\n function MostActiveController(discoverProjectsService) {\n this.discoverProjectsService = discoverProjectsService;\n taiga.defineImmutableProperty(this, \"highlighted\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.mostActive;\n };\n })(this));\n this.currentOrderBy = 'week';\n this.order_by = this.getOrderBy();\n }\n\n MostActiveController.prototype.fetch = function() {\n this.loading = true;\n this.order_by = this.getOrderBy();\n return this.discoverProjectsService.fetchMostActive({\n order_by: this.order_by\n }).then((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n };\n\n MostActiveController.prototype.orderBy = function(type) {\n this.currentOrderBy = type;\n return this.fetch();\n };\n\n MostActiveController.prototype.getOrderBy = function(type) {\n if (this.currentOrderBy === 'all') {\n return '-total_activity';\n } else {\n return '-total_activity_last_' + this.currentOrderBy;\n }\n };\n\n return MostActiveController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"MostActive\", MostActiveController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: most-active.directive.coffee\n */\n\n(function() {\n var MostActiveDirective;\n\n MostActiveDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.fetch();\n };\n return {\n controller: \"MostActive\",\n controllerAs: \"vm\",\n templateUrl: \"discover/components/most-active/most-active.html\",\n scope: {},\n link: link\n };\n };\n\n MostActiveDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgMostActive\", MostActiveDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: msot-liked.controller.coffee\n */\n\n(function() {\n var MostLikedController;\n\n MostLikedController = (function() {\n MostLikedController.$inject = [\"tgDiscoverProjectsService\"];\n\n function MostLikedController(discoverProjectsService) {\n this.discoverProjectsService = discoverProjectsService;\n taiga.defineImmutableProperty(this, \"highlighted\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.mostLiked;\n };\n })(this));\n this.currentOrderBy = 'week';\n this.order_by = this.getOrderBy();\n }\n\n MostLikedController.prototype.fetch = function() {\n this.loading = true;\n this.order_by = this.getOrderBy();\n return this.discoverProjectsService.fetchMostLiked({\n order_by: this.order_by\n }).then((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n };\n\n MostLikedController.prototype.orderBy = function(type) {\n this.currentOrderBy = type;\n return this.fetch();\n };\n\n MostLikedController.prototype.getOrderBy = function() {\n if (this.currentOrderBy === 'all') {\n return '-total_fans';\n } else {\n return '-total_fans_last_' + this.currentOrderBy;\n }\n };\n\n return MostLikedController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"MostLiked\", MostLikedController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: most-liked.directive.coffee\n */\n\n(function() {\n var MostLikedDirective;\n\n MostLikedDirective = function() {\n var link;\n link = function(scope, el, attrs, ctrl) {\n return ctrl.fetch();\n };\n return {\n controller: \"MostLiked\",\n controllerAs: \"vm\",\n templateUrl: \"discover/components/most-liked/most-liked.html\",\n scope: {},\n link: link\n };\n };\n\n MostLikedDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgMostLiked\", MostLikedDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-home.controller.coffee\n */\n\n(function() {\n var DiscoverHomeController;\n\n DiscoverHomeController = (function() {\n DiscoverHomeController.$inject = ['$tgLocation', '$tgNavUrls', 'tgAppMetaService', '$translate'];\n\n function DiscoverHomeController(location, navUrls, appMetaService, translate) {\n var description, title;\n this.location = location;\n this.navUrls = navUrls;\n this.appMetaService = appMetaService;\n this.translate = translate;\n title = this.translate.instant(\"DISCOVER.PAGE_TITLE\");\n description = this.translate.instant(\"DISCOVER.PAGE_DESCRIPTION\");\n this.appMetaService.setAll(title, description);\n }\n\n DiscoverHomeController.prototype.onSubmit = function(q) {\n var url;\n url = this.navUrls.resolve('discover-search');\n return this.location.search('text', q).path(url);\n };\n\n return DiscoverHomeController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverHome\", DiscoverHomeController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search.controller.coffee\n */\n\n(function() {\n var DiscoverSearchController;\n\n DiscoverSearchController = (function() {\n DiscoverSearchController.$inject = ['$routeParams', 'tgDiscoverProjectsService', '$route', 'tgAppMetaService', '$translate'];\n\n function DiscoverSearchController(routeParams, discoverProjectsService, route, appMetaService, translate) {\n var description, title;\n this.routeParams = routeParams;\n this.discoverProjectsService = discoverProjectsService;\n this.route = route;\n this.appMetaService = appMetaService;\n this.translate = translate;\n this.page = 1;\n taiga.defineImmutableProperty(this, \"searchResult\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.searchResult;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"nextSearchPage\", (function(_this) {\n return function() {\n return _this.discoverProjectsService.nextSearchPage;\n };\n })(this));\n this.q = this.routeParams.text;\n this.filter = this.routeParams.filter || 'all';\n this.orderBy = this.routeParams['order_by'] || '';\n this.loadingGlobal = false;\n this.loadingList = false;\n this.loadingPagination = false;\n title = this.translate.instant(\"DISCOVER.SEARCH.PAGE_TITLE\");\n description = this.translate.instant(\"DISCOVER.SEARCH.PAGE_DESCRIPTION\");\n this.appMetaService.setAll(title, description);\n }\n\n DiscoverSearchController.prototype.fetch = function() {\n this.page = 1;\n this.discoverProjectsService.resetSearchList();\n return this.search();\n };\n\n DiscoverSearchController.prototype.fetchByGlobalSearch = function() {\n if (this.loadingGlobal) {\n return;\n }\n this.loadingGlobal = true;\n return this.fetch().then((function(_this) {\n return function() {\n return _this.loadingGlobal = false;\n };\n })(this));\n };\n\n DiscoverSearchController.prototype.fetchByOrderBy = function() {\n if (this.loadingList) {\n return;\n }\n this.loadingList = true;\n return this.fetch().then((function(_this) {\n return function() {\n return _this.loadingList = false;\n };\n })(this));\n };\n\n DiscoverSearchController.prototype.showMore = function() {\n if (this.loadingPagination) {\n return;\n }\n this.loadingPagination = true;\n this.page++;\n return this.search().then((function(_this) {\n return function() {\n return _this.loadingPagination = false;\n };\n })(this));\n };\n\n DiscoverSearchController.prototype.search = function() {\n var filter, params;\n filter = this.getFilter();\n params = {\n page: this.page,\n q: this.q,\n order_by: this.orderBy\n };\n _.assign(params, filter);\n return this.discoverProjectsService.fetchSearch(params);\n };\n\n DiscoverSearchController.prototype.getFilter = function() {\n if (this.filter === 'people') {\n return {\n is_looking_for_people: true\n };\n } else if (this.filter === 'scrum') {\n return {\n is_backlog_activated: true\n };\n } else if (this.filter === 'kanban') {\n return {\n is_kanban_activated: true\n };\n }\n return {};\n };\n\n DiscoverSearchController.prototype.onChangeFilter = function(filter, q) {\n this.filter = filter;\n this.q = q;\n this.route.updateParams({\n filter: this.filter,\n text: this.q\n });\n return this.fetchByGlobalSearch();\n };\n\n DiscoverSearchController.prototype.onChangeOrder = function(orderBy) {\n this.orderBy = orderBy;\n this.route.updateParams({\n order_by: orderBy\n });\n return this.fetchByOrderBy();\n };\n\n return DiscoverSearchController;\n\n })();\n\n angular.module(\"taigaDiscover\").controller(\"DiscoverSearch\", DiscoverSearchController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-search.directive.coffee\n */\n\n(function() {\n var DiscoverSearchDirective;\n\n DiscoverSearchDirective = function() {\n var link;\n link = function(scope, element, attrs, ctrl) {\n return ctrl.fetch();\n };\n return {\n controller: \"DiscoverSearch\",\n controllerAs: \"vm\",\n link: link\n };\n };\n\n DiscoverSearchDirective.$inject = [];\n\n angular.module(\"taigaDiscover\").directive(\"tgDiscoverSearch\", DiscoverSearchDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: discover-projects.service.coffee\n */\n\n(function() {\n var DiscoverProjectsService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n DiscoverProjectsService = (function(superClass) {\n extend(DiscoverProjectsService, superClass);\n\n DiscoverProjectsService.$inject = [\"tgResources\", \"tgProjectsService\"];\n\n function DiscoverProjectsService(rs, projectsService) {\n this.rs = rs;\n this.projectsService = projectsService;\n this._mostLiked = Immutable.List();\n this._mostActive = Immutable.List();\n this._featured = Immutable.List();\n this._searchResult = Immutable.List();\n this._projectsCount = 0;\n this.decorate = this.projectsService._decorate.bind(this.projectsService);\n taiga.defineImmutableProperty(this, \"mostLiked\", (function(_this) {\n return function() {\n return _this._mostLiked;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"mostActive\", (function(_this) {\n return function() {\n return _this._mostActive;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"featured\", (function(_this) {\n return function() {\n return _this._featured;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"searchResult\", (function(_this) {\n return function() {\n return _this._searchResult;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"nextSearchPage\", (function(_this) {\n return function() {\n return _this._nextSearchPage;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"projectsCount\", (function(_this) {\n return function() {\n return _this._projectsCount;\n };\n })(this));\n }\n\n DiscoverProjectsService.prototype.fetchMostLiked = function(params) {\n return this.rs.projects.getProjects(params, false).then((function(_this) {\n return function(result) {\n var data, projects;\n data = result.data.slice(0, 5);\n projects = Immutable.fromJS(data);\n projects = projects.map(_this.decorate);\n return _this._mostLiked = projects;\n };\n })(this));\n };\n\n DiscoverProjectsService.prototype.fetchMostActive = function(params) {\n return this.rs.projects.getProjects(params, false).then((function(_this) {\n return function(result) {\n var data, projects;\n data = result.data.slice(0, 5);\n projects = Immutable.fromJS(data);\n projects = projects.map(_this.decorate);\n return _this._mostActive = projects;\n };\n })(this));\n };\n\n DiscoverProjectsService.prototype.fetchFeatured = function() {\n var params;\n params = {\n is_featured: true\n };\n return this.rs.projects.getProjects(params, false).then((function(_this) {\n return function(result) {\n var data, projects;\n data = result.data.slice(0, 4);\n projects = Immutable.fromJS(data);\n projects = projects.map(_this.decorate);\n return _this._featured = projects;\n };\n })(this));\n };\n\n DiscoverProjectsService.prototype.resetSearchList = function() {\n return this._searchResult = Immutable.List();\n };\n\n DiscoverProjectsService.prototype.fetchStats = function() {\n return this.rs.stats.discover().then((function(_this) {\n return function(discover) {\n return _this._projectsCount = discover.getIn(['projects', 'total']);\n };\n })(this));\n };\n\n DiscoverProjectsService.prototype.fetchSearch = function(params) {\n return this.rs.projects.getProjects(params).then((function(_this) {\n return function(result) {\n var projects;\n _this._nextSearchPage = !!result.headers('X-Pagination-Next');\n projects = Immutable.fromJS(result.data);\n projects = projects.map(_this.decorate);\n return _this._searchResult = _this._searchResult.concat(projects);\n };\n })(this));\n };\n\n return DiscoverProjectsService;\n\n })(taiga.Service);\n\n angular.module(\"taigaDiscover\").service(\"tgDiscoverProjectsService\", DiscoverProjectsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: external-app.controller.coffee\n */\n\n(function() {\n var ExternalAppController, taiga,\n bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; },\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n ExternalAppController = (function(superClass) {\n extend(ExternalAppController, superClass);\n\n ExternalAppController.$inject = [\"$routeParams\", \"tgExternalAppsService\", \"$window\", \"tgCurrentUserService\", \"$location\", \"$tgNavUrls\", \"tgXhrErrorService\", \"tgLoader\"];\n\n function ExternalAppController(routeParams, externalAppsService, window, currentUserService, location, navUrls, xhrError, loader) {\n var loginUrl, nextUrl;\n this.routeParams = routeParams;\n this.externalAppsService = externalAppsService;\n this.window = window;\n this.currentUserService = currentUserService;\n this.location = location;\n this.navUrls = navUrls;\n this.xhrError = xhrError;\n this.loader = loader;\n this.createApplicationToken = bind(this.createApplicationToken, this);\n this._getApplicationToken = bind(this._getApplicationToken, this);\n this._redirect = bind(this._redirect, this);\n this.loader.start(false);\n this._applicationId = this.routeParams.application;\n this._state = this.routeParams.state;\n this._getApplicationToken();\n this._user = this.currentUserService.getUser();\n this._application = null;\n nextUrl = encodeURIComponent(this.location.url());\n loginUrl = this.navUrls.resolve(\"login\");\n this.loginWithAnotherUserUrl = loginUrl + \"?next=\" + nextUrl;\n taiga.defineImmutableProperty(this, \"user\", (function(_this) {\n return function() {\n return _this._user;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"application\", (function(_this) {\n return function() {\n return _this._application;\n };\n })(this));\n }\n\n ExternalAppController.prototype._redirect = function(applicationToken) {\n var nextUrl;\n nextUrl = applicationToken.get(\"next_url\");\n return this.window.open(nextUrl, \"_self\");\n };\n\n ExternalAppController.prototype._getApplicationToken = function() {\n return this.externalAppsService.getApplicationToken(this._applicationId, this._state).then((function(_this) {\n return function(data) {\n _this._application = data.get(\"application\");\n if (data.get(\"auth_code\")) {\n return _this._redirect(data);\n } else {\n return _this.loader.pageLoaded();\n }\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n _this.loader.pageLoaded();\n return _this.xhrError.response(xhr);\n };\n })(this));\n };\n\n ExternalAppController.prototype.cancel = function() {\n return this.window.history.back();\n };\n\n ExternalAppController.prototype.createApplicationToken = function() {\n return this.externalAppsService.authorizeApplicationToken(this._applicationId, this._state).then((function(_this) {\n return function(data) {\n return _this._redirect(data);\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n return _this.xhrError.response(xhr);\n };\n })(this));\n };\n\n return ExternalAppController;\n\n })(taiga.Controller);\n\n angular.module(\"taigaExternalApps\").controller(\"ExternalApp\", ExternalAppController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: external-app.service.coffee\n */\n\n(function() {\n var ExternalAppsService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n ExternalAppsService = (function(superClass) {\n extend(ExternalAppsService, superClass);\n\n ExternalAppsService.$inject = [\"tgResources\"];\n\n function ExternalAppsService(rs) {\n this.rs = rs;\n }\n\n ExternalAppsService.prototype.getApplicationToken = function(applicationId, state) {\n return this.rs.externalapps.getApplicationToken(applicationId, state);\n };\n\n ExternalAppsService.prototype.authorizeApplicationToken = function(applicationId, state) {\n return this.rs.externalapps.authorizeApplicationToken(applicationId, state);\n };\n\n return ExternalAppsService;\n\n })(taiga.Service);\n\n angular.module(\"taigaExternalApps\").service(\"tgExternalAppsService\", ExternalAppsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: feedback.service.coffee\n */\n\n(function() {\n var FeedbackService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n FeedbackService = (function(superClass) {\n extend(FeedbackService, superClass);\n\n FeedbackService.$inject = [\"tgLightboxFactory\"];\n\n function FeedbackService(lightboxFactory) {\n this.lightboxFactory = lightboxFactory;\n }\n\n FeedbackService.prototype.sendFeedback = function() {\n return this.lightboxFactory.create(\"tg-lb-feedback\", {\n \"class\": \"lightbox lightbox-feedback lightbox-generic-form\"\n });\n };\n\n return FeedbackService;\n\n })(taiga.Service);\n\n angular.module(\"taigaFeedback\").service(\"tgFeedbackService\", FeedbackService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: duty.directive.coffee\n */\n\n(function() {\n var DutyDirective;\n\n DutyDirective = function(navurls, $translate) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n scope.vm.duty = scope.duty;\n return scope.vm.getDutyType = function() {\n if (scope.vm.duty) {\n if (scope.vm.duty.get('_name') === \"userstories\") {\n return $translate.instant(\"COMMON.USER_STORY\");\n }\n if (scope.vm.duty.get('_name') === \"tasks\") {\n return $translate.instant(\"COMMON.TASK\");\n }\n if (scope.vm.duty.get('_name') === \"issues\") {\n return $translate.instant(\"COMMON.ISSUE\");\n }\n }\n };\n };\n return {\n templateUrl: \"home/duties/duty.html\",\n scope: {\n \"duty\": \"=tgDuty\"\n },\n link: link\n };\n };\n\n DutyDirective.$inject = [\"$tgNavUrls\", \"$translate\"];\n\n angular.module(\"taigaHome\").directive(\"tgDuty\", DutyDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: home.controller.coffee\n */\n\n(function() {\n var HomeController;\n\n HomeController = (function() {\n HomeController.$inject = [\"tgCurrentUserService\", \"$location\", \"$tgNavUrls\"];\n\n function HomeController(currentUserService, location, navUrls) {\n this.currentUserService = currentUserService;\n this.location = location;\n this.navUrls = navUrls;\n if (!this.currentUserService.getUser()) {\n this.location.path(this.navUrls.resolve(\"discover\"));\n }\n }\n\n return HomeController;\n\n })();\n\n angular.module(\"taigaHome\").controller(\"Home\", HomeController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: home.service.coffee\n */\n\n(function() {\n var HomeService, groupBy,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n groupBy = this.taiga.groupBy;\n\n HomeService = (function(superClass) {\n extend(HomeService, superClass);\n\n HomeService.$inject = [\"$tgNavUrls\", \"tgResources\", \"tgProjectsService\"];\n\n function HomeService(navurls, rs, projectsService) {\n this.navurls = navurls;\n this.rs = rs;\n this.projectsService = projectsService;\n }\n\n HomeService.prototype._attachProjectInfoToWorkInProgress = function(workInProgress, projectsById) {\n var _attachProjectInfoToDuty, _duties, assignedTo, watching;\n _attachProjectInfoToDuty = (function(_this) {\n return function(duty, objType) {\n var ctx, project, url;\n project = projectsById.get(String(duty.get('project')));\n ctx = {\n project: project.get('slug'),\n ref: duty.get('ref')\n };\n url = _this.navurls.resolve(\"project-\" + objType + \"-detail\", ctx);\n duty = duty.set('url', url);\n duty = duty.set('projectName', project.get('name'));\n duty = duty.set(\"_name\", objType);\n return duty;\n };\n })(this);\n assignedTo = workInProgress.get(\"assignedTo\");\n if (assignedTo.get(\"userStories\")) {\n _duties = assignedTo.get(\"userStories\").map(function(duty) {\n return _attachProjectInfoToDuty(duty, \"userstories\");\n });\n assignedTo = assignedTo.set(\"userStories\", _duties);\n }\n if (assignedTo.get(\"tasks\")) {\n _duties = assignedTo.get(\"tasks\").map(function(duty) {\n return _attachProjectInfoToDuty(duty, \"tasks\");\n });\n assignedTo = assignedTo.set(\"tasks\", _duties);\n }\n if (assignedTo.get(\"issues\")) {\n _duties = assignedTo.get(\"issues\").map(function(duty) {\n return _attachProjectInfoToDuty(duty, \"issues\");\n });\n assignedTo = assignedTo.set(\"issues\", _duties);\n }\n watching = workInProgress.get(\"watching\");\n if (watching.get(\"userStories\")) {\n _duties = watching.get(\"userStories\").filter(function(duty) {\n return !!projectsById.get(String(duty.get('project')));\n });\n _duties = _duties.map(function(duty) {\n return _attachProjectInfoToDuty(duty, \"userstories\");\n });\n watching = watching.set(\"userStories\", _duties);\n }\n if (watching.get(\"tasks\")) {\n _duties = watching.get(\"tasks\").filter(function(duty) {\n return !!projectsById.get(String(duty.get('project')));\n });\n _duties = _duties.map(function(duty) {\n return _attachProjectInfoToDuty(duty, \"tasks\");\n });\n watching = watching.set(\"tasks\", _duties);\n }\n if (watching.get(\"issues\")) {\n _duties = watching.get(\"issues\").filter(function(duty) {\n return !!projectsById.get(String(duty.get('project')));\n });\n _duties = _duties.map(function(duty) {\n return _attachProjectInfoToDuty(duty, \"issues\");\n });\n watching = watching.set(\"issues\", _duties);\n }\n workInProgress = workInProgress.set(\"assignedTo\", assignedTo);\n return workInProgress = workInProgress.set(\"watching\", watching);\n };\n\n HomeService.prototype.getWorkInProgress = function(userId) {\n var assignedIssuesPromise, assignedTasksPromise, assignedTo, assignedUserStoriesPromise, params, params_us, projectsById, projectsPromise, watching, watchingIssuesPromise, watchingTasksPromise, watchingUserStoriesPromise, workInProgress;\n projectsById = Immutable.Map();\n projectsPromise = this.projectsService.getProjectsByUserId(userId).then(function(projects) {\n return projectsById = Immutable.fromJS(groupBy(projects.toJS(), function(p) {\n return p.id;\n }));\n });\n assignedTo = Immutable.Map();\n params = {\n status__is_closed: false,\n assigned_to: userId\n };\n params_us = {\n is_closed: false,\n assigned_to: userId\n };\n assignedUserStoriesPromise = this.rs.userstories.listInAllProjects(params_us).then(function(userstories) {\n return assignedTo = assignedTo.set(\"userStories\", userstories);\n });\n assignedTasksPromise = this.rs.tasks.listInAllProjects(params).then(function(tasks) {\n return assignedTo = assignedTo.set(\"tasks\", tasks);\n });\n assignedIssuesPromise = this.rs.issues.listInAllProjects(params).then(function(issues) {\n return assignedTo = assignedTo.set(\"issues\", issues);\n });\n params = {\n status__is_closed: false,\n watchers: userId\n };\n params_us = {\n is_closed: false,\n watchers: userId\n };\n watching = Immutable.Map();\n watchingUserStoriesPromise = this.rs.userstories.listInAllProjects(params_us).then(function(userstories) {\n return watching = watching.set(\"userStories\", userstories);\n });\n watchingTasksPromise = this.rs.tasks.listInAllProjects(params).then(function(tasks) {\n return watching = watching.set(\"tasks\", tasks);\n });\n watchingIssuesPromise = this.rs.issues.listInAllProjects(params).then(function(issues) {\n return watching = watching.set(\"issues\", issues);\n });\n workInProgress = Immutable.Map();\n return Promise.all([projectsPromise, assignedUserStoriesPromise, assignedTasksPromise, assignedIssuesPromise, watchingUserStoriesPromise, watchingTasksPromise, watchingIssuesPromise]).then((function(_this) {\n return function() {\n workInProgress = workInProgress.set(\"assignedTo\", assignedTo);\n workInProgress = workInProgress.set(\"watching\", watching);\n workInProgress = _this._attachProjectInfoToWorkInProgress(workInProgress, projectsById);\n return workInProgress;\n };\n })(this));\n };\n\n return HomeService;\n\n })(taiga.Service);\n\n angular.module(\"taigaHome\").service(\"tgHomeService\", HomeService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: home-project-list.directive.coffee\n */\n\n(function() {\n var HomeProjectListDirective;\n\n HomeProjectListDirective = function(currentUserService, projectsService) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n taiga.defineImmutableProperty(scope.vm, \"projects\", function() {\n return currentUserService.projects.get(\"recents\");\n });\n return scope.vm.newProject = function() {\n return projectsService.newProject();\n };\n };\n directive = {\n templateUrl: \"home/projects/home-project-list.html\",\n scope: {},\n link: link\n };\n return directive;\n };\n\n HomeProjectListDirective.$inject = [\"tgCurrentUserService\", \"tgProjectsService\"];\n\n angular.module(\"taigaHome\").directive(\"tgHomeProjectList\", HomeProjectListDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: working-on.controller.coffee\n */\n\n(function() {\n var WorkingOnController;\n\n WorkingOnController = (function() {\n WorkingOnController.$inject = [\"tgHomeService\"];\n\n function WorkingOnController(homeService) {\n this.homeService = homeService;\n this.assignedTo = Immutable.Map();\n this.watching = Immutable.Map();\n }\n\n WorkingOnController.prototype._setAssignedTo = function(workInProgress) {\n var issues, tasks, userStories;\n userStories = workInProgress.get(\"assignedTo\").get(\"userStories\");\n tasks = workInProgress.get(\"assignedTo\").get(\"tasks\");\n issues = workInProgress.get(\"assignedTo\").get(\"issues\");\n this.assignedTo = userStories.concat(tasks).concat(issues);\n if (this.assignedTo.size > 0) {\n return this.assignedTo = this.assignedTo.sortBy(function(elem) {\n return elem.get(\"modified_date\");\n }).reverse();\n }\n };\n\n WorkingOnController.prototype._setWatching = function(workInProgress) {\n var issues, tasks, userStories;\n userStories = workInProgress.get(\"watching\").get(\"userStories\");\n tasks = workInProgress.get(\"watching\").get(\"tasks\");\n issues = workInProgress.get(\"watching\").get(\"issues\");\n this.watching = userStories.concat(tasks).concat(issues);\n if (this.watching.size > 0) {\n return this.watching = this.watching.sortBy(function(elem) {\n return elem.get(\"modified_date\");\n }).reverse();\n }\n };\n\n WorkingOnController.prototype.getWorkInProgress = function(userId) {\n return this.homeService.getWorkInProgress(userId).then((function(_this) {\n return function(workInProgress) {\n _this._setAssignedTo(workInProgress);\n return _this._setWatching(workInProgress);\n };\n })(this));\n };\n\n return WorkingOnController;\n\n })();\n\n angular.module(\"taigaHome\").controller(\"WorkingOn\", WorkingOnController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: working-on.directive.coffee\n */\n\n(function() {\n var WorkingOnDirective;\n\n WorkingOnDirective = function(homeService, currentUserService) {\n var link;\n link = function(scope, el, attrs, ctrl) {\n var user, userId;\n user = currentUserService.getUser();\n if (user) {\n userId = user.get(\"id\");\n return ctrl.getWorkInProgress(userId);\n }\n };\n return {\n controller: \"WorkingOn\",\n controllerAs: \"vm\",\n templateUrl: \"home/working-on/working-on.html\",\n scope: {},\n link: link\n };\n };\n\n WorkingOnDirective.$inject = [\"tgHomeService\", \"tgCurrentUserService\"];\n\n angular.module(\"taigaHome\").directive(\"tgWorkingOn\", WorkingOnDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: dropdown-project-list.directive.coffee\n */\n\n(function() {\n var DropdownProjectListDirective;\n\n DropdownProjectListDirective = function(currentUserService, projectsService) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n taiga.defineImmutableProperty(scope.vm, \"projects\", function() {\n return currentUserService.projects.get(\"recents\");\n });\n return scope.vm.newProject = function() {\n return projectsService.newProject();\n };\n };\n directive = {\n templateUrl: \"navigation-bar/dropdown-project-list/dropdown-project-list.html\",\n scope: {},\n link: link\n };\n return directive;\n };\n\n DropdownProjectListDirective.$inject = [\"tgCurrentUserService\", \"tgProjectsService\"];\n\n angular.module(\"taigaNavigationBar\").directive(\"tgDropdownProjectList\", DropdownProjectListDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: dropdown-user.directive.coffee\n */\n\n(function() {\n var DropdownUserDirective;\n\n DropdownUserDirective = function(authService, configService, locationService, navUrlsService, feedbackService) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n scope.vm.isFeedbackEnabled = configService.get(\"feedbackEnabled\");\n taiga.defineImmutableProperty(scope.vm, \"user\", function() {\n return authService.userData;\n });\n scope.vm.logout = function() {\n authService.logout();\n locationService.url(navUrlsService.resolve(\"discover\"));\n return locationService.search({});\n };\n return scope.vm.sendFeedback = function() {\n return feedbackService.sendFeedback();\n };\n };\n directive = {\n templateUrl: \"navigation-bar/dropdown-user/dropdown-user.html\",\n scope: {},\n link: link\n };\n return directive;\n };\n\n DropdownUserDirective.$inject = [\"$tgAuth\", \"$tgConfig\", \"$tgLocation\", \"$tgNavUrls\", \"tgFeedbackService\"];\n\n angular.module(\"taigaNavigationBar\").directive(\"tgDropdownUser\", DropdownUserDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: navigation-bar.directive.coffee\n */\n\n(function() {\n var NavigationBarDirective;\n\n NavigationBarDirective = function(currentUserService, navigationBarService, locationService, navUrlsService) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n scope.vm = {};\n scope.$on(\"$routeChangeSuccess\", function() {\n if (locationService.path() === \"/\") {\n return scope.vm.active = true;\n } else {\n return scope.vm.active = false;\n }\n });\n taiga.defineImmutableProperty(scope.vm, \"projects\", function() {\n return currentUserService.projects.get(\"recents\");\n });\n taiga.defineImmutableProperty(scope.vm, \"isAuthenticated\", function() {\n return currentUserService.isAuthenticated();\n });\n taiga.defineImmutableProperty(scope.vm, \"isEnabledHeader\", function() {\n return navigationBarService.isEnabledHeader();\n });\n scope.vm.login = function() {\n var nextUrl;\n nextUrl = encodeURIComponent(locationService.url());\n locationService.url(navUrlsService.resolve(\"login\"));\n return locationService.search({\n next: nextUrl\n });\n };\n return scope.vm.register = function() {\n var nextUrl;\n nextUrl = encodeURIComponent(locationService.url());\n locationService.url(navUrlsService.resolve(\"register\"));\n return locationService.search({\n next: nextUrl\n });\n };\n };\n directive = {\n templateUrl: \"navigation-bar/navigation-bar.html\",\n scope: {},\n link: link\n };\n return directive;\n };\n\n NavigationBarDirective.$inject = [\"tgCurrentUserService\", \"tgNavigationBarService\", \"$tgLocation\", \"$tgNavUrls\"];\n\n angular.module(\"taigaNavigationBar\").directive(\"tgNavigationBar\", NavigationBarDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: navigation-bar.service.coffee\n */\n\n(function() {\n var NavigationBarService,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n NavigationBarService = (function(superClass) {\n extend(NavigationBarService, superClass);\n\n function NavigationBarService() {\n this.disableHeader();\n }\n\n NavigationBarService.prototype.enableHeader = function() {\n return this.enabledHeader = true;\n };\n\n NavigationBarService.prototype.disableHeader = function() {\n return this.enabledHeader = false;\n };\n\n NavigationBarService.prototype.isEnabledHeader = function() {\n return this.enabledHeader;\n };\n\n return NavigationBarService;\n\n })(taiga.Service);\n\n angular.module(\"taigaNavigationBar\").service(\"tgNavigationBarService\", NavigationBarService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-bar.controller.coffee\n */\n\n(function() {\n var ProfileBarController;\n\n ProfileBarController = (function() {\n ProfileBarController.$inject = [\"tgUserService\"];\n\n function ProfileBarController(userService) {\n this.userService = userService;\n this.loadStats();\n }\n\n ProfileBarController.prototype.loadStats = function() {\n return this.userService.getStats(this.user.get(\"id\")).then((function(_this) {\n return function(stats) {\n return _this.stats = stats;\n };\n })(this));\n };\n\n return ProfileBarController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"ProfileBar\", ProfileBarController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-bar.directive.coffee\n */\n\n(function() {\n var ProfileBarDirective;\n\n ProfileBarDirective = function() {\n return {\n templateUrl: \"profile/profile-bar/profile-bar.html\",\n controller: \"ProfileBar\",\n controllerAs: \"vm\",\n scope: {\n user: \"=user\",\n isCurrentUser: \"=iscurrentuser\"\n },\n bindToController: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileBar\", ProfileBarDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-contacts.controller.coffee\n */\n\n(function() {\n var ProfileContactsController;\n\n ProfileContactsController = (function() {\n ProfileContactsController.$inject = [\"tgUserService\", \"tgCurrentUserService\"];\n\n function ProfileContactsController(userService, currentUserService) {\n this.userService = userService;\n this.currentUserService = currentUserService;\n this.currentUser = this.currentUserService.getUser();\n this.isCurrentUser = false;\n if (this.currentUser && this.currentUser.get(\"id\") === this.user.get(\"id\")) {\n this.isCurrentUser = true;\n }\n }\n\n ProfileContactsController.prototype.loadContacts = function() {\n return this.userService.getContacts(this.user.get(\"id\")).then((function(_this) {\n return function(contacts) {\n return _this.contacts = contacts;\n };\n })(this));\n };\n\n return ProfileContactsController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"ProfileContacts\", ProfileContactsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-contacts.directive.coffee\n */\n\n(function() {\n var ProfileContactsDirective;\n\n ProfileContactsDirective = function() {\n var link;\n link = function(scope, elm, attrs, ctrl) {\n return ctrl.loadContacts();\n };\n return {\n templateUrl: \"profile/profile-contacts/profile-contacts.html\",\n scope: {\n user: \"=\"\n },\n controllerAs: \"vm\",\n controller: \"ProfileContacts\",\n link: link,\n bindToController: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileContacts\", ProfileContactsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: items.directive.coffee\n */\n\n(function() {\n var FavItemDirective;\n\n FavItemDirective = function() {\n var link, templateUrl;\n link = function(scope, el, attrs, ctrl) {\n return scope.vm = {\n item: scope.item\n };\n };\n templateUrl = function(el, attrs) {\n if (attrs.itemType === \"project\") {\n return \"profile/profile-favs/items/project.html\";\n } else {\n return \"profile/profile-favs/items/ticket.html\";\n }\n };\n return {\n scope: {\n \"item\": \"=tgFavItem\"\n },\n link: link,\n templateUrl: templateUrl\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgFavItem\", FavItemDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-favs.controller.coffee\n */\n\n(function() {\n var FavsBaseController, ProfileLikedController, ProfileVotedController, ProfileWatchedController, debounceLeading,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n debounceLeading = this.taiga.debounceLeading;\n\n FavsBaseController = (function() {\n function FavsBaseController() {\n this._init();\n }\n\n FavsBaseController.prototype._init = function() {\n this.enableFilterByAll = true;\n this.enableFilterByProjects = true;\n this.enableFilterByUserStories = true;\n this.enableFilterByTasks = true;\n this.enableFilterByIssues = true;\n this.enableFilterByTextQuery = true;\n this._resetList();\n this.q = null;\n return this.type = null;\n };\n\n FavsBaseController.prototype._resetList = function() {\n this.items = Immutable.List();\n this.scrollDisabled = false;\n return this._page = 1;\n };\n\n FavsBaseController.prototype._enableLoadingSpinner = function() {\n return this.isLoading = true;\n };\n\n FavsBaseController.prototype._disableLoadingSpinner = function() {\n return this.isLoading = false;\n };\n\n FavsBaseController.prototype._enableScroll = function() {\n return this.scrollDisabled = false;\n };\n\n FavsBaseController.prototype._disableScroll = function() {\n return this.scrollDisabled = true;\n };\n\n FavsBaseController.prototype._checkIfHasMorePages = function(hasNext) {\n if (hasNext) {\n this._page += 1;\n return this._enableScroll();\n } else {\n return this._disableScroll();\n }\n };\n\n FavsBaseController.prototype._checkIfHasNoResults = function() {\n return this.hasNoResults = this.items.size === 0;\n };\n\n FavsBaseController.prototype.loadItems = function() {\n this._enableLoadingSpinner();\n this._disableScroll();\n return this._getItems(this.user.get(\"id\"), this._page, this.type, this.q).then((function(_this) {\n return function(response) {\n _this.items = _this.items.concat(response.get(\"data\"));\n _this._checkIfHasMorePages(response.get(\"next\"));\n _this._checkIfHasNoResults();\n _this._disableLoadingSpinner();\n return _this.items;\n };\n })(this))[\"catch\"]((function(_this) {\n return function() {\n _this._disableLoadingSpinner();\n return _this.items;\n };\n })(this));\n };\n\n FavsBaseController.prototype.filterByTextQuery = debounceLeading(500, function() {\n this._resetList();\n return this.loadItems();\n });\n\n FavsBaseController.prototype.showAll = function() {\n if (this.type !== null) {\n this.type = null;\n this._resetList();\n return this.loadItems();\n }\n };\n\n FavsBaseController.prototype.showProjectsOnly = function() {\n if (this.type !== \"project\") {\n this.type = \"project\";\n this._resetList();\n return this.loadItems();\n }\n };\n\n FavsBaseController.prototype.showUserStoriesOnly = function() {\n if (this.type !== \"userstory\") {\n this.type = \"userstory\";\n this._resetList();\n return this.loadItems();\n }\n };\n\n FavsBaseController.prototype.showTasksOnly = function() {\n if (this.type !== \"task\") {\n this.type = \"task\";\n this._resetList();\n return this.loadItems();\n }\n };\n\n FavsBaseController.prototype.showIssuesOnly = function() {\n if (this.type !== \"issue\") {\n this.type = \"issue\";\n this._resetList();\n return this.loadItems();\n }\n };\n\n return FavsBaseController;\n\n })();\n\n ProfileLikedController = (function(superClass) {\n extend(ProfileLikedController, superClass);\n\n ProfileLikedController.$inject = [\"tgUserService\"];\n\n function ProfileLikedController(userService) {\n this.userService = userService;\n ProfileLikedController.__super__.constructor.call(this);\n this.enableFilterByAll = false;\n this.enableFilterByProjects = false;\n this.enableFilterByUserStories = false;\n this.enableFilterByTasks = false;\n this.enableFilterByIssues = false;\n this.enableFilterByTextQuery = true;\n this._getItems = this.userService.getLiked;\n }\n\n return ProfileLikedController;\n\n })(FavsBaseController);\n\n angular.module(\"taigaProfile\").controller(\"ProfileLiked\", ProfileLikedController);\n\n ProfileVotedController = (function(superClass) {\n extend(ProfileVotedController, superClass);\n\n ProfileVotedController.$inject = [\"tgUserService\"];\n\n function ProfileVotedController(userService) {\n this.userService = userService;\n ProfileVotedController.__super__.constructor.call(this);\n this.enableFilterByAll = true;\n this.enableFilterByProjects = false;\n this.enableFilterByUserStories = true;\n this.enableFilterByTasks = true;\n this.enableFilterByIssues = true;\n this.enableFilterByTextQuery = true;\n this._getItems = this.userService.getVoted;\n }\n\n return ProfileVotedController;\n\n })(FavsBaseController);\n\n angular.module(\"taigaProfile\").controller(\"ProfileVoted\", ProfileVotedController);\n\n ProfileWatchedController = (function(superClass) {\n extend(ProfileWatchedController, superClass);\n\n ProfileWatchedController.$inject = [\"tgUserService\"];\n\n function ProfileWatchedController(userService) {\n this.userService = userService;\n ProfileWatchedController.__super__.constructor.call(this);\n this._getItems = this.userService.getWatched;\n }\n\n return ProfileWatchedController;\n\n })(FavsBaseController);\n\n angular.module(\"taigaProfile\").controller(\"ProfileWatched\", ProfileWatchedController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-favs.directive.coffee\n */\n\n(function() {\n var ProfileLikedDirective, ProfileVotedDirective, ProfileWatchedDirective, base;\n\n base = {\n scope: {},\n bindToController: {\n user: \"=\",\n type: \"@\",\n q: \"@\",\n scrollDisabled: \"@\",\n isLoading: \"@\",\n hasNoResults: \"@\"\n },\n controller: null,\n controllerAs: \"vm\",\n templateUrl: \"profile/profile-favs/profile-favs.html\"\n };\n\n ProfileLikedDirective = function() {\n return _.extend({}, base, {\n controller: \"ProfileLiked\"\n });\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileLiked\", ProfileLikedDirective);\n\n ProfileVotedDirective = function() {\n return _.extend({}, base, {\n controller: \"ProfileVoted\"\n });\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileVoted\", ProfileVotedDirective);\n\n ProfileWatchedDirective = function() {\n return _.extend({}, base, {\n controller: \"ProfileWatched\"\n });\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileWatched\", ProfileWatchedDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-hints.controller.coffee\n */\n\n(function() {\n var ProfileHints;\n\n ProfileHints = (function() {\n ProfileHints.prototype.HINTS = [\n {\n url: \"https://taiga.io/support/import-export-projects/\"\n }, {\n url: \"https://taiga.io/support/custom-fields/\"\n }, {}, {}\n ];\n\n function ProfileHints(translate) {\n var hintKey;\n this.translate = translate;\n hintKey = Math.floor(Math.random() * this.HINTS.length) + 1;\n this.hint = this.HINTS[hintKey - 1];\n this.hint.linkText = this.hint.linkText || 'HINTS.LINK';\n this.hint.title = this.translate.instant(\"HINTS.HINT\" + hintKey + \"_TITLE\");\n this.hint.text = this.translate.instant(\"HINTS.HINT\" + hintKey + \"_TEXT\");\n }\n\n return ProfileHints;\n\n })();\n\n ProfileHints.$inject = [\"$translate\"];\n\n angular.module(\"taigaProfile\").controller(\"ProfileHints\", ProfileHints);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-hints.directive.coffee\n */\n\n(function() {\n var ProfileHints;\n\n ProfileHints = function($translate) {\n return {\n scope: {},\n controller: \"ProfileHints\",\n controllerAs: \"vm\",\n templateUrl: \"profile/profile-hints/profile-hints.html\"\n };\n };\n\n ProfileHints.$inject = [\"$translate\"];\n\n angular.module(\"taigaProfile\").directive(\"tgProfileHints\", ProfileHints);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-projects.controller.coffee\n */\n\n(function() {\n var ProfileProjectsController;\n\n ProfileProjectsController = (function() {\n ProfileProjectsController.$inject = [\"tgProjectsService\", \"tgUserService\"];\n\n function ProfileProjectsController(projectsService, userService) {\n this.projectsService = projectsService;\n this.userService = userService;\n }\n\n ProfileProjectsController.prototype.loadProjects = function() {\n return this.projectsService.getProjectsByUserId(this.user.get(\"id\")).then((function(_this) {\n return function(projects) {\n return _this.userService.attachUserContactsToProjects(_this.user.get(\"id\"), projects);\n };\n })(this)).then((function(_this) {\n return function(projects) {\n return _this.projects = projects;\n };\n })(this));\n };\n\n return ProfileProjectsController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"ProfileProjects\", ProfileProjectsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-projects.directive.coffee\n */\n\n(function() {\n var ProfileProjectsDirective;\n\n ProfileProjectsDirective = function() {\n var link;\n link = function(scope, elm, attr, ctrl) {\n return ctrl.loadProjects();\n };\n return {\n templateUrl: \"profile/profile-projects/profile-projects.html\",\n scope: {\n user: \"=\"\n },\n link: link,\n bindToController: true,\n controllerAs: \"vm\",\n controller: \"ProfileProjects\"\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileProjects\", ProfileProjectsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-tab.directive.coffee\n */\n\n(function() {\n var ProfileTabDirective;\n\n ProfileTabDirective = function() {\n var link;\n link = function(scope, element, attrs, ctrl, transclude) {\n scope.tab = {};\n attrs.$observe(\"tgProfileTab\", function(name) {\n return scope.tab.name = name;\n });\n attrs.$observe(\"tabTitle\", function(title) {\n return scope.tab.title = title;\n });\n scope.tab.icon = attrs.tabIcon;\n scope.tab.active = !!attrs.tabActive;\n if (scope.$eval(attrs.tabDisabled) !== true) {\n return ctrl.addTab(scope.tab);\n }\n };\n return {\n templateUrl: \"profile/profile-tab/profile-tab.html\",\n scope: {},\n require: \"^tgProfileTabs\",\n link: link,\n transclude: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileTab\", ProfileTabDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-tabs.controller.coffee\n */\n\n(function() {\n var ProfileTabsController;\n\n ProfileTabsController = (function() {\n function ProfileTabsController() {\n this.tabs = [];\n }\n\n ProfileTabsController.prototype.addTab = function(tab) {\n return this.tabs.push(tab);\n };\n\n ProfileTabsController.prototype.toggleTab = function(tab) {\n _.map(this.tabs, function(tab) {\n return tab.active = false;\n });\n return tab.active = true;\n };\n\n return ProfileTabsController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"ProfileTabs\", ProfileTabsController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile-tabs.directive.coffee\n */\n\n(function() {\n var ProfileTabsDirective;\n\n ProfileTabsDirective = function() {\n return {\n scope: {},\n controller: \"ProfileTabs\",\n controllerAs: \"vm\",\n templateUrl: \"profile/profile-tabs/profile-tabs.html\",\n transclude: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgProfileTabs\", ProfileTabsDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: profile.controller.coffee\n */\n\n(function() {\n var ProfileController;\n\n ProfileController = (function() {\n ProfileController.$inject = [\"tgAppMetaService\", \"tgCurrentUserService\", \"$routeParams\", \"tgUserService\", \"tgXhrErrorService\", \"$translate\"];\n\n function ProfileController(appMetaService, currentUserService, routeParams, userService, xhrError, translate) {\n this.appMetaService = appMetaService;\n this.currentUserService = currentUserService;\n this.routeParams = routeParams;\n this.userService = userService;\n this.xhrError = xhrError;\n this.translate = translate;\n this.isCurrentUser = false;\n if (this.routeParams.slug) {\n this.userService.getUserByUserName(this.routeParams.slug).then((function(_this) {\n return function(user) {\n if (!user.get('is_active')) {\n return _this.xhrError.notFound();\n } else {\n _this.user = user;\n _this.isCurrentUser = false;\n _this._setMeta(_this.user);\n return user;\n }\n };\n })(this))[\"catch\"]((function(_this) {\n return function(xhr) {\n return _this.xhrError.response(xhr);\n };\n })(this));\n } else {\n this.user = this.currentUserService.getUser();\n this.isCurrentUser = true;\n this._setMeta(this.user);\n }\n }\n\n ProfileController.prototype._setMeta = function(user) {\n var ctx, description, title;\n ctx = {\n userFullName: user.get(\"full_name_display\"),\n userUsername: user.get(\"username\")\n };\n title = this.translate.instant(\"USER.PROFILE.PAGE_TITLE\", ctx);\n description = user.get(\"bio\");\n return this.appMetaService.setAll(title, description);\n };\n\n return ProfileController;\n\n })();\n\n angular.module(\"taigaProfile\").controller(\"Profile\", ProfileController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: like-project-button.controller.coffee\n */\n\n(function() {\n var LikeProjectButtonController;\n\n LikeProjectButtonController = (function() {\n LikeProjectButtonController.$inject = [\"$tgConfirm\", \"tgLikeProjectButtonService\"];\n\n function LikeProjectButtonController(confirm, likeButtonService) {\n this.confirm = confirm;\n this.likeButtonService = likeButtonService;\n this.isMouseOver = false;\n this.loading = false;\n }\n\n LikeProjectButtonController.prototype.showTextWhenMouseIsOver = function() {\n return this.isMouseOver = true;\n };\n\n LikeProjectButtonController.prototype.showTextWhenMouseIsLeave = function() {\n return this.isMouseOver = false;\n };\n\n LikeProjectButtonController.prototype.toggleLike = function() {\n var promise;\n this.loading = true;\n if (!this.project.get(\"is_fan\")) {\n promise = this._like();\n } else {\n promise = this._unlike();\n }\n promise[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n return promise;\n };\n\n LikeProjectButtonController.prototype._like = function() {\n return this.likeButtonService.like(this.project.get('id')).then((function(_this) {\n return function() {\n return _this.showTextWhenMouseIsLeave();\n };\n })(this))[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this));\n };\n\n LikeProjectButtonController.prototype._unlike = function() {\n return this.likeButtonService.unlike(this.project.get('id'))[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this));\n };\n\n return LikeProjectButtonController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"LikeProjectButton\", LikeProjectButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: like-project-button.directive.coffee\n */\n\n(function() {\n var LikeProjectButtonDirective;\n\n LikeProjectButtonDirective = function() {\n return {\n scope: {},\n controller: \"LikeProjectButton\",\n bindToController: {\n project: '='\n },\n controllerAs: \"vm\",\n templateUrl: \"projects/components/like-project-button/like-project-button.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgLikeProjectButton\", LikeProjectButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: like-project-button.service.coffee\n */\n\n(function() {\n var LikeProjectButtonService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n LikeProjectButtonService = (function(superClass) {\n extend(LikeProjectButtonService, superClass);\n\n LikeProjectButtonService.$inject = [\"tgResources\", \"tgCurrentUserService\", \"tgProjectService\"];\n\n function LikeProjectButtonService(rs, currentUserService, projectService) {\n this.rs = rs;\n this.currentUserService = currentUserService;\n this.projectService = projectService;\n }\n\n LikeProjectButtonService.prototype._getProjectIndex = function(projectId) {\n return this.currentUserService.projects.get('all').findIndex(function(project) {\n return project.get('id') === projectId;\n });\n };\n\n LikeProjectButtonService.prototype._updateProjects = function(projectId, isFan) {\n var projectIndex, projects;\n projectIndex = this._getProjectIndex(projectId);\n if (projectIndex === -1) {\n return;\n }\n projects = this.currentUserService.projects.get('all').update(projectIndex, function(project) {\n var totalFans;\n totalFans = project.get(\"total_fans\");\n if (isFan) {\n totalFans++;\n } else {\n totalFans--;\n }\n return project.merge({\n is_fan: isFan,\n total_fans: totalFans\n });\n });\n return this.currentUserService.setProjects(projects);\n };\n\n LikeProjectButtonService.prototype._updateCurrentProject = function(isFan) {\n var project, totalFans;\n totalFans = this.projectService.project.get(\"total_fans\");\n if (isFan) {\n totalFans++;\n } else {\n totalFans--;\n }\n project = this.projectService.project.merge({\n is_fan: isFan,\n total_fans: totalFans\n });\n return this.projectService.setProject(project);\n };\n\n LikeProjectButtonService.prototype.like = function(projectId) {\n return this.rs.projects.likeProject(projectId).then((function(_this) {\n return function() {\n _this._updateProjects(projectId, true);\n return _this._updateCurrentProject(true);\n };\n })(this));\n };\n\n LikeProjectButtonService.prototype.unlike = function(projectId) {\n return this.rs.projects.unlikeProject(projectId).then((function(_this) {\n return function() {\n _this._updateProjects(projectId, false);\n return _this._updateCurrentProject(false);\n };\n })(this));\n };\n\n return LikeProjectButtonService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgLikeProjectButtonService\", LikeProjectButtonService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: sort-projects.directive.coffee\n */\n\n(function() {\n var SortProjectsDirective;\n\n SortProjectsDirective = function(currentUserService) {\n var directive, link;\n link = function(scope, el, attrs, ctrl) {\n var itemEl;\n itemEl = null;\n el.sortable({\n dropOnEmpty: true,\n revert: 200,\n axis: \"y\",\n opacity: .95,\n placeholder: 'placeholder',\n cancel: '.project-name'\n });\n return el.on(\"sortstop\", function(event, ui) {\n var i, index, len, project, sortData, sorted_project_ids, value;\n itemEl = ui.item;\n project = itemEl.scope().project;\n index = itemEl.index();\n sorted_project_ids = _.map(scope.projects.toJS(), function(p) {\n return p.id;\n });\n sorted_project_ids = _.without(sorted_project_ids, project.get(\"id\"));\n sorted_project_ids.splice(index, 0, project.get('id'));\n sortData = [];\n for (index = i = 0, len = sorted_project_ids.length; i < len; index = ++i) {\n value = sorted_project_ids[index];\n sortData.push({\n \"project_id\": value,\n \"order\": index\n });\n }\n return currentUserService.bulkUpdateProjectsOrder(sortData);\n });\n };\n directive = {\n scope: {\n projects: \"=tgSortProjects\"\n },\n link: link\n };\n return directive;\n };\n\n angular.module(\"taigaProjects\").directive(\"tgSortProjects\", [\"tgCurrentUserService\", SortProjectsDirective]);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-project-button.controller.coffee\n */\n\n(function() {\n var WatchProjectButtonController;\n\n WatchProjectButtonController = (function() {\n WatchProjectButtonController.$inject = [\"$tgConfirm\", \"tgWatchProjectButtonService\"];\n\n function WatchProjectButtonController(confirm, watchButtonService) {\n this.confirm = confirm;\n this.watchButtonService = watchButtonService;\n this.showWatchOptions = false;\n this.loading = false;\n }\n\n WatchProjectButtonController.prototype.toggleWatcherOptions = function() {\n return this.showWatchOptions = !this.showWatchOptions;\n };\n\n WatchProjectButtonController.prototype.closeWatcherOptions = function() {\n return this.showWatchOptions = false;\n };\n\n WatchProjectButtonController.prototype.watch = function(notifyLevel) {\n if (notifyLevel === this.project.get('notify_level')) {\n return;\n }\n this.loading = true;\n this.closeWatcherOptions();\n return this.watchButtonService.watch(this.project.get('id'), notifyLevel)[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this))[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n };\n\n WatchProjectButtonController.prototype.unwatch = function() {\n this.loading = true;\n this.closeWatcherOptions();\n return this.watchButtonService.unwatch(this.project.get('id'))[\"catch\"]((function(_this) {\n return function() {\n return _this.confirm.notify(\"error\");\n };\n })(this))[\"finally\"]((function(_this) {\n return function() {\n return _this.loading = false;\n };\n })(this));\n };\n\n return WatchProjectButtonController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"WatchProjectButton\", WatchProjectButtonController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-project-button.directive.coffee\n */\n\n(function() {\n var WatchProjectButtonDirective;\n\n WatchProjectButtonDirective = function() {\n return {\n scope: {},\n controller: \"WatchProjectButton\",\n bindToController: {\n project: \"=\"\n },\n controllerAs: \"vm\",\n templateUrl: \"projects/components/watch-project-button/watch-project-button.html\"\n };\n };\n\n angular.module(\"taigaProjects\").directive(\"tgWatchProjectButton\", WatchProjectButtonDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: watch-project-button.service.coffee\n */\n\n(function() {\n var WatchProjectButtonService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n WatchProjectButtonService = (function(superClass) {\n extend(WatchProjectButtonService, superClass);\n\n WatchProjectButtonService.$inject = [\"tgResources\", \"tgCurrentUserService\", \"tgProjectService\"];\n\n function WatchProjectButtonService(rs, currentUserService, projectService) {\n this.rs = rs;\n this.currentUserService = currentUserService;\n this.projectService = projectService;\n }\n\n WatchProjectButtonService.prototype._getProjectIndex = function(projectId) {\n return this.currentUserService.projects.get('all').findIndex(function(project) {\n return project.get('id') === projectId;\n });\n };\n\n WatchProjectButtonService.prototype._updateProjects = function(projectId, notifyLevel, isWatcher) {\n var projectIndex, projects;\n projectIndex = this._getProjectIndex(projectId);\n if (projectIndex === -1) {\n return;\n }\n projects = this.currentUserService.projects.get('all').update(projectIndex, (function(_this) {\n return function(project) {\n var totalWatchers;\n totalWatchers = project.get('total_watchers');\n if (!_this.projectService.project.get('is_watcher') && isWatcher) {\n totalWatchers++;\n } else if (_this.projectService.project.get('is_watcher') && !isWatcher) {\n totalWatchers--;\n }\n return project.merge({\n is_watcher: isWatcher,\n total_watchers: totalWatchers,\n notify_level: notifyLevel\n });\n };\n })(this));\n return this.currentUserService.setProjects(projects);\n };\n\n WatchProjectButtonService.prototype._updateCurrentProject = function(notifyLevel, isWatcher) {\n var project, totalWatchers;\n totalWatchers = this.projectService.project.get(\"total_watchers\");\n if (!this.projectService.project.get('is_watcher') && isWatcher) {\n totalWatchers++;\n } else if (this.projectService.project.get('is_watcher') && !isWatcher) {\n totalWatchers--;\n }\n project = this.projectService.project.merge({\n is_watcher: isWatcher,\n notify_level: notifyLevel,\n total_watchers: totalWatchers\n });\n return this.projectService.setProject(project);\n };\n\n WatchProjectButtonService.prototype.watch = function(projectId, notifyLevel) {\n return this.rs.projects.watchProject(projectId, notifyLevel).then((function(_this) {\n return function() {\n _this._updateProjects(projectId, notifyLevel, true);\n return _this._updateCurrentProject(notifyLevel, true);\n };\n })(this));\n };\n\n WatchProjectButtonService.prototype.unwatch = function(projectId) {\n return this.rs.projects.unwatchProject(projectId).then((function(_this) {\n return function() {\n _this._updateProjects(projectId, null, false);\n return _this._updateCurrentProject(null, false);\n };\n })(this));\n };\n\n return WatchProjectButtonService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgWatchProjectButtonService\", WatchProjectButtonService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: projects-listing.controller.coffee\n */\n\n(function() {\n var ProjectsListingController;\n\n ProjectsListingController = (function() {\n ProjectsListingController.$inject = [\"tgCurrentUserService\", \"tgProjectsService\"];\n\n function ProjectsListingController(currentUserService, projectsService) {\n this.currentUserService = currentUserService;\n this.projectsService = projectsService;\n taiga.defineImmutableProperty(this, \"projects\", (function(_this) {\n return function() {\n return _this.currentUserService.projects.get(\"all\");\n };\n })(this));\n }\n\n ProjectsListingController.prototype.newProject = function() {\n return this.projectsService.newProject();\n };\n\n return ProjectsListingController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"ProjectsListing\", ProjectsListingController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project.controller.coffee\n */\n\n(function() {\n var ProjectController;\n\n ProjectController = (function() {\n ProjectController.$inject = [\"$routeParams\", \"tgAppMetaService\", \"$tgAuth\", \"$translate\", \"tgProjectService\"];\n\n function ProjectController(routeParams, appMetaService, auth, translate, projectService) {\n var projectSlug;\n this.routeParams = routeParams;\n this.appMetaService = appMetaService;\n this.auth = auth;\n this.translate = translate;\n this.projectService = projectService;\n projectSlug = this.routeParams.pslug;\n this.user = this.auth.userData;\n taiga.defineImmutableProperty(this, \"project\", (function(_this) {\n return function() {\n return _this.projectService.project;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"members\", (function(_this) {\n return function() {\n return _this.projectService.activeMembers;\n };\n })(this));\n this.appMetaService.setfn(this._setMeta.bind(this));\n }\n\n ProjectController.prototype._setMeta = function(project) {\n var ctx, metas;\n if (!this.project) {\n return null;\n }\n metas = {};\n ctx = {\n projectName: this.project.get(\"name\")\n };\n metas.title = this.translate.instant(\"PROJECT.PAGE_TITLE\", ctx);\n metas.description = this.project.get(\"description\");\n return metas;\n };\n\n return ProjectController;\n\n })();\n\n angular.module(\"taigaProjects\").controller(\"Project\", ProjectController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: projects.service.coffee\n */\n\n(function() {\n var ProjectsService, groupBy, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n ProjectsService = (function(superClass) {\n extend(ProjectsService, superClass);\n\n ProjectsService.$inject = [\"tgResources\", \"$projectUrl\", \"tgLightboxFactory\"];\n\n function ProjectsService(rs, projectUrl, lightboxFactory) {\n this.rs = rs;\n this.projectUrl = projectUrl;\n this.lightboxFactory = lightboxFactory;\n }\n\n ProjectsService.prototype.getProjectBySlug = function(projectSlug) {\n return this.rs.projects.getProjectBySlug(projectSlug).then((function(_this) {\n return function(project) {\n return _this._decorate(project);\n };\n })(this));\n };\n\n ProjectsService.prototype.getProjectStats = function(projectId) {\n return this.rs.projects.getProjectStats(projectId);\n };\n\n ProjectsService.prototype.getProjectsByUserId = function(userId, paginate) {\n return this.rs.projects.getProjectsByUserId(userId, paginate).then((function(_this) {\n return function(projects) {\n return projects.map(_this._decorate.bind(_this));\n };\n })(this));\n };\n\n ProjectsService.prototype._decorate = function(project) {\n var colorized_tags, tags, url;\n url = this.projectUrl.get(project.toJS());\n project = project.set(\"url\", url);\n colorized_tags = [];\n if (project.get(\"tags\")) {\n tags = project.get(\"tags\").sort();\n colorized_tags = tags.map(function(tag) {\n var color;\n color = project.get(\"tags_colors\").get(tag);\n return Immutable.fromJS({\n name: tag,\n color: color\n });\n });\n project = project.set(\"colorized_tags\", colorized_tags);\n }\n return project;\n };\n\n ProjectsService.prototype.newProject = function() {\n return this.lightboxFactory.create(\"tg-lb-create-project\", {\n \"class\": \"wizard-create-project\"\n });\n };\n\n ProjectsService.prototype.bulkUpdateProjectsOrder = function(sortData) {\n return this.rs.projects.bulkUpdateOrder(sortData);\n };\n\n return ProjectsService;\n\n })(taiga.Service);\n\n angular.module(\"taigaProjects\").service(\"tgProjectsService\", ProjectsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments-resource.service.coffee\n */\n\n(function() {\n var Resource, module, sizeFormat, taiga;\n\n taiga = this.taiga;\n\n sizeFormat = this.taiga.sizeFormat;\n\n Resource = function(urlsService, http, config, $rootScope, $q, storage) {\n var service;\n service = {};\n service.list = function(type, objectId, projectId) {\n var httpOptions, params, url, urlname;\n urlname = \"attachments/\" + type;\n params = {\n object_id: objectId,\n project: projectId\n };\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n url = urlsService.resolve(urlname);\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service[\"delete\"] = function(type, id) {\n var url, urlname;\n urlname = \"attachments/\" + type;\n url = urlsService.resolve(urlname) + (\"/\" + id);\n return http[\"delete\"](url);\n };\n service.patch = function(type, id, patch) {\n var url, urlname;\n urlname = \"attachments/\" + type;\n url = urlsService.resolve(urlname) + (\"/\" + id);\n return http.patch(url, patch);\n };\n service.create = function(type, projectId, objectId, file) {\n var data, defered, maxFileSize, response, token, uploadComplete, uploadFailed, uploadProgress, url, urlname, xhr;\n urlname = \"attachments/\" + type;\n url = urlsService.resolve(urlname);\n defered = $q.defer();\n if (file === void 0) {\n defered.reject(null);\n return defered.promise;\n }\n maxFileSize = config.get(\"maxUploadFileSize\", null);\n if (maxFileSize && file.size > maxFileSize) {\n response = {\n status: 413,\n data: {\n _error_message: \"'\" + file.name + \"' (\" + (sizeFormat(file.size)) + \") is too heavy for our oompa loompas, try it with a smaller than (\" + (sizeFormat(maxFileSize)) + \")\"\n }\n };\n defered.reject(response);\n return defered.promise;\n }\n uploadProgress = (function(_this) {\n return function(evt) {\n return $rootScope.$apply(function() {\n file.status = \"in-progress\";\n file.size = sizeFormat(evt.total);\n file.progressMessage = \"upload \" + (sizeFormat(evt.loaded)) + \" of \" + (sizeFormat(evt.total));\n return file.progressPercent = (Math.round((evt.loaded / evt.total) * 100)) + \"%\";\n });\n };\n })(this);\n uploadComplete = (function(_this) {\n return function(evt) {\n return $rootScope.$apply(function() {\n var attachment, error, ref, status;\n file.status = \"done\";\n status = evt.target.status;\n try {\n attachment = JSON.parse(evt.target.responseText);\n } catch (error) {\n attachment = {};\n }\n if (status >= 200 && status < 400) {\n attachment = Immutable.fromJS(attachment);\n return defered.resolve(attachment);\n } else {\n response = {\n status: status,\n data: {\n _error_message: (ref = data['attached_file']) != null ? ref[0] : void 0\n }\n };\n return defered.reject(response);\n }\n });\n };\n })(this);\n uploadFailed = (function(_this) {\n return function(evt) {\n return $rootScope.$apply(function() {\n file.status = \"error\";\n return defered.reject(\"fail\");\n });\n };\n })(this);\n data = new FormData();\n data.append(\"project\", projectId);\n data.append(\"object_id\", objectId);\n data.append(\"attached_file\", file);\n xhr = new XMLHttpRequest();\n xhr.upload.addEventListener(\"progress\", uploadProgress, false);\n xhr.addEventListener(\"load\", uploadComplete, false);\n xhr.addEventListener(\"error\", uploadFailed, false);\n token = storage.get('token');\n xhr.open(\"POST\", url);\n xhr.setRequestHeader(\"Authorization\", \"Bearer \" + token);\n xhr.setRequestHeader('Accept', 'application/json');\n xhr.send(data);\n return defered.promise;\n };\n return function() {\n return {\n \"attachments\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\", \"$tgConfig\", \"$rootScope\", \"$q\", \"$tgStorage\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgAttachmentsResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: external-apps-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.getApplicationToken = function(applicationId, state) {\n var url;\n url = urlsService.resolve(\"applications\");\n url = url + \"/\" + applicationId + \"/token?state=\" + state;\n return http.get(url).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.authorizeApplicationToken = function(applicationId, state) {\n var data, url;\n url = urlsService.resolve(\"application-tokens\");\n url = url + \"/authorize\";\n data = {\n \"state\": state,\n \"application\": applicationId\n };\n return http.post(url, data).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"externalapps\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgExternalAppsResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: issues-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.listInAllProjects = function(params) {\n var httpOptions, url;\n url = urlsService.resolve(\"issues\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"issues\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgIssuesResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: projects-resource.service.coffee\n */\n\n(function() {\n var Resource, module, pagination;\n\n pagination = function() {};\n\n Resource = function(urlsService, http, paginateResponseService) {\n var service;\n service = {};\n service.getProjects = function(params, pagination) {\n var httpOptions, url;\n if (params == null) {\n params = {};\n }\n if (pagination == null) {\n pagination = true;\n }\n url = urlsService.resolve(\"projects\");\n httpOptions = {};\n if (!pagination) {\n httpOptions = {\n headers: {\n \"x-lazy-pagination\": true\n }\n };\n }\n return http.get(url, params, httpOptions);\n };\n service.getProjectBySlug = function(projectSlug) {\n var url;\n url = urlsService.resolve(\"projects\");\n url = url + \"/by_slug?slug=\" + projectSlug;\n return http.get(url).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getProjectsByUserId = function(userId, paginate) {\n var httpOptions, params, url;\n if (paginate == null) {\n paginate = false;\n }\n url = urlsService.resolve(\"projects\");\n httpOptions = {};\n if (!paginate) {\n httpOptions.headers = {\n \"x-disable-pagination\": \"1\"\n };\n }\n params = {\n \"member\": userId,\n \"order_by\": \"memberships__user_order\"\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getProjectStats = function(projectId) {\n var url;\n url = urlsService.resolve(\"projects\");\n url = url + \"/\" + projectId;\n return http.get(url).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.bulkUpdateOrder = function(bulkData) {\n var url;\n url = urlsService.resolve(\"bulk-update-projects-order\");\n return http.post(url, bulkData);\n };\n service.getTimeline = function(projectId, page) {\n var params, url;\n params = {\n page: page,\n only_relevant: true\n };\n url = urlsService.resolve(\"timeline-project\");\n url = url + \"/\" + projectId;\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.likeProject = function(projectId) {\n var url;\n url = urlsService.resolve(\"project-like\", projectId);\n return http.post(url);\n };\n service.unlikeProject = function(projectId) {\n var url;\n url = urlsService.resolve(\"project-unlike\", projectId);\n return http.post(url);\n };\n service.watchProject = function(projectId, notifyLevel) {\n var data, url;\n data = {\n notify_level: notifyLevel\n };\n url = urlsService.resolve(\"project-watch\", projectId);\n return http.post(url, data);\n };\n service.unwatchProject = function(projectId) {\n var url;\n url = urlsService.resolve(\"project-unwatch\", projectId);\n return http.post(url);\n };\n return function() {\n return {\n \"projects\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\", \"tgPaginateResponseService\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgProjectsResources\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: resources.coffee\n */\n\n(function() {\n var Resources, services;\n\n services = [\"tgProjectsResources\", \"tgUserResources\", \"tgUsersResources\", \"tgUserstoriesResource\", \"tgTasksResource\", \"tgIssuesResource\", \"tgExternalAppsResource\", \"tgAttachmentsResource\", \"tgStatsResource\"];\n\n Resources = function($injector) {\n var i, j, len, len1, ref, service, serviceFn, serviceName, serviceProperty;\n for (i = 0, len = services.length; i < len; i++) {\n serviceName = services[i];\n serviceFn = $injector.get(serviceName);\n service = $injector.invoke(serviceFn);\n ref = Object.keys(service);\n for (j = 0, len1 = ref.length; j < len1; j++) {\n serviceProperty = ref[j];\n if (this[serviceProperty]) {\n console.warm(\"repeated resource \" + serviceProperty);\n }\n this[serviceProperty] = service[serviceProperty];\n }\n }\n return this;\n };\n\n Resources.$inject = [\"$injector\"];\n\n angular.module(\"taigaResources2\").service(\"tgResources\", Resources);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: stats-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.discover = function(applicationId, state) {\n var url;\n url = urlsService.resolve(\"stats-discover\");\n return http.get(url).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"stats\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgStatsResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: tasks-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.listInAllProjects = function(params) {\n var httpOptions, url;\n url = urlsService.resolve(\"tasks\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"tasks\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgTasksResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http, paginateResponseService) {\n var service;\n service = {};\n service.getUserStorage = function(key) {\n var httpOptions, url;\n url = urlsService.resolve(\"user-storage\");\n if (key) {\n url += '/' + key;\n }\n httpOptions = {};\n return http.get(url, {}).then(function(response) {\n return response.data.value;\n });\n };\n service.setUserStorage = function(key, value) {\n var params, url;\n url = urlsService.resolve(\"user-storage\") + '/' + key;\n params = {\n key: key,\n value: value\n };\n return http.put(url, params);\n };\n service.createUserStorage = function(key, value) {\n var params, url;\n url = urlsService.resolve(\"user-storage\");\n params = {\n key: key,\n value: value\n };\n return http.post(url, params);\n };\n return function() {\n return {\n \"user\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgUserResources\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: users-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http, paginateResponseService) {\n var service;\n service = {};\n service.getUserByUsername = function(username) {\n var httpOptions, params, url;\n url = urlsService.resolve(\"by_username\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n params = {\n username: username\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getStats = function(userId) {\n var httpOptions, url;\n url = urlsService.resolve(\"user-stats\", userId);\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, {}, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getContacts = function(userId) {\n var httpOptions, url;\n url = urlsService.resolve(\"user-contacts\", userId);\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, {}, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n service.getLiked = function(userId, page, type, q) {\n var params, url;\n url = urlsService.resolve(\"user-liked\", userId);\n params = {};\n if (page != null) {\n params.page = page;\n }\n if (type != null) {\n params.type = type;\n }\n if (q != null) {\n params.q = q;\n }\n params.only_relevant = true;\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.getVoted = function(userId, page, type, q) {\n var params, url;\n url = urlsService.resolve(\"user-voted\", userId);\n params = {};\n if (page != null) {\n params.page = page;\n }\n if (type != null) {\n params.type = type;\n }\n if (q != null) {\n params.q = q;\n }\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.getWatched = function(userId, page, type, q) {\n var params, url;\n url = urlsService.resolve(\"user-watched\", userId);\n params = {};\n if (page != null) {\n params.page = page;\n }\n if (type != null) {\n params.type = type;\n }\n if (q != null) {\n params.q = q;\n }\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.getProfileTimeline = function(userId, page) {\n var params, url;\n params = {\n page: page\n };\n url = urlsService.resolve(\"timeline-profile\");\n url = url + \"/\" + userId;\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n service.getUserTimeline = function(userId, page) {\n var params, url;\n params = {\n page: page,\n only_relevant: true\n };\n url = urlsService.resolve(\"timeline-user\");\n url = url + \"/\" + userId;\n return http.get(url, params, {\n headers: {\n 'x-lazy-pagination': true\n }\n }).then(function(result) {\n result = Immutable.fromJS(result);\n return paginateResponseService(result);\n });\n };\n return function() {\n return {\n \"users\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\", \"tgPaginateResponseService\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgUsersResources\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: userstories-resource.service.coffee\n */\n\n(function() {\n var Resource, module;\n\n Resource = function(urlsService, http) {\n var service;\n service = {};\n service.listInAllProjects = function(params) {\n var httpOptions, url;\n url = urlsService.resolve(\"userstories\");\n httpOptions = {\n headers: {\n \"x-disable-pagination\": \"1\"\n }\n };\n return http.get(url, params, httpOptions).then(function(result) {\n return Immutable.fromJS(result.data);\n });\n };\n return function() {\n return {\n \"userstories\": service\n };\n };\n };\n\n Resource.$inject = [\"$tgUrls\", \"$tgHttp\"];\n\n module = angular.module(\"taigaResources2\");\n\n module.factory(\"tgUserstoriesResource\", Resource);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: app-meta.service.coffee\n */\n\n(function() {\n var AppMetaService, taiga, truncate;\n\n taiga = this.taiga;\n\n truncate = taiga.truncate;\n\n AppMetaService = (function() {\n AppMetaService.$inject = [\"$rootScope\"];\n\n function AppMetaService(rootScope) {\n this.rootScope = rootScope;\n }\n\n AppMetaService.prototype._set = function(key, value) {\n var meta;\n if (!key) {\n return;\n }\n if (key === \"title\") {\n meta = $(\"title\");\n if (meta.length === 0) {\n meta = $(\"\");\n $(\"head\").append(meta);\n }\n return meta.text(value || \"\");\n } else if (key.indexOf(\"og:\") === 0) {\n meta = $(\"meta[property='\" + key + \"']\");\n if (meta.length === 0) {\n meta = $(\"\");\n $(\"head\").append(meta);\n }\n return meta.attr(\"content\", value || \"\");\n } else {\n meta = $(\"meta[name='\" + key + \"']\");\n if (meta.length === 0) {\n meta = $(\"\");\n $(\"head\").append(meta);\n }\n return meta.attr(\"content\", value || \"\");\n }\n };\n\n AppMetaService.prototype.setTitle = function(title) {\n return this._set('title', title);\n };\n\n AppMetaService.prototype.setDescription = function(description) {\n return this._set(\"description\", truncate(description, 250));\n };\n\n AppMetaService.prototype.setTwitterMetas = function(title, description) {\n this._set(\"twitter:card\", \"summary\");\n this._set(\"twitter:site\", \"@taigaio\");\n this._set(\"twitter:title\", title);\n this._set(\"twitter:description\", truncate(description, 300));\n return this._set(\"twitter:image\", window.location.origin + \"/\" + window._version + \"/images/logo-color.png\");\n };\n\n AppMetaService.prototype.setOpenGraphMetas = function(title, description) {\n this._set(\"og:type\", \"object\");\n this._set(\"og:site_name\", \"Taiga - Love your projects\");\n this._set(\"og:title\", title);\n this._set(\"og:description\", truncate(description, 300));\n this._set(\"og:image\", window.location.origin + \"/\" + window._version + \"/images/logo-color.png\");\n return this._set(\"og:url\", window.location.href);\n };\n\n AppMetaService.prototype.setAll = function(title, description) {\n this.setTitle(title);\n this.setDescription(description);\n this.setTwitterMetas(title, description);\n return this.setOpenGraphMetas(title, description);\n };\n\n AppMetaService.prototype.addMobileViewport = function() {\n return $(\"head\").append(\"\");\n };\n\n AppMetaService.prototype.removeMobileViewport = function() {\n return $(\"meta[name=\\\"viewport\\\"]\").remove();\n };\n\n AppMetaService.prototype.setfn = function(fn) {\n if (this.listener) {\n this._listener();\n }\n return this._listener = this.rootScope.$watchCollection(fn, (function(_this) {\n return function(metas) {\n if (metas) {\n _this.setAll(metas.title, metas.description);\n return _this._listener();\n }\n };\n })(this));\n };\n\n return AppMetaService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgAppMetaService\", AppMetaService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2015 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: attachments.service.coffee\n */\n\n(function() {\n var AttachmentsService, sizeFormat;\n\n sizeFormat = this.taiga.sizeFormat;\n\n AttachmentsService = (function() {\n AttachmentsService.$inject = [\"$tgConfirm\", \"$tgConfig\", \"$translate\", \"tgResources\"];\n\n function AttachmentsService(confirm, config, translate, rs) {\n this.confirm = confirm;\n this.config = config;\n this.translate = translate;\n this.rs = rs;\n this.maxFileSize = this.getMaxFileSize();\n if (this.maxFileSize) {\n this.maxFileSizeFormated = sizeFormat(this.maxFileSize);\n }\n }\n\n AttachmentsService.prototype.sizeError = function(file) {\n var message;\n message = this.translate.instant(\"ATTACHMENT.ERROR_MAX_SIZE_EXCEEDED\", {\n fileName: file.name,\n fileSize: sizeFormat(file.size),\n maxFileSize: this.maxFileSizeFormated\n });\n return this.confirm.notify(\"error\", message);\n };\n\n AttachmentsService.prototype.validate = function(file) {\n if (this.maxFileSize && file.size > this.maxFileSize) {\n this.sizeError(file);\n return false;\n }\n return true;\n };\n\n AttachmentsService.prototype.getMaxFileSize = function() {\n return this.config.get(\"maxUploadFileSize\", null);\n };\n\n AttachmentsService.prototype.list = function(type, objId, projectId) {\n return this.rs.attachments.list(type, objId, projectId).then((function(_this) {\n return function(attachments) {\n return attachments.sortBy(function(attachment) {\n return attachment.get('order');\n });\n };\n })(this));\n };\n\n AttachmentsService.prototype[\"delete\"] = function(type, id) {\n return this.rs.attachments[\"delete\"](type, id);\n };\n\n AttachmentsService.prototype.saveError = function(file, data) {\n var message;\n message = \"\";\n if (file) {\n message = this.translate.instant(\"ATTACHMENT.ERROR_UPLOAD_ATTACHMENT\", {\n fileName: file.name,\n errorMessage: data.data._error_message\n });\n }\n return this.confirm.notify(\"error\", message);\n };\n\n AttachmentsService.prototype.upload = function(file, objId, projectId, type) {\n var promise;\n promise = this.rs.attachments.create(type, projectId, objId, file);\n promise.then(null, this.saveError.bind(this, file));\n return promise;\n };\n\n AttachmentsService.prototype.patch = function(id, type, patch) {\n var promise;\n promise = this.rs.attachments.patch(type, id, patch);\n promise.then(null, this.saveError.bind(this, null));\n return promise;\n };\n\n return AttachmentsService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgAttachmentsService\", AttachmentsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: check-permissions.service.coffee\n */\n\n(function() {\n var ChekcPermissionsService, taiga;\n\n taiga = this.taiga;\n\n ChekcPermissionsService = (function() {\n ChekcPermissionsService.$inject = [\"tgProjectService\"];\n\n function ChekcPermissionsService(projectService) {\n this.projectService = projectService;\n }\n\n ChekcPermissionsService.prototype.check = function(permission) {\n return this.projectService.project.get('my_permissions').indexOf(permission) !== -1;\n };\n\n return ChekcPermissionsService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgCheckPermissionsService\", ChekcPermissionsService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: current-user.service.coffee\n */\n\n(function() {\n var CurrentUserService, groupBy, taiga;\n\n taiga = this.taiga;\n\n groupBy = this.taiga.groupBy;\n\n CurrentUserService = (function() {\n CurrentUserService.$inject = [\"tgProjectsService\", \"$tgStorage\", \"tgResources\"];\n\n function CurrentUserService(projectsService, storageService, rs) {\n this.projectsService = projectsService;\n this.storageService = storageService;\n this.rs = rs;\n this._user = null;\n this._projects = Immutable.Map();\n this._projectsById = Immutable.Map();\n this._joyride = null;\n taiga.defineImmutableProperty(this, \"projects\", (function(_this) {\n return function() {\n return _this._projects;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"projectsById\", (function(_this) {\n return function() {\n return _this._projectsById;\n };\n })(this));\n }\n\n CurrentUserService.prototype.isAuthenticated = function() {\n if (this.getUser() !== null) {\n return true;\n }\n return false;\n };\n\n CurrentUserService.prototype.getUser = function() {\n var userData;\n if (!this._user) {\n userData = this.storageService.get(\"userInfo\");\n if (userData) {\n userData = Immutable.fromJS(userData);\n this.setUser(userData);\n }\n }\n return this._user;\n };\n\n CurrentUserService.prototype.removeUser = function() {\n this._user = null;\n this._projects = Immutable.Map();\n this._projectsById = Immutable.Map();\n return this._joyride = null;\n };\n\n CurrentUserService.prototype.setUser = function(user) {\n this._user = user;\n return this._loadUserInfo();\n };\n\n CurrentUserService.prototype.bulkUpdateProjectsOrder = function(sortData) {\n return this.projectsService.bulkUpdateProjectsOrder(sortData).then((function(_this) {\n return function() {\n return _this.loadProjects();\n };\n })(this));\n };\n\n CurrentUserService.prototype.loadProjects = function() {\n return this.projectsService.getProjectsByUserId(this._user.get(\"id\")).then((function(_this) {\n return function(projects) {\n return _this.setProjects(projects);\n };\n })(this));\n };\n\n CurrentUserService.prototype.disableJoyRide = function(section) {\n if (section) {\n this._joyride[section] = false;\n } else {\n this._joyride = {\n backlog: false,\n kanban: false,\n dashboard: false\n };\n }\n return this.rs.user.setUserStorage('joyride', this._joyride);\n };\n\n CurrentUserService.prototype.loadJoyRideConfig = function() {\n return new Promise((function(_this) {\n return function(resolve) {\n if (_this._joyride !== null) {\n resolve(_this._joyride);\n return;\n }\n return _this.rs.user.getUserStorage('joyride').then(function(config) {\n _this._joyride = config;\n return resolve(_this._joyride);\n })[\"catch\"](function() {\n _this._joyride = {\n backlog: true,\n kanban: true,\n dashboard: true\n };\n _this.rs.user.createUserStorage('joyride', _this._joyride);\n return resolve(_this._joyride);\n });\n };\n })(this));\n };\n\n CurrentUserService.prototype._loadUserInfo = function() {\n return Promise.all([this.loadProjects()]);\n };\n\n CurrentUserService.prototype.setProjects = function(projects) {\n this._projects = this._projects.set(\"all\", projects);\n this._projects = this._projects.set(\"recents\", projects.slice(0, 10));\n this._projectsById = Immutable.fromJS(groupBy(projects.toJS(), function(p) {\n return p.id;\n }));\n return this.projects;\n };\n\n return CurrentUserService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgCurrentUserService\", CurrentUserService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: lightbox-factory.service.coffee\n */\n\n(function() {\n var LightboxFactory;\n\n LightboxFactory = (function() {\n LightboxFactory.$inject = [\"$rootScope\", \"$compile\"];\n\n function LightboxFactory(rootScope, compile) {\n this.rootScope = rootScope;\n this.compile = compile;\n }\n\n LightboxFactory.prototype.create = function(name, attrs, scopeAttrs) {\n var elm, html, scope;\n scope = this.rootScope.$new();\n scope = _.merge(scope, scopeAttrs);\n elm = $(\"
\").attr(name, true).attr(\"tg-bind-scope\", true);\n if (attrs) {\n elm.attr(attrs);\n }\n elm.addClass(\"remove-on-close\");\n html = this.compile(elm)(scope);\n $(document.body).append(html);\n };\n\n return LightboxFactory;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgLightboxFactory\", LightboxFactory);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: paginate-response.service.coffee\n */\n\n(function() {\n var PaginateResponse;\n\n PaginateResponse = function() {\n return function(result) {\n var paginateResponse;\n paginateResponse = Immutable.Map({\n \"data\": result.get(\"data\"),\n \"next\": !!result.get(\"headers\")(\"x-pagination-next\"),\n \"prev\": !!result.get(\"headers\")(\"x-pagination-prev\"),\n \"current\": result.get(\"headers\")(\"x-pagination-current\"),\n \"count\": result.get(\"headers\")(\"x-pagination-count\")\n });\n return paginateResponse;\n };\n };\n\n angular.module(\"taigaCommon\").factory(\"tgPaginateResponseService\", PaginateResponse);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: project.service.coffee\n */\n\n(function() {\n var ProjectService, taiga;\n\n taiga = this.taiga;\n\n ProjectService = (function() {\n ProjectService.$inject = [\"tgProjectsService\", \"tgXhrErrorService\"];\n\n function ProjectService(projectsService, xhrError) {\n this.projectsService = projectsService;\n this.xhrError = xhrError;\n this._project = null;\n this._section = null;\n this._sectionsBreadcrumb = Immutable.List();\n this._activeMembers = Immutable.List();\n taiga.defineImmutableProperty(this, \"project\", (function(_this) {\n return function() {\n return _this._project;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"section\", (function(_this) {\n return function() {\n return _this._section;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"sectionsBreadcrumb\", (function(_this) {\n return function() {\n return _this._sectionsBreadcrumb;\n };\n })(this));\n taiga.defineImmutableProperty(this, \"activeMembers\", (function(_this) {\n return function() {\n return _this._activeMembers;\n };\n })(this));\n }\n\n ProjectService.prototype.setSection = function(section) {\n this._section = section;\n if (section) {\n return this._sectionsBreadcrumb = this._sectionsBreadcrumb.push(this._section);\n } else {\n return this._sectionsBreadcrumb = Immutable.List();\n }\n };\n\n ProjectService.prototype.setProjectBySlug = function(pslug) {\n return new Promise((function(_this) {\n return function(resolve, reject) {\n if (!_this.project || _this.project.get('slug') !== pslug) {\n return _this.projectsService.getProjectBySlug(pslug).then(function(project) {\n _this.setProject(project);\n return resolve();\n })[\"catch\"](function(xhr) {\n return _this.xhrError.response(xhr);\n });\n } else {\n return resolve();\n }\n };\n })(this));\n };\n\n ProjectService.prototype.setProject = function(project) {\n this._project = project;\n return this._activeMembers = this._project.get('members').filter(function(member) {\n return member.get('is_active');\n });\n };\n\n ProjectService.prototype.cleanProject = function() {\n this._project = null;\n this._activeMembers = Immutable.List();\n this._section = null;\n return this._sectionsBreadcrumb = Immutable.List();\n };\n\n ProjectService.prototype.hasPermission = function(permission) {\n return this._project.get('my_permissions').indexOf(permission) !== -1;\n };\n\n ProjectService.prototype.fetchProject = function() {\n var pslug;\n pslug = this.project.get('slug');\n return this.projectsService.getProjectBySlug(pslug).then((function(_this) {\n return function(project) {\n return _this.setProject(project);\n };\n })(this));\n };\n\n return ProjectService;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgProjectService\", ProjectService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: scope-event.service.coffee\n */\n\n(function() {\n var ScopeEvent;\n\n ScopeEvent = (function() {\n function ScopeEvent() {}\n\n ScopeEvent.prototype.scopes = {};\n\n ScopeEvent.prototype._searchDuplicatedScopes = function(id) {\n return _.find(Object.keys(this.scopes), (function(_this) {\n return function(key) {\n return _this.scopes[key].$id === id;\n };\n })(this));\n };\n\n ScopeEvent.prototype._create = function(name, scope) {\n var duplicatedScopeName;\n duplicatedScopeName = this._searchDuplicatedScopes(scope.$id);\n if (duplicatedScopeName) {\n throw new Error(\"scopeEvent: this scope is already register with the name \\\"\" + duplicatedScopeName + \"\\\"\");\n }\n if (this.scopes[name]) {\n throw new Error(\"scopeEvent: \\\"\" + name + \"\\\" already in use\");\n } else {\n scope._tgEmitter = new EventEmitter2();\n scope.$on(\"$destroy\", (function(_this) {\n return function() {\n scope._tgEmitter.removeAllListeners();\n return delete _this.scopes[name];\n };\n })(this));\n return this.scopes[name] = scope;\n }\n };\n\n ScopeEvent.prototype.emitter = function(name, scope) {\n if (scope) {\n scope = this._create(name, scope);\n } else if (this.scopes[name]) {\n scope = this.scopes[name];\n } else {\n throw new Error(\"scopeEvent: \\\"\" + name + \"\\\" scope doesn't exist'\");\n }\n return scope._tgEmitter;\n };\n\n return ScopeEvent;\n\n })();\n\n angular.module(\"taigaCommon\").service(\"tgScopeEvent\", ScopeEvent);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: theme.service.coffee\n */\n\n(function() {\n var ThemeService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n ThemeService = (function(superClass) {\n extend(ThemeService, superClass);\n\n function ThemeService() {\n return ThemeService.__super__.constructor.apply(this, arguments);\n }\n\n return ThemeService;\n\n })(taiga.Service = function() {\n return {\n use: function(themeName) {\n var stylesheetEl;\n stylesheetEl = $(\"link[rel='stylesheet']:first\");\n if (stylesheetEl.length === 0) {\n stylesheetEl = $(\"\");\n $(\"head\").append(stylesheetEl);\n }\n return stylesheetEl.attr(\"href\", \"/\" + window._version + \"/styles/theme-\" + themeName + \".css\");\n }\n };\n });\n\n angular.module(\"taigaCommon\").service(\"tgThemeService\", ThemeService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user.service.coffee\n */\n\n(function() {\n var UserService, bindMethods, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n bindMethods = taiga.bindMethods;\n\n UserService = (function(superClass) {\n extend(UserService, superClass);\n\n UserService.$inject = [\"tgResources\"];\n\n function UserService(rs) {\n this.rs = rs;\n bindMethods(this);\n }\n\n UserService.prototype.getUserByUserName = function(username) {\n return this.rs.users.getUserByUsername(username);\n };\n\n UserService.prototype.getContacts = function(userId) {\n return this.rs.users.getContacts(userId);\n };\n\n UserService.prototype.getLiked = function(userId, pageNumber, objectType, textQuery) {\n return this.rs.users.getLiked(userId, pageNumber, objectType, textQuery);\n };\n\n UserService.prototype.getVoted = function(userId, pageNumber, objectType, textQuery) {\n return this.rs.users.getVoted(userId, pageNumber, objectType, textQuery);\n };\n\n UserService.prototype.getWatched = function(userId, pageNumber, objectType, textQuery) {\n return this.rs.users.getWatched(userId, pageNumber, objectType, textQuery);\n };\n\n UserService.prototype.getStats = function(userId) {\n return this.rs.users.getStats(userId);\n };\n\n UserService.prototype.attachUserContactsToProjects = function(userId, projects) {\n return this.getContacts(userId).then(function(contacts) {\n projects = projects.map(function(project) {\n var contactsFiltered;\n contactsFiltered = contacts.filter(function(contact) {\n var contactId;\n contactId = contact.get(\"id\");\n return project.get('members').indexOf(contactId) !== -1;\n });\n project = project.set(\"contacts\", contactsFiltered);\n return project;\n });\n return projects;\n });\n };\n\n return UserService;\n\n })(taiga.Service);\n\n angular.module(\"taigaCommon\").service(\"tgUserService\", UserService);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: xhrError.service.coffee\n */\n\n(function() {\n var xhrError,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n xhrError = (function(superClass) {\n extend(xhrError, superClass);\n\n xhrError.$inject = [\"$q\", \"$location\", \"$tgNavUrls\"];\n\n function xhrError(q, location, navUrls) {\n this.q = q;\n this.location = location;\n this.navUrls = navUrls;\n }\n\n xhrError.prototype.notFound = function() {\n this.location.path(this.navUrls.resolve(\"not-found\"));\n return this.location.replace();\n };\n\n xhrError.prototype.permissionDenied = function() {\n this.location.path(this.navUrls.resolve(\"permission-denied\"));\n return this.location.replace();\n };\n\n xhrError.prototype.response = function(xhr) {\n if (xhr) {\n if (xhr.status === 404) {\n this.notFound();\n } else if (xhr.status === 403) {\n this.permissionDenied();\n }\n }\n return this.q.reject(xhr);\n };\n\n return xhrError;\n\n })(taiga.Service);\n\n angular.module(\"taigaCommon\").service(\"tgXhrErrorService\", xhrError);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-attachment.directive.coffee\n */\n\n(function() {\n var UserTimelineAttachmentDirective;\n\n UserTimelineAttachmentDirective = function(template, $compile) {\n var isImage, link, validFileExtensions;\n validFileExtensions = [\".jpg\", \".jpeg\", \".bmp\", \".gif\", \".png\"];\n isImage = function(url) {\n url = url.toLowerCase();\n return _.some(validFileExtensions, function(extension) {\n return url.indexOf(extension, url - extension.length) !== -1;\n });\n };\n link = function(scope, el) {\n var is_image, templateHtml;\n is_image = isImage(scope.attachment.get('url'));\n if (is_image) {\n templateHtml = template.get(\"user-timeline/user-timeline-attachment/user-timeline-attachment-image.html\");\n } else {\n templateHtml = template.get(\"user-timeline/user-timeline-attachment/user-timeline-attachment.html\");\n }\n el.html(templateHtml);\n $compile(el.contents())(scope);\n return el.find(\"img\").error(function() {\n return this.remove();\n });\n };\n return {\n link: link,\n scope: {\n attachment: \"=tgUserTimelineAttachment\"\n }\n };\n };\n\n UserTimelineAttachmentDirective.$inject = [\"$tgTemplate\", \"$compile\"];\n\n angular.module(\"taigaUserTimeline\").directive(\"tgUserTimelineAttachment\", UserTimelineAttachmentDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-item-title.service.coffee\n */\n\n(function() {\n var UserTimelineItemTitle, unslugify;\n\n unslugify = this.taiga.unslugify;\n\n UserTimelineItemTitle = (function() {\n UserTimelineItemTitle.$inject = [\"$translate\", \"$sce\"];\n\n UserTimelineItemTitle.prototype._fieldTranslationKey = {\n 'status': 'COMMON.FIELDS.STATUS',\n 'subject': 'COMMON.FIELDS.SUBJECT',\n 'description_diff': 'COMMON.FIELDS.DESCRIPTION',\n 'points': 'COMMON.FIELDS.POINTS',\n 'assigned_to': 'COMMON.FIELDS.ASSIGNED_TO',\n 'severity': 'ISSUES.FIELDS.SEVERITY',\n 'priority': 'ISSUES.FIELDS.PRIORITY',\n 'type': 'ISSUES.FIELDS.TYPE',\n 'is_iocaine': 'TASK.FIELDS.IS_IOCAINE',\n 'is_blocked': 'COMMON.FIELDS.IS_BLOCKED'\n };\n\n UserTimelineItemTitle.prototype._params = {\n username: function(timeline, event) {\n var title_attr, url, user;\n user = timeline.getIn(['data', 'user']);\n if (user.get('is_profile_visible')) {\n title_attr = this.translate.instant('COMMON.SEE_USER_PROFILE', {\n username: user.get('username')\n });\n url = \"user-profile:username=timeline.getIn(['data', 'user', 'username'])\";\n return this._getLink(url, user.get('name'), title_attr);\n } else {\n return this._getUsernameSpan(user.get('name'));\n }\n },\n field_name: function(timeline, event) {\n var field_name;\n field_name = timeline.getIn(['data', 'value_diff', 'key']);\n return this.translate.instant(this._fieldTranslationKey[field_name]);\n },\n project_name: function(timeline, event) {\n var url;\n url = \"project:project=timeline.getIn(['data', 'project', 'slug'])\";\n return this._getLink(url, timeline.getIn([\"data\", \"project\", \"name\"]));\n },\n new_value: function(timeline, event) {\n var new_value, value;\n if (_.isArray(timeline.getIn([\"data\", \"value_diff\", \"value\"]).toJS())) {\n value = timeline.getIn([\"data\", \"value_diff\", \"value\"]).get(1);\n if (value === null && timeline.getIn([\"data\", \"value_diff\", \"key\"]) === 'assigned_to') {\n value = this.translate.instant('ACTIVITY.VALUES.UNASSIGNED');\n }\n new_value = value;\n } else {\n new_value = timeline.getIn([\"data\", \"value_diff\", \"value\"]).first().get(1);\n }\n return _.escape(new_value);\n },\n sprint_name: function(timeline, event) {\n var url;\n url = \"project-taskboard:project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['data', 'milestone', 'slug'])\";\n return this._getLink(url, timeline.getIn(['data', 'milestone', 'name']));\n },\n us_name: function(timeline, event) {\n var event_us, obj, text, url;\n obj = this._getTimelineObj(timeline, event).get('userstory');\n event_us = {\n obj: 'parent_userstory'\n };\n url = this._getDetailObjUrl(event_us);\n text = '#' + obj.get('ref') + ' ' + obj.get('subject');\n return this._getLink(url, text);\n },\n obj_name: function(timeline, event) {\n var obj, text, url;\n obj = this._getTimelineObj(timeline, event);\n url = this._getDetailObjUrl(event);\n if (event.obj === 'wikipage') {\n text = unslugify(obj.get('slug'));\n } else if (event.obj === 'milestone') {\n text = obj.get('name');\n } else {\n text = '#' + obj.get('ref') + ' ' + obj.get('subject');\n }\n return this._getLink(url, text);\n },\n role_name: function(timeline, event) {\n return _.escape(timeline.getIn(['data', 'value_diff', 'value']).keySeq().first());\n }\n };\n\n function UserTimelineItemTitle(translate, sce) {\n this.translate = translate;\n this.sce = sce;\n }\n\n UserTimelineItemTitle.prototype._translateTitleParams = function(param, timeline, event) {\n return this._params[param].call(this, timeline, event);\n };\n\n UserTimelineItemTitle.prototype._getTimelineObj = function(timeline, event) {\n return timeline.getIn(['data', event.obj]);\n };\n\n UserTimelineItemTitle.prototype._getDetailObjUrl = function(event) {\n var url;\n url = {\n \"issue\": [\"project-issues-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"],\n \"wikipage\": [\"project-wiki-page\", \":project=timeline.getIn(['data', 'project', 'slug']),slug=timeline.getIn(['obj', 'slug'])\"],\n \"task\": [\"project-tasks-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"],\n \"userstory\": [\"project-userstories-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'ref'])\"],\n \"parent_userstory\": [\"project-userstories-detail\", \":project=timeline.getIn(['data', 'project', 'slug']),ref=timeline.getIn(['obj', 'userstory', 'ref'])\"],\n \"milestone\": [\"project-taskboard\", \":project=timeline.getIn(['data', 'project', 'slug']),sprint=timeline.getIn(['obj', 'slug'])\"]\n };\n return url[event.obj][0] + url[event.obj][1];\n };\n\n UserTimelineItemTitle.prototype._getLink = function(url, text, title) {\n title = title || text;\n return $('').attr('tg-nav', url).text(text).attr('title', title).prop('outerHTML');\n };\n\n UserTimelineItemTitle.prototype._getUsernameSpan = function(text) {\n var title;\n title = title || text;\n return $('').addClass('username').text(text).prop('outerHTML');\n };\n\n UserTimelineItemTitle.prototype._getParams = function(timeline, event, timeline_type) {\n var params;\n params = {};\n timeline_type.translate_params.forEach((function(_this) {\n return function(param) {\n return params[param] = _this._translateTitleParams(param, timeline, event);\n };\n })(this));\n return params;\n };\n\n UserTimelineItemTitle.prototype.getTitle = function(timeline, event, type) {\n var params, paramsKeys, translation;\n params = this._getParams(timeline, event, type);\n paramsKeys = {};\n Object.keys(params).forEach(function(key) {\n return paramsKeys[key] = '{{' + key + '}}';\n });\n translation = this.translate.instant(type.key, paramsKeys);\n Object.keys(params).forEach(function(key) {\n var find;\n find = '{{' + key + '}}';\n return translation = translation.replace(new RegExp(find, 'g'), params[key]);\n });\n return translation;\n };\n\n return UserTimelineItemTitle;\n\n })();\n\n angular.module(\"taigaUserTimeline\").service(\"tgUserTimelineItemTitle\", UserTimelineItemTitle);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-item-type.service.coffee\n */\n\n(function() {\n var UserTimelineType, timelineType;\n\n timelineType = function(timeline, event) {\n var types;\n types = [\n {\n check: function(timeline, event) {\n return event.obj === 'membership';\n },\n key: 'TIMELINE.NEW_MEMBER',\n translate_params: ['project_name'],\n member: function(timeline) {\n return Immutable.Map({\n user: timeline.getIn(['data', 'user']),\n role: timeline.getIn(['data', 'role'])\n });\n }\n }, {\n check: function(timeline, event) {\n return event.obj === 'project' && event.type === 'create';\n },\n key: 'TIMELINE.NEW_PROJECT',\n translate_params: ['username', 'project_name'],\n description: function(timeline) {\n return timeline.getIn(['data', 'project', 'description']);\n }\n }, {\n check: function(timeline, event) {\n return event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'attachments';\n },\n key: 'TIMELINE.UPLOAD_ATTACHMENT',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'userstory' && event.type === 'create';\n },\n key: 'TIMELINE.US_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'issue' && event.type === 'create';\n },\n key: 'TIMELINE.ISSUE_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'wikipage' && event.type === 'create';\n },\n key: 'TIMELINE.WIKI_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'create' && !timeline.getIn(['data', 'task', 'userstory']);\n },\n key: 'TIMELINE.TASK_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'create' && timeline.getIn(['data', 'task', 'userstory']);\n },\n key: 'TIMELINE.TASK_CREATED_WITH_US',\n translate_params: ['username', 'project_name', 'obj_name', 'us_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'milestone' && event.type === 'create';\n },\n key: 'TIMELINE.MILESTONE_CREATED',\n translate_params: ['username', 'project_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return timeline.getIn(['data', 'comment']) && event.obj === 'userstory';\n },\n key: 'TIMELINE.NEW_COMMENT_US',\n translate_params: ['username', 'obj_name'],\n description: function(timeline) {\n var text;\n text = timeline.getIn(['data', 'comment_html']);\n return $($.parseHTML(text)).text();\n }\n }, {\n check: function(timeline, event) {\n return timeline.getIn(['data', 'comment']) && event.obj === 'issue';\n },\n key: 'TIMELINE.NEW_COMMENT_ISSUE',\n translate_params: ['username', 'obj_name'],\n description: function(timeline) {\n var text;\n text = timeline.getIn(['data', 'comment_html']);\n return $($.parseHTML(text)).text();\n }\n }, {\n check: function(timeline, event) {\n return timeline.getIn(['data', 'comment']) && event.obj === 'task';\n },\n key: 'TIMELINE.NEW_COMMENT_TASK',\n translate_params: ['username', 'obj_name'],\n description: function(timeline) {\n var text;\n text = timeline.getIn(['data', 'comment_html']);\n return $($.parseHTML(text)).text();\n }\n }, {\n check: function(timeline, event) {\n return timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'moveInBacklog' && timeline.hasIn(['data', 'value_diff', 'value', 'backlog_order']) && event.type === 'change';\n },\n key: 'TIMELINE.US_MOVED',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n if (timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'moveInBacklog' && event.type === 'change' && event.obj === 'userstory') {\n return timeline.getIn(['data', 'value_diff', 'value', 'milestone']).get(1) === null;\n }\n return false;\n },\n key: 'TIMELINE.US_REMOVED_FROM_MILESTONE',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'moveInBacklog' && event.type === 'change' && event.obj === 'userstory';\n },\n key: 'TIMELINE.US_ADDED_MILESTONE',\n translate_params: ['username', 'obj_name', 'sprint_name']\n }, {\n check: function(timeline, event) {\n if (timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'blocked' && event.type === 'change') {\n return timeline.getIn(['data', 'value_diff', 'value', 'is_blocked']).get(1) === true;\n }\n return false;\n },\n key: 'TIMELINE.BLOCKED',\n translate_params: ['username', 'obj_name'],\n description: function(timeline) {\n var text;\n if (timeline.hasIn(['data', 'value_diff', 'value', 'blocked_note_html'])) {\n text = timeline.getIn(['data', 'value_diff', 'value', 'blocked_note_html']).get(1);\n return $($.parseHTML(text)).text();\n } else {\n return false;\n }\n }\n }, {\n check: function(timeline, event) {\n if (timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'blocked' && event.type === 'change') {\n return timeline.getIn(['data', 'value_diff', 'value', 'is_blocked']).get(1) === false;\n }\n return false;\n },\n key: 'TIMELINE.UNBLOCKED',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'milestone' && event.type === 'change';\n },\n key: 'TIMELINE.MILESTONE_UPDATED',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'wikipage' && event.type === 'change';\n },\n key: 'TIMELINE.WIKI_UPDATED',\n translate_params: ['username', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'userstory' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'points';\n },\n key: 'TIMELINE.US_UPDATED_POINTS',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value', 'role_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'userstory' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.US_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'userstory' && event.type === 'change';\n },\n key: 'TIMELINE.US_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'issue' && event.type === 'change' && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.ISSUE_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'issue' && event.type === 'change';\n },\n key: 'TIMELINE.ISSUE_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'change' && !timeline.getIn(['data', 'task', 'userstory']) && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.TASK_UPDATED',\n translate_params: ['username', 'field_name', 'obj_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'change' && timeline.getIn(['data', 'task', 'userstory']) && timeline.hasIn(['data', 'value_diff']) && timeline.getIn(['data', 'value_diff', 'key']) === 'description_diff';\n },\n key: 'TIMELINE.TASK_UPDATED_WITH_US',\n translate_params: ['username', 'field_name', 'obj_name', 'us_name']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'change' && !timeline.getIn(['data', 'task', 'userstory']);\n },\n key: 'TIMELINE.TASK_UPDATED_WITH_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'task' && event.type === 'change' && timeline.getIn(['data', 'task', 'userstory']);\n },\n key: 'TIMELINE.TASK_UPDATED_WITH_US_NEW_VALUE',\n translate_params: ['username', 'field_name', 'obj_name', 'us_name', 'new_value']\n }, {\n check: function(timeline, event) {\n return event.obj === 'user' && event.type === 'create';\n },\n key: 'TIMELINE.NEW_USER',\n translate_params: ['username']\n }\n ];\n return _.find(types, function(obj) {\n return obj.check(timeline, event);\n });\n };\n\n UserTimelineType = (function() {\n function UserTimelineType() {}\n\n UserTimelineType.prototype.getType = function(timeline, event) {\n return timelineType(timeline, event);\n };\n\n return UserTimelineType;\n\n })();\n\n angular.module(\"taigaUserTimeline\").service(\"tgUserTimelineItemType\", UserTimelineType);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-item.directive.coffee\n */\n\n(function() {\n var UserTimelineItemDirective;\n\n UserTimelineItemDirective = function() {\n return {\n templateUrl: \"user-timeline/user-timeline-item/user-timeline-item.html\",\n scope: {\n timeline: \"=tgUserTimelineItem\"\n }\n };\n };\n\n angular.module(\"taigaUserTimeline\").directive(\"tgUserTimelineItem\", UserTimelineItemDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline-pagination-sequence.service.coffee\n */\n\n(function() {\n var UserTimelinePaginationSequence;\n\n UserTimelinePaginationSequence = function() {\n var obj;\n obj = {};\n obj.generate = function(config) {\n var getContent, items, next, page;\n page = 1;\n items = Immutable.List();\n config.minItems = config.minItems || 20;\n next = function() {\n items = Immutable.List();\n return getContent();\n };\n getContent = function() {\n return config.fetch(page).then(function(response) {\n var data;\n page++;\n data = response.get(\"data\");\n if (config.filter) {\n data = config.filter(data);\n }\n if (config.map) {\n data = data.map(config.map);\n }\n items = items.concat(data);\n if (items.size < config.minItems && response.get(\"next\")) {\n return getContent();\n }\n return Immutable.Map({\n items: items,\n next: response.get(\"next\")\n });\n });\n };\n return {\n next: function() {\n return next();\n }\n };\n };\n return obj;\n };\n\n angular.module(\"taigaUserTimeline\").factory(\"tgUserTimelinePaginationSequenceService\", UserTimelinePaginationSequence);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Andrey Antukh \n * Copyright (C) 2014-2016 Jesús Espino Garcia \n * Copyright (C) 2014-2016 David Barragán Merino \n * Copyright (C) 2014-2016 Alejandro Alonso \n * Copyright (C) 2014-2016 Juan Francisco Alcántara \n * Copyright (C) 2014-2016 Xavi Julian \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: modules/profile/profile-timeline/profile-timeline.controller.coffee\n */\n\n(function() {\n var UserTimelineController, mixOf, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n mixOf = this.taiga.mixOf;\n\n UserTimelineController = (function(superClass) {\n extend(UserTimelineController, superClass);\n\n UserTimelineController.$inject = [\"tgUserTimelineService\"];\n\n function UserTimelineController(userTimelineService) {\n this.userTimelineService = userTimelineService;\n this.timelineList = Immutable.List();\n this.scrollDisabled = false;\n this.timeline = null;\n if (this.projectId) {\n this.timeline = this.userTimelineService.getProjectTimeline(this.projectId);\n } else if (this.currentUser) {\n this.timeline = this.userTimelineService.getProfileTimeline(this.user.get(\"id\"));\n } else {\n this.timeline = this.userTimelineService.getUserTimeline(this.user.get(\"id\"));\n }\n }\n\n UserTimelineController.prototype.loadTimeline = function() {\n this.scrollDisabled = true;\n return this.timeline.next().then((function(_this) {\n return function(response) {\n _this.timelineList = _this.timelineList.concat(response.get(\"items\"));\n if (response.get(\"next\")) {\n _this.scrollDisabled = false;\n }\n return _this.timelineList;\n };\n })(this));\n };\n\n return UserTimelineController;\n\n })(mixOf(taiga.Controller, taiga.PageMixin, taiga.FiltersMixin));\n\n angular.module(\"taigaUserTimeline\").controller(\"UserTimeline\", UserTimelineController);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline.directive.coffee\n */\n\n(function() {\n var UserTimelineDirective;\n\n UserTimelineDirective = function() {\n return {\n templateUrl: \"user-timeline/user-timeline/user-timeline.html\",\n controller: \"UserTimeline\",\n controllerAs: \"vm\",\n scope: {\n projectId: \"=projectid\",\n user: \"=\",\n currentUser: \"=\"\n },\n bindToController: true\n };\n };\n\n angular.module(\"taigaProfile\").directive(\"tgUserTimeline\", UserTimelineDirective);\n\n}).call(this);\n\n\n/*\n * Copyright (C) 2014-2016 Taiga Agile LLC \n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the GNU Affero General Public License as\n * published by the Free Software Foundation, either version 3 of the\n * License, or (at your option) any later version.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU Affero General Public License for more details.\n *\n * You should have received a copy of the GNU Affero General Public License\n * along with this program. If not, see .\n *\n * File: user-timeline.service.coffee\n */\n\n(function() {\n var UserTimelineService, taiga,\n extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },\n hasProp = {}.hasOwnProperty;\n\n taiga = this.taiga;\n\n UserTimelineService = (function(superClass) {\n extend(UserTimelineService, superClass);\n\n UserTimelineService.$inject = [\"tgResources\", \"tgUserTimelinePaginationSequenceService\", \"tgUserTimelineItemType\", \"tgUserTimelineItemTitle\"];\n\n function UserTimelineService(rs, userTimelinePaginationSequenceService, userTimelineItemType, userTimelineItemTitle) {\n this.rs = rs;\n this.userTimelinePaginationSequenceService = userTimelinePaginationSequenceService;\n this.userTimelineItemType = userTimelineItemType;\n this.userTimelineItemTitle = userTimelineItemTitle;\n }\n\n UserTimelineService.prototype._valid_fields = ['status', 'subject', 'description_diff', 'assigned_to', 'points', 'severity', 'priority', 'type', 'attachments', 'is_iocaine', 'content_diff', 'name', 'estimated_finish', 'estimated_start', 'blocked', 'moveInBacklog', 'milestone'];\n\n UserTimelineService.prototype._invalid = [\n {\n check: function(timeline) {\n var fieldKey, value_diff;\n value_diff = timeline.get(\"data\").get(\"value_diff\");\n if (value_diff) {\n fieldKey = value_diff.get('key');\n if (this._valid_fields.indexOf(fieldKey) === -1) {\n return true;\n } else if (fieldKey === 'attachments' && value_diff.get('value').get('new').size === 0) {\n return true;\n }\n }\n return false;\n }\n }, {\n check: function(timeline) {\n var event, value_diff;\n event = timeline.get('event_type').split(\".\");\n value_diff = timeline.get(\"data\").get(\"value_diff\");\n return event[2] === 'change' && value_diff === void 0;\n }\n }, {\n check: function(timeline) {\n var event;\n event = timeline.get('event_type').split(\".\");\n return event[2] === 'delete';\n }\n }, {\n check: function(timeline) {\n var event;\n event = timeline.get('event_type').split(\".\");\n return event[1] === 'project' && event[2] === 'change';\n }\n }, {\n check: function(timeline) {\n return !!timeline.get(\"data\").get(\"comment_deleted\");\n }\n }, {\n check: function(timeline) {\n var event, value_diff;\n event = timeline.get('event_type').split(\".\");\n value_diff = timeline.get(\"data\").get(\"value_diff\");\n if (value_diff && event[1] === \"task\" && event[2] === \"change\" && value_diff.get(\"key\") === \"milestone\") {\n return timeline.get(\"data\").get(\"value_diff\").get(\"value\");\n }\n return false;\n }\n }\n ];\n\n UserTimelineService.prototype._isInValidTimeline = function(timeline) {\n return _.some(this._invalid, (function(_this) {\n return function(invalid) {\n return invalid.check.call(_this, timeline);\n };\n })(this));\n };\n\n UserTimelineService.prototype._parseEventType = function(event_type) {\n event_type = event_type.split(\".\");\n return {\n section: event_type[0],\n obj: event_type[1],\n type: event_type[2]\n };\n };\n\n UserTimelineService.prototype._getTimelineObject = function(timeline, event) {\n if (timeline.get('data').get(event.obj)) {\n return timeline.get('data').get(event.obj);\n }\n };\n\n UserTimelineService.prototype._attachExtraInfoToTimelineEntry = function(timeline, event, type) {\n var title;\n title = this.userTimelineItemTitle.getTitle(timeline, event, type);\n timeline = timeline.set('title_html', title);\n timeline = timeline.set('obj', this._getTimelineObject(timeline, event));\n if (type.description) {\n timeline = timeline.set('description', type.description(timeline));\n }\n if (type.member) {\n timeline = timeline.set('member', type.member(timeline));\n }\n if (timeline.getIn(['data', 'value_diff', 'key']) === 'attachments' && timeline.hasIn(['data', 'value_diff', 'value', 'new'])) {\n timeline = timeline.set('attachments', timeline.getIn(['data', 'value_diff', 'value', 'new']));\n }\n return timeline;\n };\n\n UserTimelineService.prototype._parseTimeline = function(response) {\n var newdata;\n newdata = Immutable.List();\n response.get('data').forEach((function(_this) {\n return function(item) {\n var data, event, newItem, values_diff;\n event = _this._parseEventType(item.get('event_type'));\n data = item.get('data');\n values_diff = data.get('values_diff');\n if (values_diff && values_diff.count()) {\n if (values_diff.has('is_blocked')) {\n values_diff = Immutable.Map({\n 'blocked': values_diff\n });\n }\n if (values_diff.has('milestone')) {\n if (event.obj === 'userstory') {\n values_diff = Immutable.Map({\n 'moveInBacklog': values_diff\n });\n } else {\n values_diff = values_diff.deleteIn(['values_diff', 'milestone']);\n }\n } else if (event.obj === 'milestone') {\n values_diff = Immutable.Map({\n 'milestone': values_diff\n });\n }\n return values_diff.forEach(function(value, key) {\n var newItem, obj;\n obj = Immutable.Map({\n key: key,\n value: value\n });\n newItem = item.setIn(['data', 'value_diff'], obj);\n newItem = newItem.deleteIn(['data', 'values_diff']);\n return newdata = newdata.push(newItem);\n });\n } else {\n newItem = item.deleteIn(['data', 'values_diff']);\n return newdata = newdata.push(newItem);\n }\n };\n })(this));\n return response.set('data', newdata);\n };\n\n UserTimelineService.prototype._addEntyAttributes = function(item) {\n var event, type;\n event = this._parseEventType(item.get('event_type'));\n type = this.userTimelineItemType.getType(item, event);\n return this._attachExtraInfoToTimelineEntry(item, event, type);\n };\n\n UserTimelineService.prototype.getProfileTimeline = function(userId) {\n var config;\n config = {};\n config.fetch = (function(_this) {\n return function(page) {\n return _this.rs.users.getProfileTimeline(userId, page).then(function(response) {\n return _this._parseTimeline(response);\n });\n };\n })(this);\n config.map = (function(_this) {\n return function(obj) {\n return _this._addEntyAttributes(obj);\n };\n })(this);\n config.filter = (function(_this) {\n return function(items) {\n return items.filterNot(function(item) {\n return _this._isInValidTimeline(item);\n });\n };\n })(this);\n return this.userTimelinePaginationSequenceService.generate(config);\n };\n\n UserTimelineService.prototype.getUserTimeline = function(userId) {\n var config;\n config = {};\n config.fetch = (function(_this) {\n return function(page) {\n return _this.rs.users.getUserTimeline(userId, page).then(function(response) {\n return _this._parseTimeline(response);\n });\n };\n })(this);\n config.map = (function(_this) {\n return function(obj) {\n return _this._addEntyAttributes(obj);\n };\n })(this);\n config.filter = (function(_this) {\n return function(items) {\n return items.filterNot(function(item) {\n return _this._isInValidTimeline(item);\n });\n };\n })(this);\n return this.userTimelinePaginationSequenceService.generate(config);\n };\n\n UserTimelineService.prototype.getProjectTimeline = function(projectId) {\n var config;\n config = {};\n config.fetch = (function(_this) {\n return function(page) {\n return _this.rs.projects.getTimeline(projectId, page).then(function(response) {\n return _this._parseTimeline(response);\n });\n };\n })(this);\n config.map = (function(_this) {\n return function(obj) {\n return _this._addEntyAttributes(obj);\n };\n })(this);\n config.filter = (function(_this) {\n return function(items) {\n return items.filterNot(function(item) {\n return _this._isInValidTimeline(item);\n });\n };\n })(this);\n return this.userTimelinePaginationSequenceService.generate(config);\n };\n\n return UserTimelineService;\n\n })(taiga.Service);\n\n angular.module(\"taigaUserTimeline\").service(\"tgUserTimelineService\", UserTimelineService);\n\n}).call(this);\n\n//# sourceMappingURL=maps/app.js.map\n"]} \ No newline at end of file diff --git a/dist/v-1454172424320/js/maps/libs.js.map b/dist/v-1454396495445/js/maps/libs.js.map similarity index 100% rename from dist/v-1454172424320/js/maps/libs.js.map rename to dist/v-1454396495445/js/maps/libs.js.map diff --git a/dist/v-1454172424320/js/templates.js b/dist/v-1454396495445/js/templates.js similarity index 91% rename from dist/v-1454172424320/js/templates.js rename to dist/v-1454396495445/js/templates.js index 3485098..da47771 100644 --- a/dist/v-1454172424320/js/templates.js +++ b/dist/v-1454396495445/js/templates.js @@ -2,9 +2,9 @@ angular.module("templates", []).run(["$templateCache", function($templateCache) $templateCache.put("admin/admin-memberships-row-checkbox.html","\n
\n \"/>\n
\n
"); $templateCache.put("admin/admin-memberships.html","\n
\n \n \n
\n \n
\n \n
\n
\n
\n
\n

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

\n
\n \n

\n
\n
\n
"); $templateCache.put("admin/admin-project-default-values.html","\n
\n \n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n
\n

\n
\n

\n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n
\n
"); -$templateCache.put("admin/admin-project-export.html","\n
\n \n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n
\n

\n
\n

\n
\n
\n
\n
\"{{
\n

\n

\n
\n
\n
"); +$templateCache.put("admin/admin-project-export.html","\n
\n \n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n
\n

\n
\n

\n
\n
\n
\n
\"{{
\n

\n

\n
\n
\n
"); $templateCache.put("admin/admin-project-modules.html","\n
\n \n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n
\n

\n
\n
\n
\n
\n
\n
\n

\n
\n \n \n
\n
\n
\n
\n
\n
\n

\n
\n \n \n
\n
\n
\n
\n
\n
\n

\n
\n \n \n
\n
\n
\n
\n
\n
\n

\n
\n \n \n
\n
\n
\n
\n
\n
\n

\n
\n \n \n
\n
\n \n \n \n
\n
\n
\n \n
\n
\n
"); -$templateCache.put("admin/admin-project-profile.html","\n
\n \n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n
\n

\n
\n
\n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
{{ \'ADMIN.PROJECT_PROFILE.RECRUITING\' | translate }}\n \n\n\n
\n \n
\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n{{\'ADMIN.PROJECT_PROFILE.PRIVATE_OR_PUBLIC\' | translate }}\n
\n {{ \'ADMIN.PROJECT_PROFILE.DELETE\' | translate }}\n
\n
\n
\n
\n
\n
\n

\n

\n
\n
\n
"); +$templateCache.put("admin/admin-project-profile.html","\n
\n \n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n
\n

\n
\n
\n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n
{{ \'ADMIN.PROJECT_PROFILE.RECRUITING\' | translate }}\n \n\n\n
\n \n
\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n{{\'ADMIN.PROJECT_PROFILE.PRIVATE_OR_PUBLIC\' | translate }}\n
\n {{ \'ADMIN.PROJECT_PROFILE.DELETE\' | translate }}\n
\n
\n
\n
\n
\n
\n

\n

\n
\n
\n
"); $templateCache.put("admin/admin-project-reports.html","\n
\n \n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n
\n

\n
\n

\n
\n

\n
\n
\n
\n
\n
\n
"); $templateCache.put("admin/admin-project-values-custom-fields.html","\n
\n \n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n

\n
\n

\n
\n
\n
\n

{{ customFieldSectionTitle | translate }}

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ attr.name }}
\n
{{ attr.description }}
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

{{ customFieldSectionTitle | translate }}

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ attr.name }}
\n
{{ attr.description }}
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

{{ customFieldSectionTitle | translate }}

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ attr.name }}
\n
{{ attr.description }}
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
"); $templateCache.put("admin/admin-project-values-points.html","\n
\n \n \n
\n \n
\n
\n \n
\n \n
\n
\n
\n
\n

\n
\n

\n
\n
\n
\n

{{sectionName | translate}}

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ value.name }}
\n
{{ value.value }}
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
"); @@ -20,12 +20,12 @@ $templateCache.put("admin/admin-third-parties-webhooks.html","\n< $templateCache.put("admin/memberships-row-avatar.html","\n
\" alt=\"<%- full_name %>\"/>\n
<%- full_name %>\n
<%- pending %><%- email %>
\n
\n
"); $templateCache.put("admin/project-csv.html","\n
\n
\n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
"); $templateCache.put("auth/change-password-from-recovery.html","\n
\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n\n\n
\n

Taiga

\n
\n


\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
"); -$templateCache.put("auth/forgot-password.html","\n
\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n\n\n
\n

Taiga

\n
\n


\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
"); +$templateCache.put("auth/forgot-password.html","\n
\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n\n\n
\n

Taiga

\n
\n


\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
"); $templateCache.put("auth/invitation.html","\n
\n
\n
\n

\n

\n
\n
\n

\n
\n \n
\n
\n \n \n
\n
\n
\n
\n
\n

\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
"); $templateCache.put("auth/login-text.html","\n

 \" title=\"{{"AUTH.REGISTER" | translate}}\" translate=\"AUTH.CREATE_ACCOUNT\">

"); -$templateCache.put("auth/login.html","\n
\n
\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n\n\n
\n

Taiga

\n

\n
\n
\n
\n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n \n
\n
\n
\n
"); +$templateCache.put("auth/login.html","\n
\n
\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n\n\n
\n

Taiga

\n

\n
\n
\n
\n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n \n
\n
\n
\n
"); $templateCache.put("auth/register.html","\n
\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n\n\n
\n

Taiga

\n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
"); -$templateCache.put("backlog/backlog.html","\n
\n \n \n
\n
\n

\n
\n
\n \n
\n
\n
\n
\n

\n
\n
    \n
  • \n
  • \n
\n
\n
\n
\n
\n
\n
\n
\n
\n

\n
\n
\n
\n
\n
\n
--
\n
--
\n
--
\n
--
\n
\n\n \n \n \n\n\n
\n
\n
\n
\n\n \n \n \n\n\n
\n
\n

\n

{{\'BACKLOG.CUSTOMIZE_GRAPH_TEXT\' | translate}} {{\'BACKLOG.CUSTOMIZE_GRAPH_ADMIN\' | translate}}

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
{{ ::us.total_voters }}
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"{{\'BACKLOG.EMPTY\'\n

\n
\n
\n \n
\n
\n

\n \n\n\n
\n
\"{{\'BACKLOG.SPRINTS.EMPTY\'\n

\n
\n
\n
\n
\n
\n
{{ \'BACKLOG.SPRINTS.WARNING_EMPTY_SPRINT_ANONYMOUS\' | translate }}{{ \'BACKLOG.SPRINTS.WARNING_EMPTY_SPRINT\' | translate }}
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ \'BACKLOG.SPRINTS.WARNING_EMPTY_SPRINT_ANONYMOUS\' | translate }}{{ \'BACKLOG.SPRINTS.WARNING_EMPTY_SPRINT\' | translate }}
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n

\n
\n \n
\n \n
\n
\n
\n
\n

\n
\n \n \n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
"); +$templateCache.put("backlog/backlog.html","\n
\n \n \n
\n
\n

\n
\n
\n \n
\n
\n
\n
\n

\n
\n
    \n
  • \n
  • \n
\n
\n
\n
\n
\n
\n
\n
\n
\n

\n
\n
\n
\n
\n
\n
--
\n
--
\n
--
\n
--
\n
\n\n \n \n \n\n\n
\n
\n
\n
\n\n \n \n \n\n\n
\n
\n

\n

{{\'BACKLOG.CUSTOMIZE_GRAPH_TEXT\' | translate}} {{\'BACKLOG.CUSTOMIZE_GRAPH_ADMIN\' | translate}}

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
{{ ::us.total_voters }}
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"{{\'BACKLOG.EMPTY\'\n

\n
\n
\n \n
\n
\n

\n \n\n\n
\n
\"{{\'BACKLOG.SPRINTS.EMPTY\'\n

\n
\n
\n
\n
\n
\n
{{ \'BACKLOG.SPRINTS.WARNING_EMPTY_SPRINT_ANONYMOUS\' | translate }}{{ \'BACKLOG.SPRINTS.WARNING_EMPTY_SPRINT\' | translate }}
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ \'BACKLOG.SPRINTS.WARNING_EMPTY_SPRINT_ANONYMOUS\' | translate }}{{ \'BACKLOG.SPRINTS.WARNING_EMPTY_SPRINT\' | translate }}
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n

\n
\n \n
\n \n
\n
\n
\n
\n

\n
\n \n \n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
"); $templateCache.put("backlog/filter-selected.html","<% _.each(filters, function(f) { %>\" data-id=\"<%- f.id %>\" class=\"single-filter selected\">\" class=\"name\"><%- f.name %><% }) %>"); $templateCache.put("backlog/filters.html","\n<% _.each(filters, function(f) { %>\n<% if (f.selected) { %>\" data-id=\"<%- f.id %>\" class=\"single-filter active\">\" class=\"name\"><%- f.name %><% if (f.count){ %><%- f.count %><% } %><% } else { %>\" data-id=\"<%- f.id %>\" class=\"single-filter\">\" class=\"name\"><%- f.name %><% if (f.count){ %><%- f.count %><% } %><% } %>\n<% }) %>"); $templateCache.put("backlog/progress-bar.html","\n
\n
%\" class=\"project-points-progress\">
\n
%\" class=\"closed-points-progress\">
"); @@ -36,9 +36,9 @@ $templateCache.put("contrib/main.html","\n
\n
\n <% if (description){ %><%- description %><% } %>\n
\n
<% if (type==\"text\") { %>\n \"/><% } else if (type==\"multiline\") { %>\n <% } else if (type==\"date\") { %>\n \"/><% } else { %>\n \"/><% } %>\n
\n
\n"); $templateCache.put("custom-attributes/custom-attribute-value.html","\n
\n
<%- name %><% if (description){ %><%- description %><% } %>
\n
<%- value %>
<% if (isEditable) { %>\n
<% } %>\n
"); $templateCache.put("custom-attributes/custom-attributes-values.html","\n
\n \n
open<% } %>\">\n
\">
\n
\n
"); -$templateCache.put("error/error.html","\n
\n
\n \"TAIGA\"\n

Taiga

\n

\n
\n
"); -$templateCache.put("error/not-found.html","\n
\n
\n \"TAIGA\"\n

\n

\n
\n
"); -$templateCache.put("error/permission-denied.html","\n
\n
\n \"TAIGA\"\n

\n

\n
\n
"); +$templateCache.put("error/error.html","\n
\n
\n \"TAIGA\"\n

Taiga

\n

\n
\n
"); +$templateCache.put("error/not-found.html","\n
\n
\n \"TAIGA\"\n

\n

\n
\n
"); +$templateCache.put("error/permission-denied.html","\n
\n
\n \"TAIGA\"\n

\n

\n
\n
"); $templateCache.put("issue/iocaine-button.html","\n
\n \n \n
"); $templateCache.put("issue/issue-paginator.html","\n
    <% if (showPrevious) { %>\n
  • <% } %>\n <% _.each(pages, function(item) { %>\n
  • \"><% if (item.type === \"page\") { %>\"><%- item.num %><% } else if (item.type === \"page-active\") { %><%- item.num %><% } else { %>...<% } %>
  • <% }); %>\n <% if (showNext) { %>\n
  • <% } %>\n
"); $templateCache.put("issue/issue-priority-button.html","\n
clickable<% }%>\">\" class=\"level\"><%- priority.name %><% if(editable){ %><% }%>\n \n
"); @@ -49,13 +49,13 @@ $templateCache.put("issue/issues-detail.html","\n
\" data-id=\"<%- f.id %>\" class=\"single-filter selected\">\" class=\"name\"><%- f.name %><% }) %>"); $templateCache.put("issue/issues-filters.html","\n<% _.each(filters, function(f) { %>\n<% if (!f.selected) { %>\" data-id=\"<%- f.id %>\" class=\"single-filter\">\" class=\"name\"><%- f.name %><% if (f.count){ %><%- f.count %><% } %>\n <% if (f.type == \"myFilters\"){ %><% } %><% } %>\n<% }) %>\n"); $templateCache.put("issue/issues-status-button.html","\" ng-click=\"editStatus()\" class=\"detail-status-inner js-edit-status <% if(editable){ %>clickable<% }%>\"><%- status.name %><% if(editable){ %><% }%>\n "); -$templateCache.put("issue/issues.html","\n
\n \n \n
\n
\n

\n
\n
\n \n
\n
\n
\n
\n

\n
\n
    \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ ::issue.total_voters }}
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"{{ISSUES.TABLE.EMPTY.TITLE\n

\n
\n \n
\n
\n
\n
\n
\n

\n
\n \n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n \n
\n \n \n
\n
\n
\n
\n

\n
\n \n
\n \n
\n
\n
"); +$templateCache.put("issue/issues.html","\n
\n \n \n
\n
\n

\n
\n
\n \n
\n
\n
\n
\n

\n
\n
    \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
{{ ::issue.total_voters }}
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"{{ISSUES.TABLE.EMPTY.TITLE\n

\n
\n \n
\n
\n
\n
\n
\n

\n
\n \n
\n
\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n \n
\n \n \n
\n
\n
\n
\n

\n
\n \n
\n \n
\n
\n
"); $templateCache.put("issue/promote-issue-to-us-button.html","\n \n\n"); $templateCache.put("kanban/kanban-task.html","\n
\n
\n
\n
\n

\n
\n
\n

\n

\n

\n
\n
"); $templateCache.put("kanban/kanban.html","\n
\n \n
\n
\n

\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

\n
\n \n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n
\n
\n

\n
\n \n
\n \n
\n
\n
\n
"); $templateCache.put("project/wizard-create-project.html","\n
\n
\n
\n

\n

\n
\n
\n
\n
\n \n \n

{{ template.description }}

\n
\n
\n
\n
\n
\n
\n
\n

\n

\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
"); $templateCache.put("search/lightbox-search.html","\n
\n

\n
\n \n
\n
\n \n
\n
"); -$templateCache.put("search/search.html","\n
\n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n

\n
\n
    \n
  • \n
  • \n
  • \n
  • \n
\n
\n \n \n \n \n
\n
"); +$templateCache.put("search/search.html","\n
\n \n \n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n

\n
\n
    \n
  • \n
  • \n
  • \n
  • \n
\n
\n \n \n \n \n
\n
"); $templateCache.put("task/related-task-create-form.html","\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
"); $templateCache.put("task/related-task-row-edit.html","\n
\n
\n \" placeholder=\"{{\'TASK.PLACEHOLDER_SUBJECT\' | translate}}\"/>\n
\n
\n
\n
\n
\n
\n
\n
\n
"); $templateCache.put("task/related-task-row.html","\n
\n
\n
<%- task.subject %>\" class=\"clickable\">#<%- task.ref %><%- task.subject %>\n
<% if(perms.modify_task) { %><% } %>\n <% if(perms.delete_task) { %><% } %>\n
\n
\n
\n\n
\n
\n
<% if(perms.modify_task) { %><% } %>\n
\n
"); @@ -76,7 +76,7 @@ $templateCache.put("user/cancel-account.html","\n
\n
\n
\n
\n
\n\n \n \n \n \n \n \n \n \n \n\n\n
\n

Taiga

\n
\n

\n

\n
\n
\n \n \n
\n
\n
\n
\n
\n
"); $templateCache.put("user/mail-notifications.html","\n
\n \n
\n \n
\n
\n
\n
\n

{{sectionName | translate}}

\n
\n

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
"); $templateCache.put("user/user-change-password.html","\n
\n \n
\n \n
\n
\n
\n
\n

{{sectionName | translate}}

\n
\n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n
"); -$templateCache.put("user/user-profile.html","\n
\n \n
\n \n
\n
\n
\n
\n
\n

\n
\n
\n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n
\n
\n
"); +$templateCache.put("user/user-profile.html","\n
\n \n
\n \n
\n
\n
\n
\n
\n

\n
\n
\n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n
\n
\n
"); $templateCache.put("wiki/editable-wiki-content.html","\n
\n
\n
\n
\n \n
Attach files by dragging & dropping on the textarea above.
\n
"); $templateCache.put("wiki/wiki-nav.html","\n
\n

\n
\n<% if (addWikiLinkPermission) { %><% } %>"); $templateCache.put("wiki/wiki-summary.html","\n
<%- totalEditions %>
\n
<%- lastModifiedDate %>
\n
\n
\" alt=\"<%- user.name %>\"/>
\n
<%- user.name %>
\n
"); @@ -103,6 +103,12 @@ $templateCache.put("common/estimation/us-estimation-points-per-role.html","\n"); $templateCache.put("common/estimation/us-estimation-total.html","\" class=\"us-points <% if (!editable) { %>not-clickable<% } %>\"><%= text %><% if (editable) { %><% } %>"); $templateCache.put("common/estimation/us-points-roles-popover.html","\n"); +$templateCache.put("common/lightbox/lightbox-assigned-to-users.html","<% if (selected) { %>\n<% } %>\n<% _.each(users, function(user) { %>\n<% }) %>\n<% if (showMore) { %>\n
<% } %>"); +$templateCache.put("common/lightbox/lightbox-assigned-to.html","\n
\n

\n
\n \n
\n
\n
"); +$templateCache.put("common/lightbox/lightbox-attachment-preview.html","\n
"); +$templateCache.put("common/lightbox/lightbox-block.html","\n
\n

\n
\n \n
\n
"); +$templateCache.put("common/lightbox/lightbox-blocking-message-input.html","\n
\n \"/>\n
"); +$templateCache.put("common/lightbox/lightbox-users.html","\n
\n

\n
\n \n
\n
\n
\n
"); $templateCache.put("common/history/history-activity.html","\n
\">\n \n
\n <% if (comment.length > 0) { %>\n <% if ((deleteCommentDate || deleteCommentUser)) { %>\n
\', date: \'<%- deleteCommentDate %>\'}\">
<% } %>\n
\n <%= comment %>\n <% if (!deleteCommentDate && mode !== \"activity\" && canDeleteComment) { %>\" title=\"<%- deleteCommentActionTitle %>\" class=\"icon icon-delete comment-delete\"><% } %>\n
<% } %>\n <% if(changes.length > 0) { %>\n
<% if (mode != \"activity\") { %><%- changesText %><% } %>\n <% _.each(changes, function(change) { %>\n <%= change %>\n <% }) %>\n
<% } %>\n
\n
"); $templateCache.put("common/history/history-base-entries.html","<% if (showMore > 0) { %>\'}\" class=\"show-more show-more-comments\"><% } %>\n<% _.each(entries, function(entry) { %>\n<%= entry %>\n<% }) %>"); $templateCache.put("common/history/history-base.html","\n
\n
    \n
  • \n
  • \n
\n
\n
\n
\">\n
\" tg-toggle-comment=\"tg-toggle-comment\" class=\"add-comment\">\n <% if (mode !== \"edit\") { %>\n
Attach files by dragging & dropping on the textarea above.
\n <% } %>\n
\n
\n
\n
\n
\n
\n
"); @@ -112,17 +118,11 @@ $templateCache.put("common/history/history-change-generic.html","\n
\n
<%- name %>
\n
<% if (removed.length > 0) { %>\n


<%- removed %>

<% } %>\n <% if (added.length > 0) { %>\n


<%- added %>

<% } %>\n
\n
"); $templateCache.put("common/history/history-change-points.html","<% _.each(points, function(point, name) { %>\n
\n
\'}\">
\n
\n


<%- point[0] %>

\n


<%- point[1] %>

\n
\n
<% }); %>"); $templateCache.put("common/history/history-deleted-comment.html","\n
\n
\', date: \'<%- deleteCommentDate %>\'}\">\n
<%= deleteComment %>
\n
<% if (canRestoreComment) { %>\" title=\"{{ \'COMMENTS.RESTORE\' | translate }}\" class=\"comment-restore\"><% } %>\n
"); -$templateCache.put("common/lightbox/lightbox-assigned-to-users.html","<% if (selected) { %>\n<% } %>\n<% _.each(users, function(user) { %>\n<% }) %>\n<% if (showMore) { %>\n
<% } %>"); -$templateCache.put("common/lightbox/lightbox-assigned-to.html","\n
\n

\n
\n \n
\n
\n
"); -$templateCache.put("common/lightbox/lightbox-attachment-preview.html","\n
"); -$templateCache.put("common/lightbox/lightbox-block.html","\n
\n

\n
\n \n
\n
"); -$templateCache.put("common/lightbox/lightbox-blocking-message-input.html","\n
\n \"/>\n
"); -$templateCache.put("common/lightbox/lightbox-users.html","\n
\n

\n
\n \n
\n
\n
\n
"); $templateCache.put("common/popover/popover-related-task-status.html","\n"); $templateCache.put("common/popover/popover-us-status.html","\n"); $templateCache.put("common/tag/lb-tag-line-tags.html","<% _.each(tags, function(tag) { %>\" class=\"tag\"><%- tag.name %><% }); %>"); $templateCache.put("common/tag/lb-tag-line.html","\n
\n"); -$templateCache.put("common/tag/tag-line.html","\n
\n"); +$templateCache.put("common/tag/tag-line.html","\n
\n "); $templateCache.put("common/tag/tags-line-tags.html","<% _.each(tags, function(tag) { %>;\" class=\"tag\"><%- tag.name %><% if (isEditable) { %><% } %><% }); %>"); $templateCache.put("common/wysiwyg/wysiwyg-markitup-preview.html","\n
\n
\n
<%= data %>
\n
\n
"); $templateCache.put("user/lightbox/lightbox-delete-account.html","\n
\n

\n

\n
\n
"); @@ -130,19 +130,19 @@ $templateCache.put("external-apps/external-app.html","\n
\n
\n
\n
\n
\n \n
"); $templateCache.put("navigation-bar/navigation-bar.html","\n"); $templateCache.put("profile/profile.html","\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n
\n
"); -$templateCache.put("components/attachment/attachment-gallery.html","\n"); +$templateCache.put("components/attachment/attachment-gallery.html","\n"); $templateCache.put("components/attachment/attachment.html","\n
\n \n
{{\'ATTACHMENT.DEPRECATED\' | translate}}{{vm.attachment.getIn([\'file\', \'description\'])}}
\n
{{::vm.attachment.getIn([\'file\', \'size\']) | sizeFormat}}
\n
\n \n
\n
\n \n \n
\n
\n
\n
\n
\n
\n
"); -$templateCache.put("components/attachments-full/attachments-full.html","\n
\n
\n

{{vm.attachments.size}}

\n
\n \n \n
\n \n \n
\n
\n
\n
\n
{{\'ATTACHMENT.DROP\' | translate}}
\n
\n
\n
\n
\n \n
\n
\n
\n \n\n{{file.name}}
\n
{{file.size | sizeFormat}}
\n
{{file.progressMessage}}\n
\n
\n
\n
\n
\n
\n \n
\n
\"{{\'COMMON.LOADING\'
\n
{{file.progressMessage}}
\n
\n
\n
"); -$templateCache.put("components/attachments-simple/attachments-simple.html","\n
\n
\n

{{vm.attachments.size}}

\n
\n \n \n
\n
\n
\n
{{\'ATTACHMENT.DROP\' | translate}}
\n
\n
\n
\n
\n \n\n{{attachment.get(\'name\')}}
\n
{{attachment.get(\'size\') | sizeFormat}}
\n \n
\n
\n
"); -$templateCache.put("components/live-announcement/live-announcement.html","\n
\n
\"Loading...\"\n
\n

{{vm.title}}

\n

\n \n\n\n
\n
\n
"); +$templateCache.put("components/attachments-full/attachments-full.html","\n
\n
\n

{{vm.attachments.size}}

\n
\n \n \n
\n \n \n
\n
\n
\n
\n
{{\'ATTACHMENT.DROP\' | translate}}
\n
\n
\n
\n
\n \n
\n
\n
\n \n\n{{file.name}}
\n
{{file.size | sizeFormat}}
\n
{{file.progressMessage}}\n
\n
\n
\n
\n
\n
\n \n
\n
\"{{\'COMMON.LOADING\'
\n
{{file.progressMessage}}
\n
\n
\n
"); +$templateCache.put("components/attachments-simple/attachments-simple.html","\n
\n
\n

{{vm.attachments.size}}

\n
\n \n \n
\n
\n
\n
{{\'ATTACHMENT.DROP\' | translate}}
\n
\n
\n
\n
\n \n\n{{attachment.get(\'name\')}}
\n
{{attachment.get(\'size\') | sizeFormat}}
\n \n
\n
\n
"); +$templateCache.put("components/live-announcement/live-announcement.html","\n
\n
\"Loading...\"\n
\n

{{vm.title}}

\n

\n \n\n\n
\n
\n
"); $templateCache.put("components/project-menu/project-menu.html","\n"); $templateCache.put("components/terms-of-service-and-privacy-policy-notice/terms-of-service-and-privacy-policy-notice.html","\n

"); $templateCache.put("components/vote-button/vote-button.html","\n\n \n\n{{ vm.item.total_voters }}\n\n \n\n{{ ::vm.item.total_voters }}"); $templateCache.put("components/watch-button/watch-button-ticket.html","\n
{{ vm.item.watchers.length }} {{\'COMMON.WATCHERS.WATCHERS\' | translate}}
\n"); $templateCache.put("components/watch-button/watch-button.html","\n\n \n\n{{ vm.item.watchers.length }}\n\n \n\n{{ vm.item.watchers.length }}"); $templateCache.put("discover/discover-home/discover-home.html","\n
\n
\n \n
\n
\n \n \n
\n
\n \n
\n
"); -$templateCache.put("discover/discover-search/discover-search.html","\n
\n
\n \n
\n
\"{{\n

\n
\n
\n
\n
\n \n
\n
    \n
  • \n
    \"{{::project.get(\'name\')}}\"/\n
    \n

    {{project.get(\'name\')}}\n \n\n

    \n

    {{ ::project.get(\'description\') | limitTo:300 }}...

    \n
    \n
    \n
    \n\n \n \n \n\n{{::project.get(\'total_fans\')}}\n \n \n \n \n \n\n{{::project.get(\'total_watchers\')}}\n \n\n{{ ::project.get(\'members\').size }}
    \n
  • \n
{{ \'DISCOVER.VIEW_MORE\' | translate }}\n
\n
\n
"); -$templateCache.put("home/duties/duty.html","\n
\n
\n
\n

{{ ::vm.duty.get(\'projectName\')}}{{ ::vm.getDutyType() }}{{ ::vm.duty.get(\'status_extra_info\').get(\'name\') }}

\n

{{ \'COMMON.BLOCKED\' | translate }} {{ ::duty.get(\'subject\') }}

\n
"); +$templateCache.put("discover/discover-search/discover-search.html","\n
\n
\n \n
\n
\"{{\n

\n
\n
\n
\n
\n \n
\n
    \n
  • \n
    \"{{::project.get(\'name\')}}\"/\n
    \n

    {{project.get(\'name\')}}\n \n\n

    \n

    {{ ::project.get(\'description\') | limitTo:300 }}...

    \n
    \n
    \n
    \n\n \n \n \n\n{{::project.get(\'total_fans\')}}\n \n \n \n \n \n\n{{::project.get(\'total_watchers\')}}\n \n\n{{ ::project.get(\'members\').size }}
    \n
  • \n
{{ \'DISCOVER.VIEW_MORE\' | translate }}\n
\n
\n
"); +$templateCache.put("home/duties/duty.html","\n
\n
\n
\n

{{ ::vm.duty.get(\'projectName\')}}{{ ::vm.getDutyType() }}{{ ::vm.duty.get(\'status_extra_info\').get(\'name\') }}

\n

{{ \'COMMON.BLOCKED\' | translate }} {{ ::duty.get(\'subject\') }}

\n
"); $templateCache.put("home/projects/home-project-list.html","\n
\n
\n
\n
\n
\n
\n \n

{{::project.get(\'description\')| limitTo:100 }}...

\n
\n\n \n \n \n\n{{::project.get(\'total_fans\')}}\n \n \n \n \n \n\n{{::project.get(\'total_watchers\')}}\n \n\n{{ ::project.get(\'members\').size }}\n \n\n
\n
\n
\n
\n
\n\n\n \n \n \n\n\n

\n \n
"); $templateCache.put("home/working-on/empty.html","\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
"); $templateCache.put("home/working-on/working-on.html","\n
\n
\n

{{\"HOME.DASHBOARD\" | translate}}

\n
\n
\n
\n
\n
\n
\n

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n

\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
"); @@ -150,18 +150,18 @@ $templateCache.put("navigation-bar/dropdown-organization-list/dropdown-organizat $templateCache.put("navigation-bar/dropdown-project-list/dropdown-project-list.html","\n \n \n \n \n \n\n\n"); $templateCache.put("navigation-bar/dropdown-user/dropdown-user.html","{{ vm.user.get(\'full_name_display\') }}\"{{\n
\n
    \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
\n
"); $templateCache.put("profile/profile-bar/profile-bar.html","\n
\n
\"{{::vm.user.get(\'full_name\')}}\"
\n \n \n
\n

{{::vm.user.get(\"full_name_display\")}}

\n
@{{::vm.user.get(\"username\")}}
\n

{{::vm.stats.get(\'roles\').join(\", \")}}

\n \n \n \n \n \n \n
\n \n
\n
{{::vm.stats.get(\'total_num_projects\')}}
\n
{{::vm.stats.get(\'total_num_closed_userstories\')}}
\n
{{::vm.stats.get(\'total_num_contacts\')}}
\n
\n \n
{{::vm.user.get(\"bio\") | limitTo:210 }}{{vm.user.get(\"bio\").length < 210 ? \'\' : \'...\'}}
\n
"); -$templateCache.put("profile/profile-contacts/profile-contacts.html","\n
\n
\n
\"Loading...\"/
\n
\n
\n\n \n \n \n\n\n
\n

\n
\n
\n

\n

\n
\n
\n
\"{{::contact.get(\'full_name\')}}\"/\n
\n

{{::contact.get(\'full_name_display\')}}

\n

{{::contact.get(\'roles\').join(\", \")}}

\n

{{::contact.get(\'bio\')}}

\n
\n
\n
"); -$templateCache.put("profile/profile-favs/profile-favs.html","\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"{{
\n
\n
\"{{\n

{{ \'USER.PROFILE_FAVS.EMPTY_TITLE\' | translate }}

\n
\n
"); +$templateCache.put("profile/profile-contacts/profile-contacts.html","\n
\n
\n
\"Loading...\"/
\n
\n
\n\n \n \n \n\n\n
\n

\n
\n
\n

\n

\n
\n
\n
\"{{::contact.get(\'full_name\')}}\"/\n
\n

{{::contact.get(\'full_name_display\')}}

\n

{{::contact.get(\'roles\').join(\", \")}}

\n

{{::contact.get(\'bio\')}}

\n
\n
\n
"); +$templateCache.put("profile/profile-favs/profile-favs.html","\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\"{{
\n
\n
\"{{\n

{{ \'USER.PROFILE_FAVS.EMPTY_TITLE\' | translate }}

\n
\n
"); $templateCache.put("profile/profile-hints/profile-hints.html","\n

\n

{{::vm.hint.title}}

\n

\n {{::vm.hint.text}}\n  \n

"); -$templateCache.put("profile/profile-projects/profile-projects.html","\n
\n
\n
\"Loading...\"/
\n
\n
\n\n \n \n \n\n\n

\n
\n
\n
\n
\"{{::project.get(\'name\')}}\"/\n
\n

{{::project.get(\'name\')}}

\n

{{ ::project.get(\'description\') | limitTo:300 }}

\n
\n
\n
{{::tag.get(\'name\')}}
\n
\n
\n
\n\n \n \n \n\n{{ ::project.get(\'total_fans\') }}\n\n \n\n{{ ::project.get(\'total_watchers\') }}
\n
\n
\n
\n
"); +$templateCache.put("profile/profile-projects/profile-projects.html","\n
\n
\n
\"Loading...\"/
\n
\n
\n\n \n \n \n\n\n

\n
\n
\n
\n
\"{{::project.get(\'name\')}}\"/\n
\n

{{::project.get(\'name\')}}

\n

{{ ::project.get(\'description\') | limitTo:300 }}

\n
\n
\n
{{::tag.get(\'name\')}}
\n
\n
\n
\n\n \n \n \n\n{{ ::project.get(\'total_fans\') }}\n\n \n\n{{ ::project.get(\'total_watchers\') }}
\n
\n
\n
\n
"); $templateCache.put("profile/profile-tab/profile-tab.html","\n
\n \n
"); $templateCache.put("profile/profile-tabs/profile-tabs.html","\n"); $templateCache.put("projects/listing/projects-listing.html","\n
\n
\n

\n
\n
\n
\n
\n
\n
    \n
  • \n
    \n
    \"{{::project.get(\'name\')}}\"/\n
    \n

    {{project.get(\'name\')}}\n \n\n

    \n

    {{ ::project.get(\'description\') | limitTo:300 }}...

    \n
    \n
    \n
    {{::tag.get(\'name\')}}
    \n
    \n
  • \n
\n
\n \n
\n
"); -$templateCache.put("projects/project/project.html","\n
\n \n
\n
\n
\"{{::vm.project.get(\'name\')}}\"/
\n
\n
\n
\n

{{::vm.project.get(\"name\")}}

\n \n\n\n
\n
\n \n \n
\n
\n
\n\n \n \n \n\n{{ ::vm.project.get(\'total_fans\') }}\n\n \n\n{{ ::vm.project.get(\'total_watchers\') }}
\n
\n
\n

{{vm.project.get(\'description\')}}

\n
\n
\n
{{::tag.get(\'name\')}}
\n
\n
\n
\n
\n
\n
\n

{{\'PROJECT.LOOKING_FOR_PEOPLE\' | translate}}

\n

{{::vm.project.get(\'looking_for_people_note\')}}\"

\n
\n

{{\"PROJECT.SECTION.TEAM\" | translate}}

\n
    \n
  • \"{{::member.get(\'full_name\')}}\"/
  • \n
\n
\n
\n
\n
"); -$templateCache.put("user-timeline/user-timeline/user-timeline.html","\n
\n
\n
\"Loading...\"/
\n
\n
\n
\n
\n
"); +$templateCache.put("projects/project/project.html","\n
\n \n
\n
\n
\"{{::vm.project.get(\'name\')}}\"/
\n
\n
\n
\n

{{::vm.project.get(\"name\")}}

\n \n\n\n
\n
\n \n \n
\n
\n
\n\n \n \n \n\n{{ ::vm.project.get(\'total_fans\') }}\n\n \n\n{{ ::vm.project.get(\'total_watchers\') }}
\n
\n
\n

{{vm.project.get(\'description\')}}

\n
\n
\n
{{::tag.get(\'name\')}}
\n
\n
\n
\n
\n
\n
\n

{{\'PROJECT.LOOKING_FOR_PEOPLE\' | translate}}

\n

{{::vm.project.get(\'looking_for_people_note\')}}\"

\n
\n

{{\"PROJECT.SECTION.TEAM\" | translate}}

\n
    \n
  • \"{{::member.get(\'full_name\')}}\"/
  • \n
\n
\n
\n
\n
"); $templateCache.put("user-timeline/user-timeline-attachment/user-timeline-attachment-image.html","\n\n
\n
\"{{::attachment.get(\'filename\')}}\"/
\n
"); $templateCache.put("user-timeline/user-timeline-attachment/user-timeline-attachment.html","\n"); -$templateCache.put("user-timeline/user-timeline-item/user-timeline-item.html","\n
{{::timeline.get(\'created\') | momentFromNow}}\n
\n
\n \n
\"{{::timeline.getIn([\'data\',
\n \n
\"{{::timeline.getIn([\'data\',
\n

\n
\n
{{::timeline.get(\'description\') | limitTo:300}}
\n
\"{{::timeline.getIn([\'member\',\'user\',\n
{{::timeline.getIn([\'member\',\'user\', \'name\'])}}\n

{{::timeline.getIn([\'member\',\'role\', \'name\'])}}

\n
\n
\n
\n
\n
\n
"); +$templateCache.put("user-timeline/user-timeline-item/user-timeline-item.html","\n
{{::timeline.get(\'created\') | momentFromNow}}\n
\n
\n \n
\"{{::timeline.getIn([\'data\',
\n \n
\"{{::timeline.getIn([\'data\',
\n

\n
\n
{{::timeline.get(\'description\') | limitTo:300}}
\n
\"{{::timeline.getIn([\'member\',\'user\',\n
{{::timeline.getIn([\'member\',\'user\', \'name\'])}}\n

{{::timeline.getIn([\'member\',\'role\', \'name\'])}}

\n
\n
\n
\n
\n
\n
"); +$templateCache.put("user-timeline/user-timeline/user-timeline.html","\n
\n
\n
\"Loading...\"/
\n
\n
\n
\n
\n
"); $templateCache.put("discover/components/discover-home-order-by/discover-home-order-by.html","\n
{{vm.currentText()}}\n
    \n
  • {{ \'DISCOVER.FILTERS.WEEK\' | translate }}
  • \n
  • {{ \'DISCOVER.FILTERS.MONTH\' | translate }}
  • \n
  • {{ \'DISCOVER.FILTERS.YEAR\' | translate }}
  • \n
  • {{ \'DISCOVER.FILTERS.ALL_TIME\' | translate }}
  • \n
\n
"); $templateCache.put("discover/components/discover-search-bar/discover-search-bar.html","\n
\n
\n

{{ \'DISCOVER.DISCOVER_TITLE\' | translate }}

\n

\n
\n \n
\n \n \n \n \n \n \n \n \n
\n
\n
\n
"); $templateCache.put("discover/components/discover-search-list-header/discover-search-list-header.html","\n"); @@ -170,6 +170,6 @@ $templateCache.put("discover/components/highlighted/highlighted.html","\n
\n
\n
\n \n \n \n\n\n

{{ \'DISCOVER.MOST_ACTIVE\' | translate }}

\n
\n \n
\n \n
\n
\n \n \n \n\n{{ \'DISCOVER.MOST_ACTIVE_EMPTY\' | translate }}\n
"); $templateCache.put("discover/components/most-liked/most-liked.html","\n
\n
\n
\n\n \n \n \n\n\n

{{ \'DISCOVER.MOST_LIKED\' | translate }}

\n
\n \n
\n \n
\n
\n\n \n \n \n\n{{ \'DISCOVER.MOST_LIKED_EMPTY\' | translate }}\n
"); $templateCache.put("profile/profile-favs/items/project.html","\n
\n
\n
\n
\n

{{ ::vm.item.get(\'name\') }}

\n

{{ ::vm.item.get(\'description\') }}

\n
\n
\n
{{ ::tag.get(\'name\') }}
\n
\n
\n\n \n \n \n\n{{ ::vm.item.get(\'total_fans\') }}\n\n \n\n{{ ::vm.item.get(\'total_watchers\') }}
\n
"); -$templateCache.put("profile/profile-favs/items/ticket.html","\n
\"{{\"{{\n
\n

{{:: vm.item.get(\'project_name\') }}{{:: vm.item.get(\'status\') }}

\n

{{ ::vm.item.get(\'subject\') }}{{ ::vm.item.get(\'subject\') }}{{ ::vm.item.get(\'subject\') }}

\n
\n
\n\n \n\n{{ ::vm.item.get(\'total_voters\') }}\n\n \n\n{{ ::vm.item.get(\'total_watchers\') }}
\n
"); +$templateCache.put("profile/profile-favs/items/ticket.html","\n
\"{{\"{{\n
\n

{{:: vm.item.get(\'project_name\') }}{{:: vm.item.get(\'status\') }}

\n

{{ ::vm.item.get(\'subject\') }}{{ ::vm.item.get(\'subject\') }}{{ ::vm.item.get(\'subject\') }}

\n
\n
\n\n \n\n{{ ::vm.item.get(\'total_voters\') }}\n\n \n\n{{ ::vm.item.get(\'total_watchers\') }}
\n
"); $templateCache.put("projects/components/like-project-button/like-project-button.html","\n\n \n \n \n\n{{ vm.project.get(\'total_fans\') }}"); $templateCache.put("projects/components/watch-project-button/watch-project-button.html","\n\n \n\n{{ vm.project.get(\'total_watchers\') }}\n");}]); \ No newline at end of file diff --git a/dist/v-1454172424320/locales/taiga/locale-ca.json b/dist/v-1454396495445/locales/taiga/locale-ca.json similarity index 95% rename from dist/v-1454172424320/locales/taiga/locale-ca.json rename to dist/v-1454396495445/locales/taiga/locale-ca.json index 0f324f4..f8dfd9c 100644 --- a/dist/v-1454172424320/locales/taiga/locale-ca.json +++ b/dist/v-1454396495445/locales/taiga/locale-ca.json @@ -2,7 +2,7 @@ "COMMON": { "YES": "Si", "NO": "No", - "OR": "or", + "OR": "o", "LOADING": "Carregant...", "LOADING_PROJECT": "Carregant projecte...", "DATE": "DD MMM YYYY", @@ -19,11 +19,11 @@ "TAG_LINE": "La teua eïna de gestió de projectes àgil, gratuita i de codi obert ", "TAG_LINE_2": "ESTIMA EL TEU PROJECTE", "BLOCK": "Bloquejar", - "BLOCK_TITLE": "Block this item for example if it has a dependency that can not be satisfied", + "BLOCK_TITLE": "Bloqueja aquest element si té una dependència que no pot ser satisfeta", "BLOCKED": "Bloquejat", "UNBLOCK": "Desbloquejar", - "UNBLOCK_TITLE": "Unblock this item", - "BLOCKED_NOTE": "Why is this blocked?", + "UNBLOCK_TITLE": "Desbloquejar aquest element", + "BLOCKED_NOTE": "Per qué està bloquejat?", "BLOCKED_REASON": "Per favor, explica la raó", "CREATED_BY": "Creat per {{fullDisplayName}}", "FROM": "de", @@ -169,7 +169,7 @@ "UNWATCH": "Unwatch", "WATCHERS": "Watchers", "BUTTON_TITLE": "Watch/Unwatch this item", - "COUNTER_TITLE": "{total, plural, one{one watcher} other{# watchers}}" + "COUNTER_TITLE": "{total, plural, one{un seguidor} other{# seguidors}}" }, "VOTE_BUTTON": { "UPVOTE": "Upvote", @@ -282,9 +282,9 @@ "HEADER": "Ja tinc un compte de Taiga", "PLACEHOLDER_AUTH_NAME": "Nom d'usuari i correu electrònic (sensible a majúscules i minúscules)", "LINK_FORGOT_PASSWORD": "L'has oblidat?", - "TITLE_LINK_FORGOT_PASSWORD": "Did you forget your password?", + "TITLE_LINK_FORGOT_PASSWORD": "Has oblidat la contrasenya?", "ACTION_ENTER": "Entrar", - "ACTION_SIGN_IN": "Login", + "ACTION_SIGN_IN": "Entrar", "PLACEHOLDER_AUTH_PASSWORD": "Contrasenya (sensible a majúscules i minúscules)" }, "LOGIN_FORM": { @@ -352,11 +352,11 @@ "PAGE_TITLE": "Home - Taiga", "PAGE_DESCRIPTION": "La home de Taiga amb els teus projectes principals, totes les històries d'usuari, tasques i incidències que tens assignades i aquelles que estàs Watching", "EMPTY_WORKING_ON": "Sembla buit, no? Comenceu a treballar amb Taiga i voràs ací les históries, tasques e incidències en les que estás treballant.", - "EMPTY_WATCHING": "Follow User Stories, Tasks, Issues in your projects and be notified about its changes :)", + "EMPTY_WATCHING": "Segueix históries, tasques e incidéncies en els teus project i rep notificacions quan canvien :)", "EMPTY_PROJECT_LIST": "No tens cap projecte encara", "WORKING_ON_SECTION": "En Progrés", "WATCHING_SECTION": "Observant", - "DASHBOARD": "Projects Dashboard" + "DASHBOARD": "Panell principal" }, "PROJECTS": { "PAGE_TITLE": "Els meus projectes - Taiga", @@ -366,13 +366,13 @@ "ATTACHMENT": { "SECTION_NAME": "Adjunts", "TITLE": "{{ fileName }} pujat el {{ date }}", - "LIST_VIEW_MODE": "List view mode", - "GALLERY_VIEW_MODE": "Gallery view mode", + "LIST_VIEW_MODE": "Vista de llista", + "GALLERY_VIEW_MODE": "Galeria", "DESCRIPTION": "Escriu una descripció curta", "DEPRECATED": "(obsolet)", "DEPRECATED_FILE": "Obsolet?", "ADD": "Afegeix un nou adjunt. {{maxFileSizeMsg}}", - "DROP": "Drop attachments here!", + "DROP": "Deixa els adjunts ací", "MAX_FILE_SIZE": "[Max. grandària: {{maxFileSize}}]", "SHOW_DEPRECATED": "+ mostra els adjunts obsolets", "HIDE_DEPRECATED": "- Amagar els adjunts obsolets", @@ -453,11 +453,11 @@ "NUMBER_US_POINTS": "Nombre de punts d'històries (0 per a una quantitat indeterminada)", "TAGS": "Etiquetes", "DESCRIPTION": "Descripció", - "RECRUITING": "Is this project looking for people?", - "RECRUITING_MESSAGE": "Who are you looking for?", - "RECRUITING_PLACEHOLDER": "Define the profiles you are looking for", + "RECRUITING": "Este projecte busca col·laboracions?", + "RECRUITING_MESSAGE": "A qui estàs buscant?", + "RECRUITING_PLACEHOLDER": "Defineix els perfils que estàs buscant", "PUBLIC_PROJECT": "Projecte públic", - "PUBLIC_PROJECT_DESC": "Users will be able to find and view your project", + "PUBLIC_PROJECT_DESC": "Els usuaris podràn trobar i vore el teu projecte", "PRIVATE_PROJECT": "Projecte privat", "PRIVATE_PROJECT_DESC": "By default, this project will be hidden to the public", "PRIVATE_OR_PUBLIC": "What's the difference between public and private projects?", @@ -690,9 +690,9 @@ "ACTIVITY_TAB": "Timeline", "ACTIVITY_TAB_TITLE": "Mostra tota la activitat d'aquest usuari", "PROJECTS_TAB": "Projectes", - "PROJECTS_TAB_TITLE": "List of all projects in which the user is a member", - "LIKES_TAB": "Likes", - "LIKES_TAB_TITLE": "List all likes made by this user", + "PROJECTS_TAB_TITLE": "Mostra tots els projects del que el usuari es administrador", + "LIKES_TAB": "Favorits", + "LIKES_TAB_TITLE": "Mostra tots els favorits del usuari", "VOTES_TAB": "Vots", "VOTES_TAB_TITLE": "List all votes made by this user", "WATCHED_TAB": "Watched", @@ -703,7 +703,7 @@ }, "PROFILE_SIDEBAR": { "TITLE": "El teu perfil", - "DESCRIPTION": "People can see everything you do and what you are working on. Add a nice bio to give an enhanced version of your information.", + "DESCRIPTION": "La gent pot vore tot el que fas i en qué estàs treballant. Afegix una bio interessant per a donar una millor versió de la teua informació.", "ADD_INFO": "Edita la bio" }, "PROFILE_FAVS": { @@ -718,7 +718,7 @@ "FILTER_TYPE_TASK_TITLES": "Mostra només tasquest", "FILTER_TYPE_ISSUES": "Incidències", "FILTER_TYPE_ISSUES_TITLE": "Mostra només incidències", - "EMPTY_TITLE": "It looks like there's nothing to show here." + "EMPTY_TITLE": "Sembla que no hi ha res que mostrar" } }, "PROJECT": { @@ -727,10 +727,10 @@ "SECTION_PROJECTS": "Projectes", "HELP": "Reordena els teus projectes per a establir els més utilitzats en les primeres posicions.
Els 10 millors projectes apareixeran en la llista de projectes de la barra de navegació superior", "PRIVATE": "Projecte privat", - "LOOKING_FOR_PEOPLE": "This project is looking for people", - "FANS_COUNTER_TITLE": "{total, plural, one{one fan} other{# fans}}", - "WATCHERS_COUNTER_TITLE": "{total, plural, one{one watcher} other{# watchers}}", - "MEMBERS_COUNTER_TITLE": "{total, plural, one{one member} other{# members}}", + "LOOKING_FOR_PEOPLE": "Este projecte busca col·laboracions", + "FANS_COUNTER_TITLE": "{total, plural, one{un fan} other{# fans}}", + "WATCHERS_COUNTER_TITLE": "{total, plural, one{un seguidor} other{# seguidors}}", + "MEMBERS_COUNTER_TITLE": "{total, plural, one{un membre} other{# membres}}", "STATS": { "PROJECT": "punts
projecte", "DEFINED": "punts
definits", @@ -753,7 +753,7 @@ "PLACEHOLDER_SEARCH": "Cerca en...", "ACTION_CREATE_PROJECT": "Crear projecte", "ACTION_IMPORT_PROJECT": "Importar projecte", - "MANAGE_PROJECTS": "Manage projects", + "MANAGE_PROJECTS": "Gestiona els projectes", "TITLE_CREATE_PROJECT": "Crear projecte", "TITLE_IMPORT_PROJECT": "Importar projecte", "TITLE_PRVIOUS_PROJECT": "Mostra projectes previs", @@ -797,14 +797,14 @@ "LIKE": "M'agrada", "LIKED": "T'agrada", "UNLIKE": "No t'agrada", - "BUTTON_TITLE": "Like or unlike this project", - "COUNTER_TITLE": "{total, plural, one{one fan} other{# fans}}" + "BUTTON_TITLE": "Favoriteja o desfavoriteja aquest projecte", + "COUNTER_TITLE": "{total, plural, un{un fan} altres{# fans}}" }, "WATCH_BUTTON": { "BUTTON_TITLE": "Segueix este projecte i edita les notificacions", "WATCH": "Segueix", "WATCHING": "Observant", - "COUNTER_TITLE": "{total, plural, one{one watcher} other{# watchers}}", + "COUNTER_TITLE": "{total, plural, one{un seguidor} other{# seguidors}}", "OPTIONS": { "NOTIFY_ALL": "Receive all notifications", "NOTIFY_ALL_TITLE": "Receive all notifications for this project", @@ -914,7 +914,7 @@ "TYPE_NEW_COMMENT": "Escriu un nou comentari ací", "SHOW_DELETED": "Mostra el comentari esborrat.", "HIDE_DELETED": "Amaga el comentari esborrat", - "DELETE": "Delete comment", + "DELETE": "Esborrar comentari", "RESTORE": "Resturar comentari." }, "ACTIVITY": { @@ -976,12 +976,12 @@ "CUSTOMIZE_GRAPH": "Edita el teu gràfic de backlog", "CUSTOMIZE_GRAPH_TEXT": "Per a tindre un gràfic que t'ajude a seguir la evolució del projecte deus de editar els punts i els sprints per mig del", "CUSTOMIZE_GRAPH_ADMIN": "Admin", - "CUSTOMIZE_GRAPH_TITLE": "Set up the points and sprints through the Admin", + "CUSTOMIZE_GRAPH_TITLE": "Estableix els punts i els sprints al Admin", "MOVE_US_TO_CURRENT_SPRINT": "Envia al Sprint", - "MOVE_US_TO_LATEST_SPRINT": "Move to latest Sprint", + "MOVE_US_TO_LATEST_SPRINT": "Posar a l'ultim sprint", "SHOW_FILTERS": "Mostra filtres", "SHOW_TAGS": "Mostra etiquetes", - "EMPTY": "The backlog is empty!", + "EMPTY": "El backlog està buit!", "CREATE_NEW_US": "Crea una nova US", "CREATE_NEW_US_EMPTY_HELP": "Potser vols crear una nova història d'usuari", "EXCESS_OF_POINTS": "Excés de punts", @@ -1066,8 +1066,8 @@ "TITLE_ACTION_ADD_BULK": "Afegeix noves històries d'usuari en grup", "TITLE_ACTION_ASSIGN": "Assignar tasca", "TITLE_ACTION_EDIT": "Editar tasca", - "PLACEHOLDER_CARD_TITLE": "This could be a task", - "PLACEHOLDER_CARD_TEXT": "Split Stories into tasks to track them separately", + "PLACEHOLDER_CARD_TITLE": "Açó podría ser una tasca", + "PLACEHOLDER_CARD_TEXT": "Divideix les históries per a poder gertionar-les separadament", "TABLE": { "COLUMN": "Història d'usuari", "TITLE_ACTION_FOLD": "Plegar columna", @@ -1135,7 +1135,7 @@ }, "ISSUES": { "PAGE_TITLE": "Incidències - {{projectName}}", - "PAGE_DESCRIPTION": "The issues list panel of the project {{projectName}}: {{projectDescription}}", + "PAGE_DESCRIPTION": "El panell d'incidències de {{projectName}}: {{projectDescription}}", "LIST_SECTION_NAME": "Incidències", "SECTION_NAME": "Detalls d'incidència", "ACTION_NEW_ISSUE": "+ NOVA INCIDÈNCIA", @@ -1224,7 +1224,7 @@ }, "SEARCH": { "PAGE_TITLE": "Cerca - {{projectName}}", - "PAGE_DESCRIPTION": "Search anything, user stories, issues, tasks or wiki pages, in the project {{projectName}}: {{projectDescription}}", + "PAGE_DESCRIPTION": "Busca qualsevol cosa al projecte {{projectName}}: {{projectDescription}}", "FILTER_USER_STORIES": "Històries d'usuari", "FILTER_ISSUES": "Incidències", "FILTER_TASKS": "Tasca", @@ -1236,7 +1236,7 @@ }, "TEAM": { "PAGE_TITLE": "Equip - {{projectName}}", - "PAGE_DESCRIPTION": "The team panel to show all the members of the project {{projectName}}: {{projectDescription}}", + "PAGE_DESCRIPTION": "El panell d'equip mostra tots els membres del projecte {{projectName}}: {{projectDescription}}", "SECTION_NAME": "Equip", "APP_TITLE": "EQUIP - {{projectName}}", "PLACEHOLDER_INPUT_SEARCH": "Busca per nom complet...", @@ -1446,6 +1446,8 @@ } }, "DISCOVER": { + "PAGE_TITLE": "Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "DISCOVER_TITLE": "Discover projects", "DISCOVER_SUBTITLE": "{projects, plural, one{One public project to discover} other{# public projects to discover}}", "MOST_ACTIVE": "Most active", @@ -1453,7 +1455,7 @@ "MOST_LIKED": "Most liked", "MOST_LIKED_EMPTY": "There are no LIKED projects yet", "VIEW_MORE": "View more", - "RECRUITING": "This project is looking for people", + "RECRUITING": "Este projecte busca col·laborados", "FEATURED": "Featured Projects", "EMPTY": "There are no projects to show with this search criteria.
Try again!", "FILTERS": { @@ -1468,6 +1470,8 @@ "CLEAR": "Clear filters" }, "SEARCH": { + "PAGE_TITLE": "Search - Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "INPUT_PLACEHOLDER": "Escriu algo...", "ACTION_TITLE": "Cerca", "RESULTS": "Search results" diff --git a/dist/v-1454172424320/locales/taiga/locale-de.json b/dist/v-1454396495445/locales/taiga/locale-de.json similarity index 99% rename from dist/v-1454172424320/locales/taiga/locale-de.json rename to dist/v-1454396495445/locales/taiga/locale-de.json index dbb4970..d29610f 100644 --- a/dist/v-1454172424320/locales/taiga/locale-de.json +++ b/dist/v-1454396495445/locales/taiga/locale-de.json @@ -1446,6 +1446,8 @@ } }, "DISCOVER": { + "PAGE_TITLE": "Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "DISCOVER_TITLE": "Discover projects", "DISCOVER_SUBTITLE": "{projects, plural, one{One public project to discover} other{# public projects to discover}}", "MOST_ACTIVE": "Most active", @@ -1468,6 +1470,8 @@ "CLEAR": "Clear filters" }, "SEARCH": { + "PAGE_TITLE": "Search - Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "INPUT_PLACEHOLDER": "Geben sie etwas ein...", "ACTION_TITLE": "Suche", "RESULTS": "Search results" diff --git a/dist/v-1454172424320/locales/taiga/locale-en.json b/dist/v-1454396495445/locales/taiga/locale-en.json similarity index 99% rename from dist/v-1454172424320/locales/taiga/locale-en.json rename to dist/v-1454396495445/locales/taiga/locale-en.json index fdf6075..8480026 100644 --- a/dist/v-1454172424320/locales/taiga/locale-en.json +++ b/dist/v-1454396495445/locales/taiga/locale-en.json @@ -373,7 +373,6 @@ "DEPRECATED_FILE": "Deprecated?", "ADD": "Add new attachment. {{maxFileSizeMsg}}", "DROP": "Drop attachments here!", - "MAX_FILE_SIZE": "[Max. size: {{maxFileSize}}]", "SHOW_DEPRECATED": "+ show deprecated atachments", "HIDE_DEPRECATED": "- hide deprecated atachments", "COUNT_DEPRECATED": "({{ counter }} deprecated)", @@ -1449,6 +1448,8 @@ } }, "DISCOVER": { + "PAGE_TITLE": "Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "DISCOVER_TITLE": "Discover projects", "DISCOVER_SUBTITLE": "{projects, plural, one{One public project to discover} other{# public projects to discover}}", "MOST_ACTIVE": "Most active", @@ -1471,6 +1472,8 @@ "CLEAR": "Clear filters" }, "SEARCH": { + "PAGE_TITLE": "Search - Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "INPUT_PLACEHOLDER": "Type something...", "ACTION_TITLE": "Search", "RESULTS": "Search results" diff --git a/dist/v-1454172424320/locales/taiga/locale-es.json b/dist/v-1454396495445/locales/taiga/locale-es.json similarity index 99% rename from dist/v-1454172424320/locales/taiga/locale-es.json rename to dist/v-1454396495445/locales/taiga/locale-es.json index 227d8fa..b5c07e2 100644 --- a/dist/v-1454172424320/locales/taiga/locale-es.json +++ b/dist/v-1454396495445/locales/taiga/locale-es.json @@ -1446,6 +1446,8 @@ } }, "DISCOVER": { + "PAGE_TITLE": "Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "DISCOVER_TITLE": "Descubre proyectos", "DISCOVER_SUBTITLE": "{projects, plural, one{Un proyecto público por descubrir} other{# proyectos público por descubrir}}\n", "MOST_ACTIVE": "Más activos", @@ -1468,6 +1470,8 @@ "CLEAR": "Borrar filtros" }, "SEARCH": { + "PAGE_TITLE": "Search - Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "INPUT_PLACEHOLDER": "Escribe algo...", "ACTION_TITLE": "Buscar", "RESULTS": "Resultados de búsqueda" diff --git a/dist/v-1454172424320/locales/taiga/locale-fi.json b/dist/v-1454396495445/locales/taiga/locale-fi.json similarity index 99% rename from dist/v-1454172424320/locales/taiga/locale-fi.json rename to dist/v-1454396495445/locales/taiga/locale-fi.json index 8058e3c..0ab3626 100644 --- a/dist/v-1454172424320/locales/taiga/locale-fi.json +++ b/dist/v-1454396495445/locales/taiga/locale-fi.json @@ -1446,6 +1446,8 @@ } }, "DISCOVER": { + "PAGE_TITLE": "Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "DISCOVER_TITLE": "Discover projects", "DISCOVER_SUBTITLE": "{projects, plural, one{One public project to discover} other{# public projects to discover}}", "MOST_ACTIVE": "Most active", @@ -1468,6 +1470,8 @@ "CLEAR": "Clear filters" }, "SEARCH": { + "PAGE_TITLE": "Search - Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "INPUT_PLACEHOLDER": "Type something...", "ACTION_TITLE": "Hae", "RESULTS": "Search results" diff --git a/dist/v-1454172424320/locales/taiga/locale-fr.json b/dist/v-1454396495445/locales/taiga/locale-fr.json similarity index 99% rename from dist/v-1454172424320/locales/taiga/locale-fr.json rename to dist/v-1454396495445/locales/taiga/locale-fr.json index a9ebd4c..249be79 100644 --- a/dist/v-1454172424320/locales/taiga/locale-fr.json +++ b/dist/v-1454396495445/locales/taiga/locale-fr.json @@ -1446,6 +1446,8 @@ } }, "DISCOVER": { + "PAGE_TITLE": "Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "DISCOVER_TITLE": "Découvrir les projets", "DISCOVER_SUBTITLE": "{projects, plural, one{Un projet public à découvrir} other{# projets publics à découvrir}}", "MOST_ACTIVE": "les plus actifs", @@ -1468,6 +1470,8 @@ "CLEAR": "Effacer les filtres" }, "SEARCH": { + "PAGE_TITLE": "Search - Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "INPUT_PLACEHOLDER": "Écrivez quelque chose...", "ACTION_TITLE": "Rechercher", "RESULTS": "Résultats de la recherche" diff --git a/dist/v-1454172424320/locales/taiga/locale-it.json b/dist/v-1454396495445/locales/taiga/locale-it.json similarity index 99% rename from dist/v-1454172424320/locales/taiga/locale-it.json rename to dist/v-1454396495445/locales/taiga/locale-it.json index f4d1362..17f4574 100644 --- a/dist/v-1454172424320/locales/taiga/locale-it.json +++ b/dist/v-1454396495445/locales/taiga/locale-it.json @@ -1446,6 +1446,8 @@ } }, "DISCOVER": { + "PAGE_TITLE": "Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "DISCOVER_TITLE": "Scopri progetti", "DISCOVER_SUBTITLE": "{projects, plural, one{Un progetto pubblico da scoprire} other{# progetti pubblici da scoprire}}", "MOST_ACTIVE": "Più attivi", @@ -1468,6 +1470,8 @@ "CLEAR": "Cancella filtri" }, "SEARCH": { + "PAGE_TITLE": "Search - Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "INPUT_PLACEHOLDER": "Inserisci testo...", "ACTION_TITLE": "Cerca", "RESULTS": "Risultati della ricerca" diff --git a/dist/v-1454172424320/locales/taiga/locale-nl.json b/dist/v-1454396495445/locales/taiga/locale-nl.json similarity index 99% rename from dist/v-1454172424320/locales/taiga/locale-nl.json rename to dist/v-1454396495445/locales/taiga/locale-nl.json index b111c14..c1807b0 100644 --- a/dist/v-1454172424320/locales/taiga/locale-nl.json +++ b/dist/v-1454396495445/locales/taiga/locale-nl.json @@ -1446,6 +1446,8 @@ } }, "DISCOVER": { + "PAGE_TITLE": "Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "DISCOVER_TITLE": "Discover projects", "DISCOVER_SUBTITLE": "{projects, plural, one{One public project to discover} other{# public projects to discover}}", "MOST_ACTIVE": "Most active", @@ -1468,6 +1470,8 @@ "CLEAR": "Clear filters" }, "SEARCH": { + "PAGE_TITLE": "Search - Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "INPUT_PLACEHOLDER": "Typ iets...", "ACTION_TITLE": "Zoek", "RESULTS": "Search results" diff --git a/dist/v-1454172424320/locales/taiga/locale-pl.json b/dist/v-1454396495445/locales/taiga/locale-pl.json similarity index 99% rename from dist/v-1454172424320/locales/taiga/locale-pl.json rename to dist/v-1454396495445/locales/taiga/locale-pl.json index 4cf96bd..d12e6d9 100644 --- a/dist/v-1454172424320/locales/taiga/locale-pl.json +++ b/dist/v-1454396495445/locales/taiga/locale-pl.json @@ -1446,6 +1446,8 @@ } }, "DISCOVER": { + "PAGE_TITLE": "Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "DISCOVER_TITLE": "Discover projects", "DISCOVER_SUBTITLE": "{projects, plural, one{One public project to discover} other{# public projects to discover}}", "MOST_ACTIVE": "Most active", @@ -1468,6 +1470,8 @@ "CLEAR": "Clear filters" }, "SEARCH": { + "PAGE_TITLE": "Search - Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "INPUT_PLACEHOLDER": "Type something...", "ACTION_TITLE": "Szukaj", "RESULTS": "Search results" diff --git a/dist/v-1454172424320/locales/taiga/locale-pt-br.json b/dist/v-1454396495445/locales/taiga/locale-pt-br.json similarity index 99% rename from dist/v-1454172424320/locales/taiga/locale-pt-br.json rename to dist/v-1454396495445/locales/taiga/locale-pt-br.json index 6f19a2c..d475424 100644 --- a/dist/v-1454172424320/locales/taiga/locale-pt-br.json +++ b/dist/v-1454396495445/locales/taiga/locale-pt-br.json @@ -1446,6 +1446,8 @@ } }, "DISCOVER": { + "PAGE_TITLE": "Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "DISCOVER_TITLE": "Descobrir projetos", "DISCOVER_SUBTITLE": "{projects, plural, um{One public project to discover} outro{# public projects to discover}}", "MOST_ACTIVE": "Mais ativo", @@ -1468,6 +1470,8 @@ "CLEAR": "Limpar filtros" }, "SEARCH": { + "PAGE_TITLE": "Search - Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "INPUT_PLACEHOLDER": "Digite algo...", "ACTION_TITLE": "Procurar", "RESULTS": "Resultado de pesquisa." diff --git a/dist/v-1454172424320/locales/taiga/locale-ru.json b/dist/v-1454396495445/locales/taiga/locale-ru.json similarity index 99% rename from dist/v-1454172424320/locales/taiga/locale-ru.json rename to dist/v-1454396495445/locales/taiga/locale-ru.json index fc47613..ac2e707 100644 --- a/dist/v-1454172424320/locales/taiga/locale-ru.json +++ b/dist/v-1454396495445/locales/taiga/locale-ru.json @@ -1446,6 +1446,8 @@ } }, "DISCOVER": { + "PAGE_TITLE": "Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "DISCOVER_TITLE": "Discover projects", "DISCOVER_SUBTITLE": "{projects, plural, one{One public project to discover} other{# public projects to discover}}", "MOST_ACTIVE": "Most active", @@ -1468,6 +1470,8 @@ "CLEAR": "Clear filters" }, "SEARCH": { + "PAGE_TITLE": "Search - Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "INPUT_PLACEHOLDER": "Введите что-нибудь...", "ACTION_TITLE": "Поиск", "RESULTS": "Search results" diff --git a/dist/v-1454172424320/locales/taiga/locale-sv.json b/dist/v-1454396495445/locales/taiga/locale-sv.json similarity index 98% rename from dist/v-1454172424320/locales/taiga/locale-sv.json rename to dist/v-1454396495445/locales/taiga/locale-sv.json index 73ffabf..d8f2115 100644 --- a/dist/v-1454172424320/locales/taiga/locale-sv.json +++ b/dist/v-1454396495445/locales/taiga/locale-sv.json @@ -2,7 +2,7 @@ "COMMON": { "YES": "Ja", "NO": "Nej", - "OR": "or", + "OR": "eller", "LOADING": "Laddar ...", "LOADING_PROJECT": "Laddar projekt...", "DATE": "YYYY-MM-DD", @@ -454,16 +454,16 @@ "TAGS": "Etiketter", "DESCRIPTION": "Beskrivning", "RECRUITING": "Is this project looking for people?", - "RECRUITING_MESSAGE": "Who are you looking for?", + "RECRUITING_MESSAGE": "Vem letar du efter?", "RECRUITING_PLACEHOLDER": "Define the profiles you are looking for", "PUBLIC_PROJECT": "Publika projekt", "PUBLIC_PROJECT_DESC": "Users will be able to find and view your project", "PRIVATE_PROJECT": "Privata projekt", "PRIVATE_PROJECT_DESC": "By default, this project will be hidden to the public", - "PRIVATE_OR_PUBLIC": "What's the difference between public and private projects?", + "PRIVATE_OR_PUBLIC": "Vad är skillnaden mellan publika och privata projekt?", "DELETE": "Ta bort projekt", - "LOGO_HELP": "The image will be scaled to 80x80px.", - "CHANGE_LOGO": "Change logo", + "LOGO_HELP": "Bilden kommer skalas till 80x80px.", + "CHANGE_LOGO": "Ändra logga", "ACTION_USE_DEFAULT_LOGO": "Use default image" }, "REPORTS": { @@ -914,7 +914,7 @@ "TYPE_NEW_COMMENT": "Skriv en ny kommentar här", "SHOW_DELETED": "Visa raderade kommentarer", "HIDE_DELETED": "Dölj raderade kommentarer", - "DELETE": "Delete comment", + "DELETE": "Ta bort kommentar", "RESTORE": "Hämta tillbaka tidigare kommentarer" }, "ACTIVITY": { @@ -1284,7 +1284,7 @@ } }, "USER_PROFILE": { - "IMAGE_HELP": "The image will be scaled to 80x80px.", + "IMAGE_HELP": "Bilden kommer skalas till 80x80px.", "ACTION_CHANGE_IMAGE": "Ändra", "ACTION_USE_GRAVATAR": "Use default image", "ACTION_DELETE_ACCOUNT": "Ta bort Taiga-kontot", @@ -1446,6 +1446,8 @@ } }, "DISCOVER": { + "PAGE_TITLE": "Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "DISCOVER_TITLE": "Discover projects", "DISCOVER_SUBTITLE": "{projects, plural, one{One public project to discover} other{# public projects to discover}}", "MOST_ACTIVE": "Most active", @@ -1468,6 +1470,8 @@ "CLEAR": "Clear filters" }, "SEARCH": { + "PAGE_TITLE": "Search - Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "INPUT_PLACEHOLDER": "Skriv något ...", "ACTION_TITLE": "Sök", "RESULTS": "Search results" diff --git a/dist/v-1454172424320/locales/taiga/locale-tr.json b/dist/v-1454396495445/locales/taiga/locale-tr.json similarity index 99% rename from dist/v-1454172424320/locales/taiga/locale-tr.json rename to dist/v-1454396495445/locales/taiga/locale-tr.json index 37122c6..b96d15a 100644 --- a/dist/v-1454172424320/locales/taiga/locale-tr.json +++ b/dist/v-1454396495445/locales/taiga/locale-tr.json @@ -1446,6 +1446,8 @@ } }, "DISCOVER": { + "PAGE_TITLE": "Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "DISCOVER_TITLE": "Proje keşfedin", "DISCOVER_SUBTITLE": "{projects, plural, one{Keşfedilecek bir açık proje} other{Keşfedilecek # açık proje}}", "MOST_ACTIVE": "En hareketli", @@ -1468,6 +1470,8 @@ "CLEAR": "Filtreleri kaldır" }, "SEARCH": { + "PAGE_TITLE": "Search - Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "INPUT_PLACEHOLDER": "Birşeyler yazın...", "ACTION_TITLE": "Ara", "RESULTS": "Arama sonuçları" diff --git a/dist/v-1454172424320/locales/taiga/locale-zh-hant.json b/dist/v-1454396495445/locales/taiga/locale-zh-hant.json similarity index 99% rename from dist/v-1454172424320/locales/taiga/locale-zh-hant.json rename to dist/v-1454396495445/locales/taiga/locale-zh-hant.json index 8b3e88b..3bfd36b 100644 --- a/dist/v-1454172424320/locales/taiga/locale-zh-hant.json +++ b/dist/v-1454396495445/locales/taiga/locale-zh-hant.json @@ -1446,6 +1446,8 @@ } }, "DISCOVER": { + "PAGE_TITLE": "Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "DISCOVER_TITLE": "發現更多專案", "DISCOVER_SUBTITLE": "{projects, plural, one{One public project to discover} other{# public projects to discover}}", "MOST_ACTIVE": "最活躍", @@ -1468,6 +1470,8 @@ "CLEAR": "清除過濾器 " }, "SEARCH": { + "PAGE_TITLE": "Search - Discover projects - Taiga", + "PAGE_DESCRIPTION": "Searchable directory of Public Projects in Taiga. Explore backlogs, timelines, issues, and teams. Check out the most liked or most active projects. Filter by Kanban or Scrum.", "INPUT_PLACEHOLDER": "輸入文字", "ACTION_TITLE": "搜尋", "RESULTS": "搜尋結果" diff --git a/dist/v-1454396495445/styles/theme-high-contrast.css b/dist/v-1454396495445/styles/theme-high-contrast.css new file mode 100644 index 0000000..2812b8a --- /dev/null +++ b/dist/v-1454396495445/styles/theme-high-contrast.css @@ -0,0 +1,4 @@ +@charset "UTF-8";.introjs-arrow,blockquote::after,blockquote::before,q::after,q::before{content:''}.pika-table,table{border-collapse:collapse;border-spacing:0}.kanban-task-minimized .task-name,h1 .date,h1 span{text-overflow:ellipsis;white-space:nowrap}.lightbox textarea,.wizard-create-project textarea,textarea{resize:vertical}.change-entry .activity-fromto,.kanban-task-maximized .task-name,.profile-bar .not-full-name,.profile-bar h1{word-wrap:break-word}.codehilite .hll{background-color:#49483e}.codehilite .c{color:#75715e}.codehilite .err{color:#960050;background-color:#1e0010}.codehilite .k{color:#66d9ef}.codehilite .l{color:#ae81ff}.codehilite .n{color:#f8f8f2}.codehilite .o{color:#f92672}.codehilite .p{color:#f8f8f2}.codehilite .c1,.codehilite .cm,.codehilite .cp,.codehilite .cs{color:#75715e}.codehilite .ge{font-style:italic}.codehilite .gs{font-weight:700}.codehilite .kc,.codehilite .kd{color:#66d9ef}.codehilite .kn{color:#f92672}.codehilite .kp,.codehilite .kr,.codehilite .kt{color:#66d9ef}.codehilite .ld{color:#e6db74}.codehilite .m{color:#ae81ff}.codehilite .s{color:#e6db74}.codehilite .na{color:#a6e22e}.codehilite .nb{color:#f8f8f2}.codehilite .nc{color:#a6e22e}.codehilite .no{color:#66d9ef}.codehilite .nd{color:#a6e22e}.codehilite .ni{color:#f8f8f2}.codehilite .ne,.codehilite .nf{color:#a6e22e}.codehilite .nl,.codehilite .nn{color:#f8f8f2}.codehilite .nx{color:#a6e22e}.codehilite .py{color:#f8f8f2}.codehilite .nt{color:#f92672}.codehilite .nv{color:#f8f8f2}.codehilite .ow{color:#f92672}.codehilite .w{color:#f8f8f2}.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#ae81ff}.codehilite .s2,.codehilite .sb,.codehilite .sc,.codehilite .sd{color:#e6db74}.codehilite .se{color:#ae81ff}.codehilite .s1,.codehilite .sh,.codehilite .si,.codehilite .sr,.codehilite .ss,.codehilite .sx{color:#e6db74}.codehilite .bp,.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#f8f8f2}.codehilite .il{color:#ae81ff}.codehilite .gu{color:#75715e}.codehilite .gd{color:#f92672}.codehilite .gi{color:#a6e22e}.mCustomScrollbar{-ms-touch-action:none;touch-action:none}.mCustomScrollbar.mCS_no_scrollbar{-ms-touch-action:auto;touch-action:auto}.mCustomScrollBox{position:relative;overflow:hidden;height:100%;max-width:100%;outline:0;direction:ltr}.mCSB_container{overflow:hidden;width:auto;height:auto}.mCSB_inside>.mCSB_container{margin-right:30px}.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container{margin-right:0;margin-left:30px}.mCS-dir-rtl>.mCSB_inside>.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-left:0}.mCSB_scrollTools{position:absolute;width:16px;height:auto;left:auto;top:0;right:0;bottom:0;opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_outside+.mCSB_scrollTools{right:-26px}.mCS-dir-rtl>.mCSB_inside>.mCSB_scrollTools,.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{right:auto;left:0}.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{left:-26px}.mCSB_scrollTools .mCSB_draggerContainer{position:absolute;top:0;left:0;bottom:0;right:0;height:auto}.mCSB_scrollTools a+.mCSB_draggerContainer{margin:20px 0}.mCSB_scrollTools .mCSB_draggerRail{width:2px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCSB_scrollTools .mCSB_dragger{cursor:pointer;width:100%;height:30px;z-index:1}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{position:relative;width:4px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px;text-align:center}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:12px}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:8px}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonUp{display:block;position:absolute;height:20px;width:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools .mCSB_buttonDown{bottom:0}.mCSB_horizontal.mCSB_inside>.mCSB_container{margin-right:0;margin-bottom:30px}.mCSB_horizontal.mCSB_outside>.mCSB_container{min-height:100%}.mCSB_horizontal>.mCSB_container.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal{width:auto;height:16px;top:auto;right:0;bottom:0;left:0}.mCustomScrollBox+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:-26px}.mCSB_scrollTools.mCSB_scrollTools_horizontal a+.mCSB_draggerContainer{margin:0 20px}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:2px;margin:7px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger{width:30px;height:100%;left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:4px;margin:6px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:12px;margin:2px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:8px;margin:4px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{display:block;position:absolute;width:20px;height:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft{left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{right:0}.mCSB_container_wrapper{position:absolute;height:auto;width:auto;overflow:hidden;top:0;left:0;right:0;bottom:0;margin-right:30px;margin-bottom:30px}.mCSB_container_wrapper>.mCSB_container{padding-right:30px;padding-bottom:30px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:20px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:20px}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden+.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:20px}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container_wrapper{margin-right:0;margin-left:30px}.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden>.mCSB_container{padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden>.mCSB_container{padding-bottom:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0;margin-left:0}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;transition:opacity .2s ease-in-out,background-color .2s ease-in-out}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar{-webkit-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out}.introjs-helperLayer,.introjs-overlay{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out}.mCS-autoHide>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide>.mCustomScrollBox~.mCSB_scrollTools{opacity:0;filter:"alpha(opacity=0)";-ms-filter:"alpha(opacity=0)"}.mCS-autoHide:hover>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide:hover>.mCustomScrollBox~.mCSB_scrollTools,.mCustomScrollBox:hover>.mCSB_scrollTools,.mCustomScrollBox:hover~.mCSB_scrollTools,.mCustomScrollbar>.mCustomScrollBox>.mCSB_scrollTools.mCSB_scrollTools_onDrag,.mCustomScrollbar>.mCustomScrollBox~.mCSB_scrollTools.mCSB_scrollTools_onDrag{opacity:1;filter:"alpha(opacity=100)";-ms-filter:"alpha(opacity=100)"}.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.4);filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75);filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85);filter:"alpha(opacity=85)";-ms-filter:"alpha(opacity=85)"}.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9);filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp{background-image:url(mCSB_buttons.png);background-repeat:no-repeat;opacity:.4;filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_buttonUp{background-position:0 0}.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -20px}.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -40px}.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -56px}.mCSB_scrollTools .mCSB_buttonDown:hover,.mCSB_scrollTools .mCSB_buttonLeft:hover,.mCSB_scrollTools .mCSB_buttonRight:hover,.mCSB_scrollTools .mCSB_buttonUp:hover{opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_buttonDown:active,.mCSB_scrollTools .mCSB_buttonLeft:active,.mCSB_scrollTools .mCSB_buttonRight:active,.mCSB_scrollTools .mCSB_buttonUp:active{opacity:.9;filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCS-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:rgba(0,0,0,.85)}.mCS-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:rgba(0,0,0,.9)}.mCS-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:4px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px auto}.mCS-light-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px 0}.mCS-light-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -20px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -40px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px 0}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -20px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -40px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px 0}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:6px;margin:5px auto}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px 0}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -20px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -40px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px 0}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -20px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -40px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -56px}.mCS-light-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.1)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:2px}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:2px;margin:7px auto}.mCS-dark-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-rounded.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger,.mCS-rounded.mCSB_scrollTools .mCSB_dragger{height:14px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:14px;margin:0 1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger{width:14px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:14px;margin:1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:16px;height:16px;margin:-1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:4px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:16px;width:16px;margin:0 -1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:4px;margin:6px 0}.mCS-rounded.mCSB_scrollTools .mCSB_buttonUp{background-position:0 -72px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -92px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -112px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -128px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px -72px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -92px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -112px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools_vertical .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_vertical .mCSB_draggerRail{width:4px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{background-color:transparent;background-position:center}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAANElEQVQYV2NkIAAYiVbw//9/Y6DiM1ANJoyMjGdBbLgJQAX/kU0DKgDLkaQAvxW4HEvQFwCRcxIJK1XznAAAAABJRU5ErkJggg==);background-repeat:repeat-y;opacity:.3;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{height:4px;margin:6px 0;background-repeat:repeat-x}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px -72px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -92px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -112px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYV2NkIAAYSVFgDFR8BqrBBEifBbGRTfiPZhpYjiQFBK3A6l6CvgAAE9kGCd1mvgEAAAAASUVORK5CYII=)}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px -72px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -92px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -112px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-y;background-image:-moz-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to right,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-x;background-image:-moz-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to bottom,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-3d.mCSB_scrollTools_vertical .mCSB_dragger{height:70px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger{width:70px}.mCS-3d-dark.mCSB_scrollTools,.mCS-3d.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{width:8px;background-color:#000;background-color:rgba(0,0,0,.2);box-shadow:inset 1px 0 1px rgba(0,0,0,.5),inset -1px 0 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:8px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:8px;margin:4px 0;box-shadow:inset 0 1px 1px rgba(0,0,0,.5),inset 0 -1px 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:8px;margin:4px auto}.mCS-3d.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);box-shadow:inset 1px 0 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{box-shadow:inset 0 1px 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer,.mCS-3d-thick.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.mCSB_inside+.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCSB_inside+.mCS-3d-thick.mCSB_scrollTools_vertical{right:1px}.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCS-3d-thick.mCSB_scrollTools_vertical{box-shadow:inset 1px 0 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal,.mCS-3d-thick.mCSB_scrollTools_horizontal{bottom:1px;box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;box-shadow:inset 1px 0 0 rgba(255,255,255,.4);width:12px;margin:2px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4);height:12px;width:auto}.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{background-color:#000;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-thick-dark.mCSB_scrollTools{box-shadow:inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal{box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 1px 0 0 rgba(255,255,255,.4),inset -1px 0 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4),inset 0 -1px 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#777}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer{background-color:#fff;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{right:0;margin:12px 0}.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:0;margin:0 12px}.mCS-dir-rtl>.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCS-dir-rtl>.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{left:0;right:auto}.mCS-minimal-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_vertical .mCSB_dragger{height:50px}.mCS-minimal-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_horizontal .mCSB_dragger{width:50px}.mCS-minimal.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools .mCSB_draggerRail{width:6px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px}.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:6px;margin:5px 0}.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:12px}.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:12px;margin:2px 0}.mCS-light-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools .mCSB_draggerRail{width:12px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;margin:3px 5px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:6px;margin:5px 3px;position:absolute;width:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:12px;margin:2px 0}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent;border-width:1px;border-style:solid;border-color:#fff;border-color:rgba(255,255,255,.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail{border-color:#000;border-color:rgba(0,0,0,.2)}.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.6)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.6)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.dropdown-menu{border:1px solid #ddd;background-color:#fff}.dropdown-menu li{border-top:1px solid #ddd;padding:2px 5px}.dropdown-menu li:first-child{border-top:none}.dropdown-menu .active,.dropdown-menu li:hover{background-color:#6eb7db;color:#fff}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff}.dropdown-menu{list-style:none;padding:0;margin:0}.dropdown-menu a:hover{cursor:pointer}.markItUp .markItUpButton1 a{background-image:url(../images/markitup/h1.png)}.markItUp .markItUpButton2 a{background-image:url(../images/markitup/h2.png)}.markItUp .markItUpButton3 a{background-image:url(../images/markitup/h3.png)}.markItUp .markItUpButton4 a{background-image:url(../images/markitup/bold.png)}.markItUp .markItUpButton5 a{background-image:url(../images/markitup/italic.png)}.markItUp .markItUpButton6 a{background-image:url(../images/markitup/stroke.png)}.markdown .markItUpButton7 a{background-image:url(../images/markitup/list-bullet.png)}.markdown .markItUpButton8 a{background-image:url(../images/markitup/list-numeric.png)}.markdown .markItUpButton9 a{background-image:url(../images/markitup/picture.png)}.markdown .markItUpButton10 a{background-image:url(../images/markitup/link.png)}.markdown .markItUpButton11 a{background-image:url(../images/markitup/quotes.png)}.markdown .markItUpButton12 a{background-image:url(../images/markitup/code.png)}.markdown .preview-icon a{background-image:url(../images/markitup/preview.png)}.markdown .help a{background-image:url(../images/markitup/help.png)}.markItUp *{margin:0;padding:0;outline:0}.markItUp a:link,.markItUp a:visited{color:#000;text-decoration:none}.markItUpContainer{font:11px Verdana,Arial,Helvetica,sans-serif}.markItUpEditor{font:12px 'Courier New',Courier,monospace;padding:5px;height:320px;clear:both;overflow:auto}.markItUpPreviewFrame{overflow:auto;background-color:#FFF;width:99.9%;height:300px;margin:5px 0}.markItUpFooter{width:100%}.markItUpResizeHandle{overflow:hidden;width:22px;height:5px;margin-left:auto;margin-right:auto;background-image:url(../images/markitup/handle.png);cursor:n-resize}.markItUp .markItUpHeader ul{margin:0}.markItUpHeader ul li{list-style:none;position:relative;margin:3px}.markItUpHeader ul li:hover>ul{display:block}.markItUpHeader ul .markItUpDropMenu{background:url(../images/markitup/menu.png) 115% 50% no-repeat;margin-right:5px}.markItUpHeader ul .markItUpDropMenu li{margin-right:0}.markItUpHeader ul ul{display:none;position:absolute;top:18px;left:0;background:#FFF;border:1px solid #000}.markItUpHeader ul ul li{float:none;border-bottom:1px solid #000}.markItUpHeader ul ul .markItUpDropMenu{background:url(../images/markitup/submenu.png) 100% 50% no-repeat #FFF}.markItUpHeader ul .markItUpSeparator{margin:2px 10px 0;width:1px;height:16px;overflow:hidden;background-color:#CCC}.introjs-button,button{overflow:visible}.markItUpHeader ul ul .markItUpSeparator{width:auto;height:1px;margin:0}.markItUpHeader ul ul ul{position:absolute;top:-1px;left:150px}.markItUpHeader ul ul ul li{float:none}.markItUpHeader ul a{display:block;width:16px;height:16px;text-indent:-10000px;background-repeat:no-repeat;padding:3px;margin:0}.markItUpHeader ul ul a{display:block;text-indent:0;width:120px;padding:5px 5px 5px 25px;background-position:2px 50%}.markItUpHeader ul ul a:hover{color:#FFF;background-color:#000}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}mark{background:#ff0;color:#000}sub,sup{line-height:0;position:relative}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}optgroup{font-weight:700}/*! + * Pikaday + * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ + */.pika-single{display:block;position:relative;width:240px;padding:8px;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-title{position:relative;text-align:center}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;filter:alpha(opacity=0);opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.introjs-bullets ul,.introjs-button,.pika-select{display:inline-block}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-table{width:100%;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700;text-align:center}.pika-button{cursor:pointer;display:block;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.is-today .pika-button{color:#3af;font-weight:700}.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.pika-button:hover{color:#fff!important;background:#ff8000!important;box-shadow:none!important;border-radius:3px!important}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;position:absolute!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border-radius:4px;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0);filter:progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000);box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid #fff;position:absolute}.introjs-arrow.top,.introjs-arrow.top-middle,.introjs-arrow.top-right{top:-10px;border-color:transparent transparent #fff}.introjs-arrow.top-right{right:10px}.introjs-arrow.top-middle{left:50%;margin-left:-5px}.introjs-arrow.left,.introjs-arrow.right{top:10px}.introjs-arrow.right,.introjs-arrow.right-bottom{right:-10px;border-color:transparent transparent transparent #fff}.introjs-arrow.right-bottom{bottom:10px}.introjs-arrow.bottom{bottom:-10px;border-color:#fff transparent transparent}.introjs-arrow.left,.introjs-arrow.left-bottom{left:-10px;border-color:transparent #fff transparent transparent}.introjs-arrow.left-bottom{bottom:10px}.introjs-tooltip{position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{position:relative;margin:10px 0 0;text-decoration:none;font:11px/normal sans-serif;white-space:nowrap;cursor:pointer;outline:0;-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;zoom:1}.introjs-progress,.loader-active,.taskboard,.taskboard-inner,body.loading-project,h1 .date,h1 span{overflow:hidden}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-bullets{text-align:center}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0}.introjs-bullets ul li{list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{height:10px;margin:10px 0 5px;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{float:left;width:0;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.admin-membership header a,.header-with-actions .button,.kanban .kanban-settings,.save-wiki{float:right}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.master,fieldset{position:relative}body,html{width:100%;min-height:100%}*{box-sizing:border-box}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{border:0;font:inherit;font-size:100%;margin:0;padding:0;vertical-align:baseline}body,h1,h2,h3,h4,h5,h6{font-weight:400;color:#212121}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}body{font-weight:400;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.3}.icon{font-family:taiga}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body .master.ng-animate{-webkit-transition:0;transition:0}.drag-active{overflow-x:hidden}.master{height:100%;min-height:100%}.menu-secondary,.menu-tertiary,.wrapper{min-height:calc(100vh - 40px)}.centered{margin:1rem auto;max-width:1200px;min-width:960px;width:90%}.wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-secondary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary.filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0;-webkit-transition:all .2s linear;transition:all .2s linear;width:0}.menu-secondary.filters-bar.active{padding:2em 1em;-webkit-transition:all .2s linear;transition:all .2s linear;width:260px}.menu-secondary.filters-bar.active .filters-inner{opacity:1;-webkit-transition:all .4s ease-in;transition:all .4s ease-in}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;min-width:0;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions .action-buttons{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;margin-left:10px}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}h1 span,h2{font-size:1.6rem}h1{font-size:2rem;margin-bottom:1rem;text-transform:uppercase}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.ttf) format("truetype")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.ttf) format("truetype")}@font-face{font-family:OpenSans-Regular;src:url(../fonts/OpenSans-Regular.ttf) format("truetype")}@font-face{font-family:OpenSans-Semibold;src:url(../fonts/OpenSans-Semibold.ttf) format("truetype")}@font-face{font-family:taiga;font-style:normal;font-weight:400;src:url(../fonts/taiga.eot);src:url(../fonts/taiga.eot?) format("eot"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype")}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.5}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}h1 span{margin-right:.5rem;vertical-align:bottom}h1 span.green,h1 span:last-child{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#000}h1 .date{max-width:500px}h2{line-height:1.2;margin-bottom:1rem}p{line-height:1.5;margin:0 0 20px}p img{margin:0}em{font-style:italic}strong{font-weight:700}[class*=' icon-']::before,[class^=icon-]::before,[data-icon]::before{font-family:taiga!important;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal!important;font-variant:normal!important;font-weight:400!important;line-height:1;speak:none;text-transform:none!important}hr{border:solid #212121;border-width:1px 0 0;clear:both;height:0;margin:10px 0 30px}a,a:visited{text-decoration:none}a:hover,a:visited:hover{-webkit-transition:color .3s linear;transition:color .3s linear}[data-icon]::before{content:attr(data-icon)}.admin-contrib .help .alt-image,.admin-third-parties .help .alt-image,.wysiwyg dl dt{font-style:italic}.icon-bug::before{content:'a'}.icon-copy::before{content:'b'}.icon-minimize::before{content:'c'}.icon-maximize::before{content:'d'}.icon-comment::before{content:'e'}.icon-plus::before{content:'f'}.icon-attachments::before{content:'g'}.icon-edit::before{content:'h'}.icon-documents::before{content:'i'}.icon-delete::before{content:'j'}.icon-arrow-bottom::before{content:'k'}.icon-arrow-left::before{content:'l'}.icon-arrow-right::before{content:'m'}.icon-arrow-up::before{content:'n'}.icon-briefcase::before{content:'o'}.icon-caret-down::before{content:'p'}.icon-caret-up::before{content:'q'}.icon-check-square::before{content:'r'}.icon-notification-error::before{content:'s'}.icon-settings::before{content:'t'}.icon-document::before{content:'u'}.icon-warning::before{content:'v'}.icon-move::before{content:'w'}.icon-drag-v::before{content:'x'}.icon-filter::before{content:'y'}.icon-help::before{content:'z'}.icon-reload::before{content:'A'}.icon-writer::before{content:'B'}.icon-stats::before{content:'C'}.icon-floppy::before{content:'D'}.icon-warning-alt::before{content:'E'}.icon-video::before{content:'F'}.icon-bulk::before{content:'G'}.icon-vunfold::before{content:'H'}.icon-tasks::before{content:'I'}.icon-kanban::before{content:'J'}.icon-search::before{content:'K'}.icon-wiki::before{content:'L'}.icon-team::before{content:'M'}.icon-vfold::before{content:'N'}.icon-issues::before{content:'O'}.icon-iocaine::before{content:'P'}.icon-archive::before{content:'Q'}.icon-capslock::before{content:'R'}.icon-upload::before{content:'S'}.icon-github::before{content:'T'}.icon-timeline::before{content:'U'}.icon-scrum::before{content:'V'}.icon-project::before{content:'W'}.icon-heart::before{content:'X'}.icon-eye::before{content:'Y'}@-webkit-keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@-webkit-keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;flex:10}}@keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;-ms-flex:10;flex:10}}@-webkit-keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes blink{85%{opacity:1}100%{opacity:.6}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote cite,sup{font-size:.9rem}.spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32;max-height:2rem;max-width:2rem}blockquote,blockquote p{line-height:1.25rem}blockquote{margin:0 0 20px;padding:.5rem 1.25rem}blockquote cite{display:block}blockquote cite::before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}sup{vertical-align:super}.icon{vertical-align:middle}.clickable{cursor:pointer}.not-clickable{cursor:default}.draggable{cursor:move}svg{height:1rem;width:1rem}.pika-single{z-index:999999}.pika-single .pika-title{color:#212121}.pika-single .is-selected .pika-button{background:#000;border-radius:0!important;box-shadow:inset 0 1px 3px #000}.pika-single .is-today .pika-button{color:#000}.pika-single .is-today.is-selected button{color:#fff}.pika-single .pika-button:hover{background:#212121!important;border-radius:0!important;box-shadow:inset 0 1px 3px #212121!important}fieldset{border:0;margin:0;padding:0;width:100%}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{border:1px solid;margin:0;padding:8px;width:100%}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{-webkit-transition:border .3s linear;transition:border .3s linear}button,button:active,button:focus{border:0;outline:0}textarea{min-height:10rem}.checksley-error-list{margin-bottom:0}.checksley-error-list li{padding:.2rem}.icon-capslock{bottom:.6rem;color:#757575;display:none;position:absolute;right:1rem}.auth,.error-main{bottom:0;z-index:999;left:0}.admin-membership header:after{clear:both;content:'';display:table}.admin-membership .check input{height:40px;width:85px}.admin-attributes .admin-attributes-section .checksley-error-list li{font-weight:100}.admin-roles p{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#757575}.auth .logo,.auth .tagline{color:#fff;text-align:center}.admin-attributes .admin-attributes-section{margin-bottom:2rem}.admin-attributes .admin-attributes-section .checksley-error-list{height:0;position:relative}.admin-attributes .admin-attributes-section .checksley-error-list li{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,36,0,.7);position:absolute;width:100%}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.project-values-title{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem;text-transform:uppercase}.project-values-title h2{margin:0}.auth .logo,.auth .tagline,.auth form{margin-bottom:1rem}.project-values-title h2 span{margin-left:.5rem;text-transform:none}.project-values-title a{display:inline-block}.auth{background:url(https://farm9.staticflickr.com/8449/7893171238_a201af22bc_k_d.jpg) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:fixed;right:0;top:0}.invitation-main .avatar,.invitation-main .invitation-container,.kanban{-webkit-box-orient:vertical;-webkit-box-direction:normal}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.auth .logo{font-size:3rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.auth .auth-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{text-align:center;width:100%}.auth .logo-svg svg{height:8rem;width:8rem}.kanban,.taskboard{height:calc(100vh - 40px)}.auth fieldset{margin-bottom:.5rem}.auth .login-text,.auth .register-text{text-align:center}.auth .login-text a:hover,.auth .register-text a:hover{color:#212121}.auth .button{color:#fff;display:block;text-align:center}.auth a:hover{color:#fff}.moustache{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moustache;animation-name:moustache;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;fill:rgba(0,0,0,.9);stroke:#212121;stroke-width:1px;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transition:.3s;transition:.3s}.moustache:hover{fill:rgba(33,33,33,.9);-webkit-transition:.3s;transition:.3s}.list-itemtype-project .icon path,.list-itemtype-project .list-itemtype-track-likers.active path,.list-itemtype-project .list-itemtype-track-watchers.active path,.list-itemtype-ticket .icon path,.list-itemtype-ticket .list-itemtype-track-likers.active path,.list-itemtype-ticket .list-itemtype-track-watchers.active path,.list-itemtype-timeline .icon path,.list-itemtype-timeline .list-itemtype-track-likers.active path,.list-itemtype-timeline .list-itemtype-track-watchers.active path,.list-itemtype-user .icon path,.list-itemtype-user .list-itemtype-track-likers.active path,.list-itemtype-user .list-itemtype-track-watchers.active path{fill:currentcolor}@-webkit-keyframes moustache{0%,30%,70%,90%{-webkit-transform:rotate(0);transform:rotate(0)}10%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}@keyframes moustache{0%,30%,70%,90%{-webkit-transform:rotate(0);transform:rotate(0)}10%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}.backlog-menu{background:#757575;color:#212121;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .trans-button{color:#212121;display:inline-block;padding:.4rem 1.5rem}.backlog-menu .trans-button.active,.backlog-menu .trans-button:hover{background:#757575;color:#757575}.backlog-menu .trans-button.active:hover{background:#c2c2c2}.backlog-menu .trans-button.move-to-sprint{display:none}.invitation-main,.invitation-main .invitation-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-menu .button-bulk{margin-left:.2rem}.invitation-main{background:url(https://farm9.staticflickr.com/8449/7893171238_a201af22bc_k_d.jpg) center center no-repeat;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-size:cover;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;z-index:999}.invitation-main .invitation-form .forgot-pass{font-size:.9rem}.invitation-main .avatar .person-name,.invitation-main .invitation-text,.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-weight:100;font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.invitation-main .invitation-container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar .person-name{color:#fff}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{color:#fff;text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{color:#757575;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#212121;-webkit-transition:color .3s linear;transition:color .3s linear}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header,.invitation-main .register-text{color:#fff}.invitation-main .login-form,.invitation-main .register-form{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .register-text a{color:#000}.invitation-main .button-auth{display:block}.invitation-main .button-blackish:hover{background:#000}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.issues .filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:260px}.issues .filters-inner{opacity:1;padding:1rem}.kanban{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px)}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.error-main,.taskboard-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.error-main{background:url(https://farm9.staticflickr.com/8449/7893171238_a201af22bc_k_d.jpg) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:fixed;right:0;top:0}.basic-table,.taskboard-inner,.us-story-main-data .us-title{-webkit-box-orient:vertical;-webkit-box-direction:normal}.error-main .error-container{color:#fff;-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;text-align:center}.error-main .logo-svg{padding:0 32%;text-align:center;width:100%}.error-main h1{color:#fff;margin-bottom:3rem}.error-main a{color:#000}.error-main a:hover{color:#212121}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.taskboard-inner{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%}.us-story-main-data .us-title,.us-story-main-data header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.team h2{margin:1rem 0}.team h2 span:last-child{color:#000}.us-story-main-data .us-title,.us-story-main-data .us-title .us-number,.us-story-main-data .us-title .us-title-text{font-weight:400}.us-story-main-data .us-title .block-desc-container,.us-story-main-data .us-title .us-related-task{font-size:.9rem}.us-story-main-data .us-title,.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{font-size:1.2rem}.us-story-main-data .us-title .us-title-text{font-size:1.6rem}.blocked-warning .blocked,.blocked-warning .icon,.issue-nav a{font-size:2rem}.blocked-warning .blocked{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.us-story-main-data .us-title,.us-story-main-data .us-title .us-number,.us-story-main-data .us-title .us-title-text{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.us-story-main-data .us-title .block-description-title,.us-story-main-data .us-title.blocked .unblock{font-weight:800;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.card-placeholder p,.wiki .wiki-title{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32}.us-story-main-data{margin-bottom:1rem}.us-story-main-data header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.us-story-main-data .us-title{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;background:#757575;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:.5rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear}.us-story-main-data .us-title.blocked{background:#ff2400;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:middle}.us-story-main-data .us-title.blocked .us-title-text,.us-story-main-data .us-title.blocked input{margin-bottom:.5rem}.us-story-main-data .us-title.blocked .us-name,.us-story-main-data .us-title.blocked .us-number,.us-story-main-data .us-title.blocked .us-related-task{color:#fff}.us-story-main-data .us-title.blocked a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title.blocked a:hover{color:#ff0062}.us-story-main-data .us-title.blocked .unblock{color:#fff;float:right}.us-story-main-data .us-title.blocked .unblock:hover{color:#ff0062;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title p{margin-bottom:0}.us-story-main-data .us-title .us-edit-name-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.us-story-main-data .us-title .edit-subject{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%}.us-story-main-data .us-title input{background:#fff;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.us-story-main-data .us-title .save-container{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.us-story-main-data .us-title .us-title-text{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-bottom:0;max-width:92%;width:100%}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{max-height:1.5rem;max-width:1.5rem}.us-story-main-data .us-title .us-title-text:hover .icon-edit{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.us-story-main-data .us-title .us-number{color:#757575;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;line-height:2.2rem;margin-right:.5rem}.us-story-main-data .us-title .us-name{color:#757575;display:inline-block;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;line-height:2.2rem;padding-right:1rem;width:100%}.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{color:#757575;margin-left:.5rem}.us-story-main-data .us-title .icon-edit{opacity:0}.us-story-main-data .us-title .us-related-task{color:#757575;margin-top:.5rem}.us-story-main-data .us-title .us-related-task a{border-left:1px solid #757575;padding:0 .2rem}.us-story-main-data .us-title .us-related-task a:hover{color:#000}.us-story-main-data .us-title .us-related-task a:first-child{border:0}.us-story-main-data .us-title .block-description-title{color:#fff;margin-right:.5rem}.us-story-main-data .us-title .block-description{color:#fff;display:inline-block;margin-right:5rem}.basic-table,.subheader{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.blocked-warning{margin-bottom:1rem}.blocked-warning .blocked{color:#ff2400;line-height:2.5rem;margin-bottom:.5rem}.blocked-warning .icon{vertical-align:middle}.blocked-warning .block-description{color:#212121;margin:0}.duty-content .edit-description,.wiki-content{margin-bottom:2rem}.issue-nav{position:absolute;right:1rem;top:1rem}.subheader{display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:1280px){.subheader{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}}.subheader .ticket-created-by{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-basis:250px;-ms-flex-preferred-size:250px;flex-basis:250px}@media (max-width:1280px){.subheader .ticket-created-by{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}}.subheader .tags-block{-webkit-box-flex:3;-webkit-flex:3;-ms-flex:3;flex:3}@media (max-width:1280px){.subheader .tags-block{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}}.duty-content{position:relative}.duty-content .in-progress{cursor:progress}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#757575;cursor:pointer}.duty-content:hover .view-description .no-description{color:#212121}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#757575}.duty-content textarea{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-content .edit{color:#212121}.duty-content .view-description .edit{background:#757575;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .save{top:.4rem}.duty-content .edit-description .edit{position:absolute;right:2.5rem;top:.4rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wiki .remove{font-size:.9rem;color:#757575}.wiki .wiki-title{font-size:1.6rem}.wiki .remove:hover span{color:#212121;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove:hover .icon{color:#ff2400;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove .icon{color:#757575;margin-right:.2rem}.wiki-content{position:relative}.wiki-content .in-progress{cursor:progress}.wiki-content.editable:hover .wysiwyg{background:#757575;cursor:pointer}.wiki-content .view-wiki-content:hover .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .view-wiki-content .edit{background:#757575;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .icon:hover{color:#212121;opacity:.3;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .preview-icon{position:absolute;right:3.5rem}.wiki-content .edit-wiki-content .action-container{position:absolute;right:1rem;top:.3rem}.wiki-content .edit-wiki-content .edit{position:absolute;right:3.5rem;top:.4rem}.wiki-content .preview{padding-top:1.8rem}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row,.card-placeholder .placeholder-avatar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.basic-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #6b6b6b;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}.basic-table .row .width-1{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:4;-webkit-flex-grow:4;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:5;-webkit-flex-grow:5;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:7;-webkit-flex-grow:7;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.beta{left:0;position:absolute;top:0;z-index:9999}.button,.button-auth,.button-blackish,.button-bulk,.button-gray,.button-green,.button-red,.trans-button,a.button-gray,a.button-green{font-weight:100;font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:0 0;border:0;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;padding:.4rem 2rem;text-align:center;text-transform:uppercase;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:middle}.trans-button{font-size:1rem}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button:hover,.trans-button:hover{color:#fff;-webkit-transition:all .2s linear;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.trans-button span{-webkit-animation:loading .5s linear;animation:loading .5s linear}.admin-project-export-result .spin img,.loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.button span,.button-auth span,.button-blackish span,.button-bulk span,.button-gray span,.button-green span,.button-red span,.trans-button span{color:#fff}.button .icon,.button-auth .icon,.button-blackish .icon,.button-bulk .icon,.button-gray .icon,.button-green .icon,.button-red .icon,.trans-button .icon{color:#fff;margin-right:.3rem}.trans-button .icon,.trans-button span{color:#212121;-webkit-transition:color .2s linear;transition:color .2s linear}.trans-button.active .icon,.trans-button.active span,.trans-button:hover .icon,.trans-button:hover span{color:#000}.trans-button:visited{color:#212121}.submit-button{width:100%}.button-green,a.button-green{background:#000}.button-green.active,.button-green:hover,a.button-green.active,a.button-green:hover{background:#212121;color:#fff}.button-gray,a.button-gray{background:#757575}.button-gray.active,.button-gray:hover,a.button-gray.active,a.button-gray:hover{background:#212121;color:#fff}.button-blackish{background:#212121;color:#757575}.button-blackish:hover{background:#212121;color:#fff}.button-red{background:#ff0062}.button-red:hover{background:#ff2400;color:#fff}.button-red .icon{color:#fff}.button-block{background:#fff;color:#ff2400}.button-block:hover{background:#ff0062;color:#fff}.button-bulk{background:#000;padding:.35rem .5rem}.button-bulk .icon{margin-right:0}.button-auth,.button-bulk:hover{background:#212121}.button-auth .icon,.button-auth img{font-size:1.2rem;color:#fff;margin-right:.5rem}.button-auth:hover{background:#000}.card-placeholder{background:#707070;border:1px dashed #616161;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:flex}.card-placeholder .image{background:#616161;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.card-placeholder .line{background:#616161;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{color:#757575;margin:0}.check{background-color:#5c5c5c;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:500px;left:-10px;opacity:0;position:absolute;top:-10px;width:500px;z-index:999}.check input+div{background-color:#757575;height:25px;-webkit-transition:all .2s linear;transition:all .2s linear;width:50%}.check input~.check-text{font-weight:400;font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff;position:absolute;top:.2rem}.check input~.check-yes{opacity:0;right:.5rem}.check input~.check-no{left:.5rem;opacity:.6}.check input:checked+div{background-color:#212121;margin-left:50%;-webkit-transition:all .2s linear;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.check input:disabled{cursor:auto}.check input:disabled+div{background-color:#757575}.ticket-created-by{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}@media (max-width:1280px){.ticket-created-by{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:.5rem}}.ticket-created-by .user-avatar{-webkit-flex-basis:2rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-left:.5rem}.ticket-created-by .user-avatar img{width:100%}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{font-weight:100;font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block;text-align:right}.ticket-estimation .points-per-role,.wysiwyg-help{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}@media (max-width:1280px){.ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ticket-created-by .created-by{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{text-align:left}}.ticket-created-by .created-by .created-title{color:#000}.ticket-created-by .created-by .created-date{margin-left:.5rem}@media (max-width:1280px){.ticket-created-by .created-by .created-date{margin-left:0}}.drag-drop-help,.help-button,.help-markdown{font-size:.75rem}.wysiwyg-help{background:#757575;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:-.5rem;padding:.25rem .5rem}.drag-drop-help{color:#757575}.help-button:hover span,.help-markdown:hover span{-webkit-transition:color .2s linear;transition:color .2s linear}.help-button:hover .icon,.help-markdown:hover .icon{color:#212121;-webkit-transition:color .2s linear;transition:color .2s linear}.help-button .icon,.help-markdown .icon{margin-right:.2rem}.ticket-estimation .popover,.ticket-estimation .popover.fix,.ticket-estimation .ticket-role-points .points,.ticket-estimation .ticket-role-points .role{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .ticket-role-points:last-child .icon-arrow-bottom,.ticket-estimation .ticket-role-points:last-child .points,.ticket-estimation .ticket-role-points:last-child .role{font-weight:400;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#757575}.ticket-estimation .popover,.ticket-estimation .popover a,.ticket-estimation .popover.fix,.ticket-estimation .popover.fix a{font-size:.9rem}.ticket-estimation .points-per-role{display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.empty-burndown,.loading-bar{-webkit-box-orient:horizontal}.ticket-estimation .ticket-role-points{background:rgba(117,117,117,.2);color:#757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.1rem;min-height:2rem;padding:.5rem 1rem;position:relative;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .ticket-role-points.clickable.active,.ticket-estimation .ticket-role-points.clickable:hover{background:rgba(33,33,33,.9);color:#757575}.ticket-estimation .ticket-role-points.clickable.active .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable.active .points,.ticket-estimation .ticket-role-points.clickable.active .role,.ticket-estimation .ticket-role-points.clickable:hover .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable:hover .points,.ticket-estimation .ticket-role-points.clickable:hover .role{color:#757575}.ticket-estimation .ticket-role-points:last-child{background:rgba(0,0,0,.5);border-bottom:0;color:#757575}.ticket-estimation .ticket-role-points .icon-arrow-bottom{color:#757575;margin-left:.25rem;vertical-align:middle}.ticket-estimation .popover,.ticket-estimation .popover.fix{margin:0;z-index:99;background:#212121;position:absolute;list-style-type:none}.ticket-estimation .ticket-role-points .points{color:#212121}.ticket-estimation .popover{color:#fff;display:none;left:.5rem;padding:10px;top:100%;width:200px}.ticket-estimation .popover a{border-bottom:1px solid #212121;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#212121;content:'';height:10px;left:10px;position:absolute;top:-5px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:10px}.ticket-estimation .popover li{display:inline-block;width:23%}.ticket-estimation .popover a{display:block;text-align:center}.ticket-estimation .popover a.active,.ticket-estimation .popover a:hover{background:#212121;color:#fff}.ticket-estimation .popover.fix{color:#fff;display:none;left:-160px;padding:10px;top:100%;width:200px}.ticket-estimation .popover.fix a{border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.ticket-estimation .popover.fix a:last-child{border:0}.ticket-estimation .popover.fix a:hover{color:#212121;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#212121;content:'';height:10px;left:90%;position:absolute;top:-5px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:10px}.single-filter{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;cursor:pointer;display:block;margin-bottom:.5rem;opacity:.5;position:relative}.single-filter:after{clear:both;content:'';display:table}.single-filter.active,.single-filter.selected,.single-filter:hover{color:#212121;opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{background:#5c5c5c;display:block;width:100%}.single-filter .number{background:#424242;position:absolute;right:0;top:0}.single-filter .icon-delete{color:#212121;position:absolute;right:.5rem;top:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.single-filter .icon-delete:hover{color:#ff2400;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task .task-name{font-weight:800;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.kanban-task .avatar a,.kanban-task .task-text,.kanban-task-maximized .task-archived p,.kanban-task-maximized .task-points,.kanban-task-minimized .task-archived{font-size:.9rem}.kanban-task-minimized .icon-drag-h{font-size:1rem}.kanban-task .icon-drag-h,.kanban-task .icon-edit{font-size:1.2rem}.kanban-task{background:#F0EFD1;border:1px solid #000;box-shadow:none;cursor:move;margin:.2rem;position:relative}.kanban-task:last-child{margin-bottom:0}.kanban-task:hover .icon-drag-h,.kanban-task:hover .icon-edit{color:#000;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.kanban-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.kanban-task.ui-sortable-placeholder{background:#212121}.kanban-task.blocked{background:#ff2400;border:1px solid #cc1d00;color:#fff}.kanban-task.blocked a,.kanban-task.blocked span{color:#fff}.kanban-task.card-placeholder{background:#707070;border:3px dashed #616161;cursor:default}.kanban-task .kanban-tagline{border-color:#000;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.6rem}.kanban-task .kanban-tag{border-top:.3rem solid #000;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.kanban-task .kanban-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.kanban-task .avatar-wrapper{-webkit-flex-basis:55px;-ms-flex-preferred-size:55px;flex-basis:55px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:55px}.kanban-task .avatar-wrapper img{width:100%}.kanban-task .avatar a{text-align:center}.kanban-task .avatar img{margin:0 auto}.kanban-task .avatar img:hover{border:2px solid #000;-webkit-transition:border .3s linear;transition:border .3s linear}.kanban-task .task-text{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 .5rem 0 .8rem}.kanban-task .task-assigned{color:#000;display:block}.kanban-task .task-num{color:#212121;margin-right:.3rem}.kanban-task .loading{bottom:.5rem;position:absolute}.kanban-task .icon-drag-h,.kanban-task .icon-edit{color:#000;opacity:0;position:absolute;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.kanban-task .icon-drag-h:hover,.kanban-task .icon-edit:hover{color:#000;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task-maximized .task-archived{background:#686868;padding:.5rem;text-align:left;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived:hover{background:#616161;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-maximized .task-archived span{color:#757575}.kanban-task-maximized .task-archived p{color:#757575;margin:0}.kanban-task-maximized .task-archived p:last-child{color:#757575;margin:.5rem 0;text-align:center}.kanban-task-maximized .icon-edit,.kanban-task-maximized .loading{bottom:.2rem;right:.5rem}.kanban-task-maximized .icon-drag-h{font-size:2rem;bottom:.2rem;cursor:move;right:45%}.kanban-task-maximized .task-points{color:#000;margin:0}.kanban-task-maximized .task-points span{display:inline-block}.kanban-task-maximized .task-points span:first-child{padding-right:.2rem}.kanban-task-maximized .task-points .points-text{text-transform:lowercase}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{line-height:1.4;text-transform:none}.kanban-task-maximized .kanban-tag{border-top:.3rem solid}.kanban-task-minimized .kanban-task-inner{padding:0 .3rem}.kanban-task-minimized .task-archived{background:#686868;padding:.3rem;text-align:left}.kanban-task-minimized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-minimized .task-archived span{color:#757575}.kanban-task-minimized .task-archived .task-name{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kanban-task-minimized .task-archived p{color:#757575;margin:0}.kanban-task-minimized .task-archived p:last-child{display:none}.kanban-task-minimized .task-num{vertical-align:top}.kanban-task-minimized .task-name{display:inline-block;overflow:hidden;width:135px}.kanban-task-minimized .task-points{display:none}.kanban-task-minimized .icon-drag-h,.kanban-task-minimized .icon-edit{top:1.4rem}.kanban-task-minimized .icon-edit{bottom:.2rem;right:1rem}.kanban-task-minimized .icon-drag-h{cursor:move;right:.1rem;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.kanban-task-minimized .kanban-tag{border-top:.2rem solid}.level{background-color:#757575;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project p,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user .extra-info,.list-itemtype-user p{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{font-weight:400;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.list-itemtype-project .list-itemtype-track,.list-itemtype-ticket .list-itemtype-track,.list-itemtype-timeline .list-itemtype-track,.list-itemtype-user .extra-info,.list-itemtype-user .list-itemtype-track{font-size:.9rem}.list-itemtype-ticket h2{font-size:1rem}.list-itemtype-project h2,.list-itemtype-user h2,.loader p{font-size:1.2rem}.list-itemtype-project{border-bottom:1px solid #757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{color:#757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-project .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-project .list-itemtype-track-likers,.list-itemtype-project .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#000}.list-itemtype-project .icon svg{height:1rem;width:1rem}.list-itemtype-project h2,.list-itemtype-project p{margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-project .list-itemtype-avatar img{width:100%}.list-itemtype-project .list-itemtype-project-data-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;width:3rem}.list-itemtype-project .list-itemtype-project-members,.list-itemtype-project .list-itemtype-project-tags{-webkit-align-self:flex-end;-ms-flex-item-align:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-project .list-itemtype-project-image img{width:100%}.list-itemtype-project .list-itemtype-project-members{align-self:flex-end;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-wrap:wrap-reverse;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse;margin-top:1rem}.list-itemtype-project .list-itemtype-project-members img{border-radius:.1rem;margin-right:.3rem;width:2rem}.list-itemtype-project .list-itemtype-project-tags{align-self:flex-end;display:flex;-webkit-box-flex:3;-webkit-flex:3;-ms-flex:3;flex:3;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:.5rem}.list-itemtype-project .tag{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket h2,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user h2,.list-itemtype-user p{margin-bottom:0}.list-itemtype-ticket,.list-itemtype-timeline,.list-itemtype-user{border-bottom:1px solid #757575;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track{color:#757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-ticket .list-itemtype-track-likers,.list-itemtype-ticket .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user,.list-itemtype-user .list-itemtype-track{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#000}.list-itemtype-ticket .icon svg{height:1rem;width:1rem}.list-itemtype-ticket .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-ticket .list-itemtype-avatar img{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-project{color:#757575}.list-itemtype-ticket .list-itemtype-ticket-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-id{color:#757575;margin-right:.3rem}.list-itemtype-ticket .ticket-blocked{color:#ff2400;margin-left:.3rem}.list-itemtype-user{display:flex}.list-itemtype-user .list-itemtype-track{color:#757575;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-user .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-user .list-itemtype-track-likers,.list-itemtype-user .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#000}.list-itemtype-user .icon svg{height:1rem;width:1rem}.list-itemtype-user .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .list-itemtype-avatar img{width:100%}.list-itemtype-user .extra-info{margin-top:.25rem}.list-itemtype-timeline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track{color:#757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-timeline .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-timeline .list-itemtype-track-likers,.list-itemtype-timeline .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track-likers .icon,.list-itemtype-timeline .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-timeline .list-itemtype-track-likers.active,.list-itemtype-timeline .list-itemtype-track-watchers.active{color:#000}.list-itemtype-timeline .icon svg{height:1rem;width:1rem}.list-itemtype-timeline .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-timeline h2{margin-bottom:0}.admin-menu li,.empty-backlog .title,.empty-burndown .title,.sprints-empty .title,.taskboard-table-header .task-colum-name,.ticket-header .detail-status-inner,.ticket-header .ticket-title,.wysiwyg h1,.wysiwyg h2,.wysiwyg h3,tg-project-menu{text-transform:uppercase}.list-itemtype-timeline .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.loader p{color:#757575;text-align:center}.loader{background-color:#fff;bottom:0;display:none;height:100%;left:0;opacity:0;position:fixed;right:0;top:0;z-index:-100}.loader .container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar,.notification-light{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.loading-bar{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:loadBar;animation-name:loadBar;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;background:#757575;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{-webkit-animation-delay:0s;animation-delay:0s;background:#ffc107}.loading-bar .item-1{-webkit-animation-delay:1s;animation-delay:1s;background:#009688}.loading-bar .item-2{-webkit-animation-delay:2s;animation-delay:2s;background:#e91e63}.loading-bar .item-3{-webkit-animation-delay:3s;animation-delay:3s;background:#9c27b0}.loading-bar .item-4{-webkit-animation-delay:4s;animation-delay:4s;background:#cddc39}.loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;-webkit-transform-origin:32 32;transform-origin:32 32}.markItUpHeader ul{background:#757575;padding:.3rem}.markItUpHeader ul li{display:inline-block;float:none}.markItUpHeader ul li a{opacity:.8}.markItUpHeader ul li a:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.markItUpHeader ul .preview-icon{position:absolute;right:2.5rem}.markItUpContainer{padding:0}.markdown{position:relative}.preview .actions{background:#757575;margin-top:.5rem;min-height:2rem;padding:.3rem}.notification-light p{font-weight:100;font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.notification-message-success .warning{font-size:1.2rem;color:#fff;line-height:1.2}.notification-message-error .warning{font-size:2rem;color:#fff;line-height:2.4rem}.notification-message-error .icon-notification-error{font-size:3rem;display:inline;vertical-align:sub}.notification-message-error .warning,.notification-message-success .warning{font-weight:800;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.notification-message-success{background:rgba(33,33,33,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);opacity:1;right:-370px;top:2%;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{-webkit-animation:animSlide 2s linear both;animation:animSlide 2s linear both;opacity:1}.notification-message-success p{margin:0}@-webkit-keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}.notification-message-error{background:rgba(255,36,0,.9);top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error.inactive{-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-light p,.notification-message-error .text p{margin:0}.notification-message-error .icon-delete{color:#fff;position:absolute;right:1rem;top:1rem}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(117,117,117,.95);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;opacity:0;padding:1rem;position:absolute;top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s;width:100%;z-index:99999}.paginator ul,.summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.notification-light.inactive{opacity:0;-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s}.notification-light.active{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s;transition:all .6s}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{margin-right:1rem;width:2rem}.notification-light .close path{fill:#fff}.notification-message-light-error{background:rgba(255,36,0,.8)}.paginator{margin:2rem 0}.paginator ul{display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator .dots,.paginator a{background:#757575;color:#fff;padding:.5rem 1rem;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator .active span,.paginator a:hover{background:#212121}.paginator a:hover{color:#fff;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator .dots{background:0 0;color:#757575}.v-pagination-list{overflow:hidden}.v-pagination-next,.v-pagination-previous{background-color:#757575;color:#757575;display:block;padding:.1rem 0;text-align:center;visibility:hidden;width:100%}.select-color,.select-color:after{background:#212121;position:absolute}.v-pagination-next:hover,.v-pagination-previous:hover{background-color:#212121;-webkit-transition:background .3s linear;transition:background .3s linear}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.private{display:inline-block;margin-left:.5rem;width:.5rem}.private svg{width:1rem;height:1rem}.private path{fill:#757575;-webkit-transition:fill .3s linear;transition:fill .3s linear}.select-color{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;border-radius:0 10px 10px 0;padding:15px}.select-color,.select-color a{font-size:.9rem}.select-color input{font-weight:400;font-size:1rem}.select-color a{border-bottom:1px solid #212121;color:#fff;display:block;padding:10px 2px}.select-color a:last-child{border:0}.select-color a:hover{color:#212121;-webkit-transition:color .3s linear;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:15px}.select-color li{float:left;margin:0 .5rem .5rem 0}.select-color li:nth-child(7n){margin-right:0}.select-color li:nth-last-child(-n+7){margin-bottom:0}.select-color .color{background-color:#757575;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background-color:#757575;width:243px}.select-color input::-webkit-input-placeholder{color:#757575}.select-color input::-moz-placeholder{color:#757575}.select-color input:-moz-placeholder{color:#757575}.select-color input:-ms-input-placeholder{color:#757575}.select-color .selected-color{background:#757575;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.empty-burndown,.empty-burndown .title,.summary .description{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.empty-burndown a,.summary .number{font-weight:800;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.summary .description{font-size:.9rem}.empty-burndown .title{font-size:1.2rem}.summary{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;padding:1em}.summary .summary-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .data .number{color:#212121}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{line-height:1}.summary .stats{cursor:pointer;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .color-line,.summary .stats:hover .graph{fill:#212121;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats.active .graph,.summary .stats.active svg,.summary .stats:hover svg{fill:#000}.summary .stats.active .color-line,.summary .stats.active .white-line{display:none}.summary .stats svg{fill:#000;height:100%;max-height:2rem;max-width:2rem;-webkit-transition:all .2s;transition:all .2s;width:100%}.summary .stats .color-line,.summary .stats .graph{fill:#424242;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats .white-line{fill:#212121}.empty-burndown path,.track-button.active .track-icon path{fill:#000}.summary .stats .color-line,.summary .stats .white-line{display:block}.summary-progress-bar{background:#fff;height:30px;margin-bottom:0;margin-right:10px;padding:3px;position:relative;width:15%}.summary-progress-bar .current-progress{background:#212121;height:24px}.summary-progress-bar .defined-points{background:#ff0062;height:24px;position:absolute;width:calc(100% - 6px)}.summary-progress-bar .project-points-progress{background:#fff;height:24px;position:absolute}.summary-progress-bar .closed-points-progress{background:#212121;height:24px;position:absolute}.large-summary{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.large-summary .large-summary-wrapper{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.empty-burndown,.taskboard-task .taskboard-tagline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.large-summary .summary-progress-bar{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.empty-burndown,.upvote-btn{-webkit-align-content:center;-ms-flex-line-pack:center}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats-divider{margin-right:2rem}.large-summary .icon{font-size:1.4rem;margin-right:.4rem}.large-summary .icon.icon-stats{color:#000;float:right;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#212121;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#212121}.large-summary .icon.icon-stats.active:hover{color:#000;-webkit-transition:color .3s linear;transition:color .3s linear}.empty-burndown{align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(0,0,0,.15);display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{-webkit-flex-basis:5rem;-ms-flex-preferred-size:5rem;flex-basis:5rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;width:5rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.empty-burndown .title{color:#000;margin:0}.empty-burndown a{-webkit-animation:blink 2s infinite;animation:blink 2s infinite}.graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.wysiwyg,.wysiwyg .codehilite{overflow:auto}.graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;-webkit-transition:none;transition:none}.tag{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;border-radius:0 5px 5px 0;color:#212121;display:inline-block;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.tag,.tags-block .add-tag-text,.tags-block .tag{font-size:.9rem}.tags-block .icon-plus{font-size:1.2rem}.tag .icon-delete{color:#757575;margin-left:1rem}.tag .icon-delete:hover{color:#ff2400}.ui-autocomplete{background:#fff;border:1px solid #757575;z-index:99910}.ui-autocomplete .ui-state-focus{background:#212121}.ui-autocomplete li{cursor:pointer}.ui-helper-hidden-accessible{display:none}.tags-block .tags-container{display:inline-block}.tags-block input{margin-right:.25rem;padding:.4rem;width:14rem}.tags-block input+.icon-floppy{margin-left:.5rem}.tags-block .tag{margin:0 .5rem .5rem 0;padding:.5rem}.tags-block .add-tag{color:#757575}.tags-block .add-tag:hover{color:#212121}.taskboard-task .task-name{font-weight:800;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name,.watch-options a{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.taskboard-task .task-assigned,.taskboard-task .taskboard-text,.taskboard-task .taskboard-user-avatar a{font-size:.9rem}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit,.taskboard-task .icon-iocaine{font-size:1.2rem}.taskboard-task{background:#F0EFD1;border:1px solid #000;box-shadow:none;cursor:move;margin:.2rem;position:relative}.taskboard-task:hover .icon-drag-h,.taskboard-task:hover .icon-edit{color:#000;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.taskboard-task.ui-sortable-placeholder{background:#212121}.taskboard-task .blocked{background:#ff2400;border:1px solid #cc1d00;color:#fff}.taskboard-task .blocked a,.taskboard-task .blocked span,.taskboard-task .blocked:hover .icon-drag-h,.taskboard-task .blocked:hover .icon-edit{color:#fff}.taskboard-task.card-placeholder{background:#707070;border:3px dashed #616161;cursor:default}.taskboard-task .taskboard-tagline{border-color:#000;display:flex;height:.6rem}.taskboard-task .taskboard-tag{border-top:.3rem solid #000;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.taskboard-task .taskboard-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.taskboard-task .taskboard-user-avatar{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:55px}.taskboard-task .taskboard-user-avatar a{display:block;text-align:center}.taskboard-task .taskboard-user-avatar img{margin:0 auto}.taskboard-task .taskboard-user-avatar img:hover{border:2px solid #000;-webkit-transition:border .3s linear;transition:border .3s linear}.taskboard-task .iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.taskboard-task .icon-iocaine{background:#000;border-radius:5px;color:#fff;left:.2rem;padding:.1rem;position:absolute;top:1rem}.taskboard-task .task-assigned{color:#000;display:block}.taskboard-task .task-assigned:hover{color:#000}.taskboard-task .task-num{color:#212121;margin-right:.5em}.taskboard-task .taskboard-text{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;padding:0 .5rem 0 1rem;word-wrap:break-word}.taskboard-task .icon{-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task .loading{bottom:.5rem;position:absolute}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit{bottom:.5rem;color:#000;opacity:0;position:absolute}.taskboard-task .icon-drag-h:hover,.taskboard-task .icon-edit:hover{color:#000}.taskboard-task .icon-edit,.taskboard-task .loading{right:1rem}.taskboard-task .icon-drag-h{font-size:2rem;cursor:move;right:45%}.task-drag{box-shadow:1px 1px 15px 6px rgba(0,0,0,.1)}.watch-options a{font-weight:100}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;position:relative}.track-button .track-inner{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;background:#757575;border-radius:4px 0 0 4px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;margin-right:.1rem;min-width:140px}.track-button .track-button-counter,.watch-options a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.track-button .track-inner:hover{background:#686868;-webkit-transition:background .3s;transition:background .3s}.track-button .track-inner span{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.track-button .track-inner .icon-arrow-up{margin-left:auto;padding:0 .5rem;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.track-button:hover{color:#212121}.track-button.active .track-inner{background:rgba(33,33,33,.2)}.track-button.watch-container{margin-right:1rem;position:relative}.track-button .track-icon{padding:.3rem .6rem .3rem .75rem}.track-button .track-icon svg{height:1.1rem;position:relative;top:2px;width:1.1rem}.track-button .track-icon path{fill:#212121}.track-button .track-button-counter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #757575;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;min-width:2rem}.like-button.active.is-hover .track-inner,.watch-button.active.is-hover .track-inner{background:#ff2400;color:#757575;-webkit-transition:background .3s;transition:background .3s}.like-button.active.is-hover path,.watch-button.active.is-hover path{fill:#ff0062}.watch-options{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;background:rgba(0,0,0,.9);border-radius:4px;margin:2.5rem 0 0;min-width:300px;padding:1rem;position:absolute;right:0;top:0;z-index:99}.watch-options.hidden{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse}.watch-options li{margin:0}.assigned-to-list,.ticket-watchers{margin-top:1rem}.watch-options li:last-child a{border:0}.watch-options a{border-bottom:1px solid rgba(117,117,117,.3);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.assigned-to-list .user-list-single,.upvote-btn{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.watch-options a.active{color:#212121}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check path{fill:#212121}.upvote-btn a.active path,.upvote-btn a:hover path{fill:#000}.upvote-btn{align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#757575;color:#757575;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#686868;color:#000;-webkit-transition:background .3s;transition:background .3s}.upvote-btn a.active{background:rgba(33,33,33,.2);color:#000;-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.is-hover{background:#ff2400;color:#757575}.upvote-btn a.is-hover svg{-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.is-hover path{fill:#ff0062}.upvote-btn svg{height:1rem;width:1rem}.assigned-to-list .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.upvote-btn span{display:block}.upvote-btn path{fill:#757575}.assigned-to-list .user-list-single{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #757575;display:flex;padding:.25rem 0;vertical-align:middle}.assigned-to-list .user-list-single:last-child{border:0}.assigned-to-list .user-list-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-name{color:#212121;margin-left:.5rem}.assigned-to-list .user-list-single.selected,.assigned-to-list .user-list-single:hover{background:#949494;cursor:pointer}.assigned-to-list .user-list-single:hover{-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{background:#8c8c8c;cursor:pointer;margin-bottom:1rem;position:relative;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.1s;transition-delay:.1s}.assigned-to-list .user-list-single.is-active .icon-delete{opacity:1;position:absolute;right:1rem;top:1.5rem;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .user-list-single{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.25rem 0;vertical-align:middle}.ticket-watchers .user-list-single:last-child{border:0}.ticket-watchers .user-list-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-watchers .user-list-name{color:#212121;margin-left:.5rem;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.ticket-watchers .user-list-single:hover .icon-delete{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .icon-delete{opacity:0;position:absolute;right:.5rem;top:0;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.ticket-watchers .icon-delete:hover{color:#ff2400;-webkit-transition:color .3s ease-in;transition:color .3s ease-in}.wysiwyg code,.wysiwyg pre{font-size:.9rem}.wysiwyg h2{font-size:1.2rem}.wysiwyg h1{font-weight:400;font-size:2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.wysiwyg h2,.wysiwyg h3{font-weight:800;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.wysiwyg{line-height:1.4rem;margin-bottom:2rem;padding:1rem}.wysiwyg h1{line-height:2.5rem}.wysiwyg h2{margin-bottom:.5rem}.wysiwyg ol,.wysiwyg ul{list-style-position:outside;margin-left:1rem}.wysiwyg ul{list-style-type:disc}.wysiwyg dl dt{font-size:1em;font-weight:700;margin-top:16px;padding:0}.wysiwyg dl dd{margin-bottom:16px;padding:0 16px}.wysiwyg p,.wysiwyg table{margin-bottom:1rem}.wysiwyg a{color:#000}.wysiwyg a:hover{color:#212121}.wysiwyg code,.wysiwyg pre{background:#3b3b3b;color:#757575;direction:ltr;font-family:'courier new',monospace;margin-bottom:1rem;overflow:auto;unicode-bidi:embed;white-space:pre}.admin-functionalities .functionality .title,.admin-membership-table .avatar .name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-membership-table .avatar figcaption span,.admin-submenu ul a span,.admin-submenu-roles .single-role,.admin-webhooks .webhook-url span,.custom-fields-table .custom-description{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wysiwyg pre{line-height:1.4rem;padding:.5rem}.wysiwyg table{border:1px solid #757575}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#757575 1px solid}.wysiwyg th{border-right:#757575 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#757575 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.wysiwyg textarea{background:#fff;max-height:none}.admin-common .total{font-size:1.2rem;background-color:#f5f5f5;color:#444;padding:.3rem 1rem}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{margin-bottom:2rem}.admin-common .total:hover .edit-value{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-field-options{margin-bottom:1rem;text-align:right}.custom-fields-table{margin-bottom:2em}.custom-fields-table .row{border-bottom:0;padding:.5rem 0}.custom-fields-table .table-header{border-bottom:3px solid #f5f5f5}.custom-fields-table .table-header .custom-description span,.custom-fields-table .table-header .custom-name span{padding-left:1.1rem}.custom-fields-table .table-body form:last-child .row{border:0}.custom-fields-table .table-body .row:hover{background:rgba(157,206,10,.05);cursor:move;-webkit-transition:background .2s linear;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag-v{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-fields-table .table-body form.row:hover{background:0 0;cursor:default}.custom-fields-table .table-body .custom-description{color:#b8b8b8}.custom-fields-table .single-custom-field{border-bottom:1px solid #f5f5f5;color:#555}.custom-fields-table .icon-drag-v{color:#b8b8b8;opacity:0;padding:0 .1rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .icon-drag-v:hover{color:#555;cursor:move;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{color:#555;margin-right:.5rem}.custom-fields-table .custom-name{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{max-width:100%;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.custom-fields-table .custom-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.admin-functionalities .functionality{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.3rem;margin-right:.3rem;opacity:.5;padding:1rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:top;width:32%}.admin-functionalities .functionality.active{background-color:rgba(114,161,20,.3);opacity:1}.admin-functionalities .functionality .icon{font-size:3rem;-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;margin:0 auto;min-width:60px}.admin-functionalities .functionality .desc{text-align:center;width:100%}.admin-functionalities .functionality .activate-input{display:none}.admin-functionalities .functionality .activate-input+label{color:#fff;cursor:pointer;display:block;text-align:center}.admin-functionalities .functionality .title{display:block}.admin-functionalities .functionality select{margin-top:1rem}.admin-functionalities .videoconference-attributes select{margin-bottom:.5rem}.admin-functionalities .button-green{color:#fff;display:block;text-align:center}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .delete,.admin-menu li{font-size:1.2rem}.admin-membership-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.admin-membership-table .avatar figcaption{margin-left:1rem;width:75%}.admin-membership-table .avatar figcaption span{width:100%}.admin-membership-table .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:35px}.admin-membership-table .avatar .email,.admin-membership-table .avatar .name{display:block;width:100%}.admin-membership-table .header-role,.admin-membership-table .header-status{padding-left:.5rem}.admin-membership-table .row-role{padding-right:1rem}.admin-membership-table .row-status{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.admin-membership-table .active,.admin-membership-table .resend{padding:.4rem .5rem}.admin-membership-table .active{background-color:#f5f5f5}.admin-membership-table .resend{background-color:#72a114;color:#fff}.admin-membership-table .resend:hover{background-color:#9dce0a;color:#fff;-webkit-transition:background-color .3s linear;transition:background-color .3s linear}.admin-membership-table .delete:hover{color:red}.admin-membership-table .pending{color:#ff8282}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-webkit-flex-basis:210px;-ms-flex-preferred-size:210px;flex-basis:210px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.admin-menu li{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #dcdcdc}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.admin-project-export-result .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;-webkit-transform-origin:32 32;transform-origin:32 32}.project-details .loading-spinner,.ticket-assigned-to .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.admin-project-export-buttons{margin:2rem 0 1rem}.admin-project-export-result{margin-top:1rem}.admin-project-export-result .spin{margin:0 auto;width:2.5rem}.admin-project-export-result .spin img{width:100%}.admin-project-export-result h3{font-size:1.2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin:.5rem;padding:.5rem;text-align:center}.admin-roles .general-category,.admin-roles .role-name,.project-details .looking-for-people,.project-details label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-project-export-result p{color:#b8b8b8;margin:.5rem 0;text-align:center}.project-details .delete-project:hover,.project-details .use-default-image:hover{color:red}.project-details .delete-project,.project-details .private-or-public,.project-details .use-default-image{font-size:.75rem}.project-details .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;border:0;-webkit-transform-origin:center center;transform-origin:center center}.project-details form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-details fieldset{margin-bottom:1rem}.project-details label{display:block;margin-bottom:.2rem}.project-details .project-details-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.project-details .project-details-image .image{width:100%}.project-details .change-image{display:block}.project-details .image-container{position:relative;margin-bottom:.5rem}.project-details .loading-overlay{display:none}.project-details .loading-overlay.active{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.project-details .use-default-image{display:block;margin-top:.25rem;text-align:center}.project-details .project-details-form-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.project-details form{display:block}}.project-details .looking-for-people{border-bottom:1px solid #f5f5f5;border-top:1px solid #f5f5f5;padding:1rem 0}.project-details .looking-for-people-selector{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-details .looking-for-people-selector svg{width:1rem;height:1rem;fill:#b8b8b8;margin-left:.5rem}.project-details .looking-for-people-selector .check{margin-left:auto}.project-details .looking-for-people-reason{display:block;margin-top:1rem}.project-details .looking-for-people-reason.ng-hide-remove-active{-webkit-animation:dropdownFade .3s;animation:dropdownFade .3s}.project-details .looking-for-people-reason.ng-hide-add-active{-webkit-animation:dropdownFade .2s reverse;animation:dropdownFade .2s reverse;-webkit-animation-delay:.1s;animation-delay:.1s}.project-details .delete-project{display:block;margin-top:1rem;text-align:right}.project-details .private-or-public{color:#b8b8b8;margin-bottom:2rem}.project-details .private-or-public svg{width:1.1rem;height:1.1rem;fill:#b8b8b8;margin-right:.5rem;vertical-align:middle}.project-privacy-settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.project-privacy-settings .privacy-option{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-transition:.2 linear;transition:.2 linear}.project-privacy-settings .privacy-option:first-child{margin-right:.5rem}.project-privacy-settings input[type=radio],.project-privacy-settings input[type=text]{display:none}.project-privacy-settings label{background:#f5f5f5;color:#444;text-align:center;-webkit-transition:all .2s linear;transition:all .2s linear}.project-privacy-settings label:hover{background:rgba(157,206,10,.4);color:#444}.project-privacy-settings label:hover svg{fill:#444}.project-privacy-settings label svg{width:1.1rem;height:1.1rem;fill:#444;margin-left:.5rem;vertical-align:middle}.project-privacy-settings .privacy-project:checked+label{background:#9dce0a;color:#fff}.project-privacy-settings .privacy-project:checked+label svg{width:1.1rem;height:1.1rem;fill:#fff}.project-privacy-settings .privacy-project:checked~input[type=text]{display:block}.admin-roles .general-category{font-size:.9rem}.admin-roles .edit-value{font-size:1rem}.admin-roles .role-name{font-size:2rem;color:#444}.admin-roles .edit-value{color:#b8b8b8;cursor:pointer;margin-left:.5rem;opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-roles .edit-role{background-color:#f5f5f5;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .edit-role .icon-floppy{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .edit-role .icon-floppy:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .any-computable-role{background:red;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category .check{margin-left:.5rem}.admin-roles .general-category .check input{height:40px;width:85px}.admin-submenu-roles .single-role{max-width:175px;display:inline-block}.admin-submenu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.admin-contrib .help .alt-image,.admin-contrib .help code,.admin-contrib .select-input-text .help-copy,.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-body span,.admin-webhooks .history-single-response-header a{font-size:.9rem}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#8fa291;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a.active{background:#a3b2a4;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a span{display:block;max-width:85%}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#050505}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child,.admin-webhooks .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body .response-container,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-webhooks .table-header{border-bottom:1px solid #b8b8b8}.admin-webhooks .table-body .webhook-service{color:#555}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #f5f5f5}.admin-webhooks .webhooks-options{margin-bottom:1rem;text-align:right}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.admin-webhooks .webhook-url{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.admin-webhooks .webhook-url span{max-width:65%;color:#b8b8b8;display:inline-block;vertical-align:middle}.admin-contrib .help code,.admin-third-parties .help code{direction:ltr;line-height:1.4rem;unicode-bidi:embed;white-space:pre}.admin-webhooks .webhook-url a{color:#72a114;margin-left:.5rem}.admin-webhooks .webhook-url a:hover{color:#9dce0a}.admin-webhooks .webhook-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;min-width:100px;text-align:center}.admin-webhooks .webhook-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.admin-webhooks .webhook-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .webhooks-history.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #f5f5f5;margin-left:22%}.admin-webhooks .history-single{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(157,206,10,.1);-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single.history-single-open:hover{background:0 0}.admin-webhooks .history-single.history-single-open .icon-arrow-bottom{-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:-webkit-transform .3s linear;transition:-webkit-transform .3s linear;transition:transform .3s linear;transition:transform .3s linear,-webkit-transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s linear;transition:-webkit-transform .3s linear;transition:transform .3s linear;transition:transform .3s linear,-webkit-transform .3s linear}.admin-webhooks .history-response-icon{background:#555;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#9dce0a}.admin-webhooks .history-response-icon.history-error{background:red}.admin-webhooks .history-single-response{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header a,.admin-webhooks .history-single-response-header span:first-child{color:#b8b8b8}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .history-single-request-header .icon,.admin-webhooks .history-single-response-header .icon{margin-right:.3rem;vertical-align:middle}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-response-body .response-container{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin-bottom:.5rem}.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-response-body span{color:#b8b8b8;-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{border:0;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.admin-contrib h2,.admin-contrib label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-contrib .help h3,.admin-contrib .help ol span{font-family:opensans-semibold}.admin-contrib form{margin:1rem 0;max-width:700px;width:100%}.admin-contrib h2{font-size:1.2rem;margin-bottom:0}.admin-contrib fieldset{border-bottom:1px solid #f5f5f5;margin-bottom:1rem;padding-bottom:1rem}.admin-contrib .contrib-input{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.admin-contrib .contrib-test{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:7.5rem;-ms-flex-preferred-size:7.5rem;flex-basis:7.5rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-left:.5rem;text-align:center}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .contrib-form-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-contrib .select-input-text .help-copy{opacity:0}.admin-contrib .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-contrib .check-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0}.admin-contrib .help{margin-top:2rem}.admin-contrib .help h3{margin-bottom:1rem}.admin-contrib .help ol{padding:0 0 0 2rem}.admin-contrib .help .img{margin-bottom:1rem}.admin-contrib .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-contrib .help .code-info{padding-left:1rem}.admin-contrib .help .code-info li{margin-bottom:.5rem}.admin-contrib .help .code-info span{font-family:opensans-semibold}.default-values fieldset{margin-bottom:1rem}.default-values fieldset:last-child{margin-top:1.5rem}.default-values label,.default-values select{display:inline-block;width:49.7%}.default-values a{color:#fff;display:block;text-align:center}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field .icon{margin-right:.3rem}.project-csv .field-with-options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row .icon,.project-values-settings a{font-size:1.2rem}.admin-third-parties .help .alt-image,.admin-third-parties .help code,.admin-third-parties .select-input-text .help-copy,.backlog-table-body .doom-line span,.backlog-table-body .pop-points,.backlog-table-body .pop-points a,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open a,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-body .pop-role,.backlog-table-body .pop-role a,.backlog-table-body .pop-status,.backlog-table-body .pop-status a,.backlog-table-body .row,.backlog-table-body .tags-block .tag,.backlog-table-header .pop-points,.backlog-table-header .pop-points a,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open a,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom a,.backlog-table-header .pop-role,.backlog-table-header .pop-role a,.backlog-table-header .pop-status,.backlog-table-header .pop-status a,.backlog-table-header .row,.login-form-container .forgot-pass,.register-form-container .register-text{font-size:.9rem}.project-values-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{color:#b8b8b8;opacity:0}.project-values-row .icon:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.project-values-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #f5f5f5}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-header .points,.login-form-container .remember-me+label{cursor:pointer}.project-values-body .project-values-row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.project-values-name{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.project-values-value{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{color:#555;margin-right:.5rem}.project-values-settings a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.project-values-settings a:hover .icon-delete{color:red}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.admin-third-parties .help h3,.admin-third-parties .help ol span{font-family:opensans-semibold}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.admin-third-parties fieldset{margin-bottom:1rem}.admin-third-parties label{display:block;margin-bottom:.2rem}.admin-third-parties textarea{height:10rem}.admin-third-parties .submit-button{color:#fff;display:block;text-align:center}.cancel-account p,.change-email-form p,.change-password-text{color:#444;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-third-parties .help{margin-top:2rem}.cancel-account form,.change-email-form form{margin-top:1rem}.admin-third-parties .help h3{margin-bottom:1rem}.admin-third-parties .help ol{padding:0 0 0 2rem}.admin-third-parties .help .img{margin-bottom:1rem}.admin-third-parties .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-third-parties .help .code-info li,.cancel-account p{margin-bottom:.5rem}.admin-third-parties .help .code-info{padding-left:1rem}.admin-third-parties .help .code-info span{font-family:opensans-semibold}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-email-form p{margin-bottom:.5rem}.change-password-form-container .token-change-password{position:relative}.change-password-form-container input:focus+.get-token{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.change-password-form-container .get-token{font-size:.9rem;color:#b8b8b8;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.change-password-form-container .get-token:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.login-form-container .forgot-pass{color:#555;opacity:1;position:absolute;right:1rem;top:.6rem;-webkit-transition:all .3s linear;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.login-form-container .remember-me{vertical-align:top}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin-bottom:1rem;text-align:center}.backlog-table-header .backlog-table-title{font-size:1rem}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a,.empty-backlog .title{font-size:1.2rem}.backlog-table-body .doom-line span{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.backlog-table-body .pop-points,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-body .user-story-name a,.backlog-table-header .pop-points,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-role,.backlog-table-header .pop-status,.empty-backlog{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.backlog-table-body,.backlog-table-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.backlog-table-body.show-tags .tags-block,.backlog-table-header.show-tags .tags-block{display:block}.backlog-table-body .row,.backlog-table-header .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-subtitle:hover,.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-subtitle:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-subtitle .input,.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-subtitle .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-webkit-flex-basis:25px;-ms-flex-preferred-size:25px;flex-basis:25px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .votes,.backlog-table-body .backlog-table-title .votes,.backlog-table-body .row .votes,.backlog-table-header .backlog-table-subtitle .votes,.backlog-table-header .backlog-table-title .votes,.backlog-table-header .row .votes{color:#555;-webkit-flex-basis:65px;-ms-flex-preferred-size:65px;flex-basis:65px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .backlog-table-subtitle .votes.inactive,.backlog-table-body .backlog-table-title .votes.inactive,.backlog-table-body .row .votes.inactive,.backlog-table-header .backlog-table-subtitle .votes.inactive,.backlog-table-header .backlog-table-title .votes.inactive,.backlog-table-header .row .votes.inactive{color:#b8b8b8}.backlog-table-body .backlog-table-subtitle .votes.is-voted,.backlog-table-body .backlog-table-title .votes.is-voted,.backlog-table-body .row .votes.is-voted,.backlog-table-header .backlog-table-subtitle .votes.is-voted,.backlog-table-header .backlog-table-title .votes.is-voted,.backlog-table-header .row .votes.is-voted{color:#9dce0a}.backlog-table-body .backlog-table-subtitle .user-stories,.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-subtitle .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{overflow:hidden;width:100%}.backlog-table-body .backlog-table-subtitle .status,.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-subtitle .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .points,.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-subtitle .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-webkit-flex-basis:125px;-ms-flex-preferred-size:125px;flex-basis:125px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .points,.backlog-table-body .status,.backlog-table-header .points,.backlog-table-header .status{position:relative;text-align:right}.backlog-table-body .points .popover a,.backlog-table-body .status .popover a,.backlog-table-header .points .popover a,.backlog-table-header .status .popover a{text-align:left;width:100%}.backlog-table-body .points .popover .point,.backlog-table-body .status .popover .point,.backlog-table-header .points .popover .point,.backlog-table-header .status .popover .point,.empty-backlog,.sprints .loading,.sprints .sprint-table .sprint-empty{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{color:#b8b8b8;margin-left:.2rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-status a:last-child,.backlog-table-header .pop-status a:last-child{border:0}.backlog-table-body .pop-status a:hover,.backlog-table-header .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-status a:hover.point,.backlog-table-header .pop-status a:hover.point{color:#fff}.backlog-table-body .pop-status:after,.backlog-table-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-status.fix,.backlog-table-header .pop-status.fix{bottom:0;top:auto}.backlog-table-body .pop-role,.backlog-table-header .pop-role{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-role a:last-child,.backlog-table-header .pop-role a:last-child{border:0}.backlog-table-body .pop-role a:hover,.backlog-table-header .pop-role a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-role a:hover.point,.backlog-table-header .pop-role a:hover.point{color:#fff}.backlog-table-body .pop-role:after,.backlog-table-header .pop-role:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#9dce0a;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{background:#050505;bottom:10px;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px 3rem 10px 10px;position:absolute;width:150px;z-index:99}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points a:last-child,.backlog-table-header .pop-points a:last-child{border:0}.backlog-table-body .pop-points a:hover,.backlog-table-header .pop-points a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points a:hover.point,.backlog-table-header .pop-points a:hover.point{color:#fff}.backlog-table-body .pop-points:after,.backlog-table-header .pop-points:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{border-bottom:1px solid #444;color:#fff;padding:10px 2px}.backlog-table-body .pop-points-open a:last-child,.backlog-table-header .pop-points-open a:last-child{border:0}.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open a:hover.point,.backlog-table-header .pop-points-open a:hover.point{color:#fff}.backlog-table-body .pop-points-open:after,.backlog-table-header .pop-points-open:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{background:#050505;bottom:0;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:auto;width:200px;z-index:99}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open.pop-bottom a:last-child,.backlog-table-header .pop-points-open.pop-bottom a:last-child{border:0}.backlog-table-body .pop-points-open.pop-bottom a:hover,.backlog-table-header .pop-points-open.pop-bottom a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open.pop-bottom a:hover.point,.backlog-table-header .pop-points-open.pop-bottom a:hover.point{color:#fff}.backlog-table-body .pop-points-open.pop-bottom:after,.backlog-table-header .pop-points-open.pop-bottom:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open li,.backlog-table-header .pop-points-open li{display:inline-block;width:23%}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{display:block;text-align:center}.backlog-table-body .user-story-name,.sprints .sprint-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-table-body .pop-points-open a.active,.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a.active,.backlog-table-header .pop-points-open a:hover{background:#9dce0a;color:#fff}.backlog-table-header .backlog-table-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:2px solid #b8b8b8;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:30px}.backlog-table-header .header-points span{color:#b8b8b8}.backlog-table-body .row{border-bottom:1px solid #ebebeb;cursor:move;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag-v,.backlog-table-body .row:hover .us-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .is-checked,.backlog-table-body .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body input:checked{color:#9dce0a;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.backlog-table-body .user-story-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{display:inline-block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.backlog-table-body .user-story-name span{line-height:1.5}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff8282;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:red;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .blocked a{color:#fff!important}.backlog-table-body .blocked .icon,.backlog-table-body .blocked .icon:hover,.backlog-table-body .blocked a:hover{color:#fff}.backlog-table-body .doom-line{background:red;margin:.2rem 0;padding:.6rem 0;position:relative;width:100%}.backlog-table-body .doom-line span{color:#fff;position:absolute;right:.5rem;top:-3px}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;width:30px}.backlog-table-body .icon-drag-v:hover,.backlog-table-body .us-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .us-settings{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 0 0 2rem;opacity:0}.backlog-table-body .icon-drag-v{cursor:move;opacity:0;padding:.1rem .5rem 0 0}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.empty-backlog{padding:2rem}.empty-backlog img{margin-bottom:1rem}.empty-backlog .title{margin-bottom:.5rem}.empty-backlog a{color:#72a114}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint .description{font-size:.75rem}.sprints .filter-closed-sprints,.sprints .sprint-table .column-us,.sprints .us-item-row .user-story-name{font-size:.9rem}.sprints .sprint .number,.sprints .sprint .sprint-date,.sprints .sprint-name a,.sprints-empty .title{font-size:1.2rem}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint-header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#72a114;padding:.25rem .25rem 0;-webkit-transition:background .2s;transition:background .2s}.sprints .add-sprint:hover{background:#9dce0a}.sprints .add-sprint svg{height:1.4rem;max-height:1.4rem;max-width:1.5rem;width:1.5rem}.sprints .add-sprint path{fill:#f5f5f5}.sprints .filter-closed-sprints{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading-spinner{border:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;-webkit-transform-origin:center center;transform-origin:center center}.sprints .sprint-name a{max-width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;margin-right:3px}.sprints .sprint{margin-bottom:2rem;overflow:hidden}.sprints .sprint header{position:relative}.sprints .sprint:hover .icon-edit{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.sprints .sprint .icon{display:inline-block}.sprints .sprint .icon-arrow-up{-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:baseline}.sprints .sprint .icon-arrow-up.active{-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.sprints .sprint .icon-arrow-up:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.sprints .sprint .icon-edit{color:#b8b8b8;opacity:0;position:absolute;right:0;top:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;vertical-align:baseline}.sprints .sprint .icon-edit:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.sprints .sprint .description{line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{color:#b8b8b8;-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1}.sprints .sprint .sprint-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.sprints .sprint ul{margin:0}.sprints .sprint li{display:inline-block}.sprints .sprint li:first-child{margin-right:3px}.sprints .sprint-progress-bar{background:#b8b8b8;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#72a114;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table .sprint-empty{background:#e6e6e6;border:2px dashed #d2d2d2;color:#555;padding:1rem}.sprints .sprint-table .row{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:#d7d7d7;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .row.readonly,.taskboard-table .taskboard-task.readonly{cursor:auto}.sprints .sprint-table .row:last-child{border-bottom:0}.sprints .sprint-table .row.sortable-placeholder{background:#d7d7d7;height:40px}.sprints .sprint-table .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .column-us{-webkit-flex-flow:3;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{max-width:230px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.sprints .sprint-table .us-name.closed{color:#c5c5c5}.sprints .sprint-table .us-name.blocked{color:red}.sprints .sprint-table .column-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#c5c5c5}.sprints .sprint-table .column-points.blocked{color:red}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.sprints .us-item-row .icon-drag-v,.sprints .us-item-row .popover,.sprints .us-item-row .status,.sprints .us-item-row .tags-block,.sprints .us-item-row .us-settings,.sprints .us-item-row input,.taskboard-table-body .column-fold .taskboard-task .icon,.taskboard-table-body .column-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .column-fold .taskboard-task .taskboard-text,.taskboard-table-body .row-fold .taskboard-task .icon,.taskboard-table-body .row-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .row-fold .taskboard-task .taskboard-text{display:none}.sprints .us-item-row .user-story-name{line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#b8b8b8}.sprint-closed .sprint-progress-bar .current-progress{background:#9f9f9f}.sprint-closed .button-gray{background:#b8b8b8}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{margin-bottom:.5rem}.sprints-empty a{color:#72a114}.taskboard-userstory-box .points-value{font-size:.9rem}.taskboard-table-header .task-colum-name,.taskboard-table-header .task-colum-name .icon{font-size:1rem}.taskboard-table-body .column-fold .taskboard-task,.taskboard-table-body .row-fold .taskboard-task{background:0 0;border:0;margin:0;min-height:0}.category-config,.ticket-assigned-to{border-bottom:1px solid #b8b8b8}.category-config:first-child,.ticket-assigned-to{border-top:1px solid #b8b8b8}.taskboard-table-body .column-fold .taskboard-task .taskboard-task-inner,.taskboard-table-body .row-fold .taskboard-task .taskboard-task-inner{padding:.2rem}.taskboard-table-body .column-fold .taskboard-task .avatar,.taskboard-table-body .row-fold .taskboard-task .avatar{height:35px;width:35px}.taskboard-table-body .column-fold .taskboard-task.ui-sortable-helper,.taskboard-table-body .row-fold .taskboard-task.ui-sortable-helper{box-shadow:none}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .row-fold .task-column,.taskboard-table-body .task-column.column-fold,.taskboard-table-body .task-column.row-fold{-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .column-fold .avatar-task-link,.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table,.taskboard-table-header .taskboard-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;overflow:hidden}.taskboard-table{display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;width:100%}.taskboard-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:flex;position:absolute}.taskboard-table-header .task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-header .task-colum-name .icon:hover{color:#72a114}.taskboard-table-header .task-colum-name .icon.hfold,.taskboard-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.taskboard-table-header .task-colum-name.column-fold{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.3rem 0}.taskboard-table-header .task-colum-name.column-fold span{display:none}.taskboard-table-header .task-colum-name.column-fold .hfold,.taskboard-table-header .task-colum-name.column-fold .hunfold{margin:0}.taskboard-table-body{height:100%;overflow:auto;width:100%}.taskboard-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;width:300px}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .column-fold .taskboard-task{max-width:40px;width:40px}.taskboard-table-body .task-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;min-height:10rem;width:100%}.taskboard-table-body .avatar-task-link,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .icon-plus,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .task-row:hover .new-task{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(255,0,0,.6)}.taskboard-table-body .task-row.blocked .points-value,.taskboard-table-body .task-row.blocked .points-value:hover,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a:hover{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(255,0,0,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-table-body .taskboard-userstory-box .icon{color:#b8b8b8;position:absolute;right:.5rem;top:.7rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-body .taskboard-userstory-box .icon:hover{color:#72a114}.taskboard-table-body .taskboard-userstory-box .icon.icon-plus{right:2rem}.taskboard-table-body .taskboard-userstory-box .icon.icon-vfold,.taskboard-table-body .taskboard-userstory-box .icon.icon-vunfold{left:0;right:inherit}.taskboard-table-body .avatar-assigned-to{display:block}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .tag-list{display:none;margin-bottom:1rem}.taskboard-userstory-box .us-title{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{color:#b8b8b8}.taskboard-userstory-box .points-value span{margin-right:.1rem}.points-list a{color:#72a114;margin-left:.5rem}.points-list a:hover span{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.points-list span{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.ticket-assigned-to{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:1rem 0;position:relative}.ticket-assigned-to:hover .assigned-to .icon-delete{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;-webkit-transform-origin:32 32;transform-origin:32 32;margin:1rem auto;max-height:2rem;max-width:2rem}.filters-inner .loading .loading-spinner,.lightbox-generic-loading .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.ticket-assigned-to .user-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;position:relative}.ticket-assigned-to .user-avatar img{width:100%}.ticket-assigned-to .user-avatar.is-iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.ticket-assigned-to .user-avatar .iocaine-symbol{left:-.5rem;position:absolute;top:-.75rem;z-index:9}.ticket-assigned-to .user-avatar .iocaine-symbol svg{background:#444;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.ticket-assigned-to .assigned-to{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-to .assigned-to .assigned-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block;margin:.2rem 0 .25rem}.ticket-assigned-to .assigned-to .assigned-to-options{display:inline-block}.category-config .category-item,.category-config .resume{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.ticket-assigned-to .assigned-to .icon-delete{color:#b8b8b8;opacity:0;position:absolute;right:0;top:2rem}.ticket-assigned-to .assigned-to .icon-delete:hover{color:red}.ticket-assigned-to .assign-to-me,.ticket-assigned-to .user-assigned{cursor:default}.ticket-assigned-to .assign-to-me:hover,.ticket-assigned-to .user-assigned:hover{color:currentColor}.ticket-assigned-to .assign-to-me.editable,.ticket-assigned-to .user-assigned.editable{color:#72a114}.ticket-assigned-to .assign-to-me.editable:hover,.ticket-assigned-to .user-assigned.editable:hover{cursor:pointer}.ticket-assigned-to .assign-to-me .icon,.ticket-assigned-to .user-assigned .icon{vertical-align:middle}.ticket-assigned-to .assign-to-me>span,.ticket-assigned-to .user-assigned>span{max-width:80%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-config .resume{-webkit-box-align:space-between;-webkit-align-items:space-between;-ms-flex-align:space-between;align-items:space-between;cursor:pointer;display:flex;padding:1rem;position:relative}.category-config .resume-title{width:280px}.category-config .count{color:#b8b8b8;float:left;padding-right:5px}.category-config .summary-role{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#b8b8b8;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#72a114}.category-config .summary-role .role-summary-single.inactive{background:#555}.category-config .icon{font-size:2rem;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;text-align:right}.category-config .category-items{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden;background-color:#f5f5f5;width:100%}.category-config .category-items.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.colors-table .row,.duty-custom-fields .custom-fields-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #f5f5f5}.colors-table .icon,.colors-table .icon-check-square{font-size:1.2rem}.colors-table .table-header:hover{background:0 0}.colors-table .table-header .row{padding-left:50px}.colors-table form:last-child .row{border:0}.colors-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.colors-table .row.edition .current-color,.duty-custom-fields form label{cursor:pointer}.colors-table .row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.colors-table .row:last-child{border:0}.colors-table .row.edition,.colors-table .row.new-value{padding-left:50px}.colors-table .row.hidden{display:none}.colors-table .row .color-column{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100px;position:relative}.colors-table .row .is-archived-column,.colors-table .row .is-closed-column,.colors-table .row .options-column,.colors-table .row .status-wip-limit{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.colors-table .row .status-name{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px;position:relative}.colors-table .row .status-name span{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.duty-custom-fields .custom-field-value.js-value-view-mode,.lightbox-generic-ask .subtitle{white-space:pre-line}.colors-table .row .status-slug{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px}.colors-table .row .options-column{max-width:100px;opacity:0;text-align:right}.colors-table .row .is-archived-column{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row .is-closed-column{max-width:130px;text-align:center}.colors-table .row .status-wip-limit{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#b8b8b8;border-radius:2px;height:40px;width:40px}.activity-single .activity-user img,.duty-custom-fields form input{width:100%}.colors-table .icon{color:#b8b8b8;margin-right:1rem;opacity:0}.colors-table .icon.icon-check-square,.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.colors-table .icon:hover{color:#72a114;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.colors-table .icon-delete:hover{color:red}.colors-table .icon-check-square{color:#72a114}.duty-custom-fields .custom-field-data .custom-field-description{font-size:.9rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom{font-size:1.2rem;cursor:pointer;-webkit-transform:rotate(-90deg);transform:rotate(-90deg);-webkit-transition:-webkit-transform .2s linear;transition:-webkit-transform .2s linear;transition:transform .2s linear;transition:transform .2s linear,-webkit-transform .2s linear}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields{margin-bottom:2rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom.open{-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .2s linear;transition:-webkit-transform .2s linear;transition:transform .2s linear;transition:transform .2s linear,-webkit-transform .2s linear}.duty-custom-fields .custom-fields-body{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.duty-custom-fields .custom-fields-body.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.duty-custom-fields .custom-field-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;padding:1rem}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-single .custom-field-options{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-custom-fields .custom-field-single .custom-field-options a{color:#b8b8b8}.duty-custom-fields .custom-field-single .custom-field-options a:hover{color:#72a114}.duty-custom-fields .custom-field-data{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px}.duty-custom-fields .custom-field-data .custom-field-name{display:block}.duty-custom-fields .custom-field-data .custom-field-description{display:block;line-height:.9rem}.duty-custom-fields .custom-field-options{margin:0}.duty-custom-fields .custom-field-value{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff8282}.external-reference{font-size:.9rem;color:#b8b8b8;margin-top:.5rem}.external-reference a{border-left:1px solid #b8b8b8;padding:0 .2rem;-webkit-transition:color .3s linear;transition:color .3s linear}.external-reference a:hover{color:#72a114}.external-reference a:first-child{border:0}.activity-single .comment-restore,.activity-single .date,.activity-single .deleted-comment,.activity-single.deleted-comment,.change-entry .activity-fromto,.more-activity,.more-comments,.show-more-comments{font-size:.9rem}.activity-single .deleted-comment .comment-body p,.activity-single.deleted-comment .comment-body p{font-size:1rem}.history-tabs{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.change-entry .activity-changed{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.history{margin-bottom:1rem}.changes-title{display:block;padding:.5rem}.changes-title:hover .icon{color:#72a114;-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.changes-title .icon{color:#444;float:right;-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:all .2s linear;transition:all .2s linear}.main-nav a:hover .helper::after,.related-tasks-body .pop-status:after{-webkit-transform:rotate(45deg);content:''}.change-entry{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.change-entry:last-child{border-bottom:0}.change-entry .activity-changed,.change-entry .activity-fromto{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.history-tabs{border-bottom:3px solid #b8b8b8;margin-bottom:0;padding:.5rem 0}.history-tabs li{font-size:1.2rem;display:inline-block}.history-tabs li:first-child{border-right:1px solid #b8b8b8}.history-tabs a{padding:0 2rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs a.active{color:#444}.history-tabs a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs .icon{margin-right:.5rem}.add-comment .in-progress{cursor:progress}.add-comment:after{clear:both;content:'';display:table}.add-comment.active .button-green{display:block;margin-top:.5rem}.add-comment.active textarea{height:6rem;-webkit-transition:height .3s ease-in;transition:height .3s ease-in}.add-comment.active .help-markdown{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.add-comment.active .preview-icon{opacity:1;position:absolute;right:1rem}.add-comment .help-markdown,.add-comment .preview-icon,.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave.ng-leave-active:last-child{opacity:0}.add-comment textarea{background:#fff;height:5rem;min-height:41px}.add-comment .save-comment{color:#fff;float:right}.add-comment .button-green{display:none}.more-comments,.show-more-comments{color:#b8b8b8;display:block;border-bottom:1px solid #b8b8b8}.add-comment .edit,.add-comment .preview-icon{position:absolute;right:1rem}.show-more-comments{border-top:1px solid #b8b8b8;padding:1rem 0 1rem 1rem}.show-more-comments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.more-comments{padding:1rem}.more-comments .prev-comments-num{color:#72a114;margin-left:.5rem}.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{-webkit-transition:all .3s ease-in;transition:all .3s ease-in}.comment-list.activeanimation .comment-single.ng-enter.ng-enter-active:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{opacity:1}.activity-single{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:2rem 0;position:relative}.activity-single:hover .comment-delete,.activity-single:hover .comment-restore{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.activity-single:first-child{margin-top:0}.activity-single:last-child{border-bottom:0}.activity-single .deleted-comment,.activity-single.deleted-comment{color:#b8b8b8;padding:.5rem}.activity-single .deleted-comment a,.activity-single.deleted-comment a{color:#b8b8b8;margin-left:.3rem}.activity-single .deleted-comment a:hover,.activity-single.deleted-comment a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .deleted-comment img,.activity-single.deleted-comment img{-webkit-filter:grayscale(100%);filter:grayscale(100%);opacity:.5}.activity-single .deleted-comment .comment-body,.activity-single.deleted-comment .comment-body{display:none;margin:.2rem 0 .5rem}.activity-single .activity-username,.activity-single .username{margin-bottom:.5rem;color:#72a114}.activity-single .comment-restore{color:#b8b8b8;position:absolute;right:0;top:.4rem}.activity-single .comment-restore .icon{vertical-align:baseline}.activity-single .comment-restore:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .activity-user{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.activity-single .activity-content{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:calc(100% - 80px)}.activity-single .changes{background:#f5f5f5}.activity-single .changes .change-entry{display:none}.activity-single .changes .change-entry.active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.activity-single .date{color:#b8b8b8;margin-left:1rem}.activity-single .wysiwyg{margin-bottom:0}.activity-single .comment-delete{color:red;opacity:0;position:absolute;right:0;top:2rem;-webkit-transition:all .2s linear;transition:all .2s linear}.activity-single .comment-delete:hover{color:#ff8282;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single.activity .change-entry{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.more-activity{border-bottom:1px solid #b8b8b8;color:#b8b8b8;display:block;padding:1rem}.more-activity .prev-activity-num{color:#72a114;margin-left:.5rem}.lightbox{background:rgba(255,255,255,.98);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox-generic-form label{font-size:.75rem}.lightbox-add-member .help-text,.lightbox-delete-account .newsletter input+label,.lightbox-sprint-add-edit .delete-sprint,.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem}.lightbox-select-user .more-watchers{font-size:1rem}.lightbox-add-member .add-member-wrapper .icon-delete,.lightbox-add-member .icon,.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-size:1.2rem}.lightbox h2{font-size:1.6rem}.lightbox .close,.lightbox-add-member .icon-delete{font-size:2rem}.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress,.lightbox-select-user .more-watchers{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.lightbox h2,.lightbox-delete-account .newsletter input+label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox .close{color:#555;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.lightbox-add-member .add-member-wrapper fieldset,.lightbox-generic-form fieldset{position:relative}.lightbox-add-member .checksley-error-list,.lightbox-generic-form .attachment-delete{right:.5rem}.lightbox .close:hover{color:#72a114}.open.lightbox{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.lightbox{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox-generic-loading .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32}.lightbox-generic-form form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form textarea{min-height:4.5rem;resize:vertical}.lightbox-generic-form label{background:#f5f5f5;border:1px solid #b8b8b8;color:#444;cursor:pointer;display:block;padding:7px 30px;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#444;vertical-align:middle}.lightbox-generic-form .settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-add-member .button,.lightbox-add-member .extra-text{margin-top:1rem}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#9dce0a;border:1px solid #72a114}.lightbox-generic-form .settings .blocked:hover{background:#ff8282;border:1px solid red}.lightbox-generic-form .settings .client-requirement input:checked+label,.lightbox-generic-form .settings .iocaine-flag input:checked+label,.lightbox-generic-form .settings .team-requirement input:checked+label{background:#72a114;border:1px solid #72a114;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:red;border:1px solid red;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-form .attachments{margin-bottom:0}.lightbox-generic-form .attachment-body{max-height:7.5rem;overflow-y:auto}.lightbox-generic-form .attachment-delete svg{fill:#b8b8b8;height:1.25rem;width:1.25rem}.lightbox-generic-form .attachment-delete:hover svg{fill:red}.lightbox-generic-bulk form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-search form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-search fieldset{margin-bottom:1rem}.lightbox-add-member .add-member-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.lightbox-add-member .add-member-wrapper:last-child,.lightbox-add-member fieldset{margin-bottom:0}.lightbox-add-member .add-member-wrapper fieldset:first-child{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.lightbox-add-member .add-member-wrapper fieldset:last-child{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.lightbox-add-member select{width:80%}.lightbox-add-member .icon{margin-left:.5rem}.lightbox-add-member .icon-delete:hover{color:red}.lightbox-add-member .help-text{padding:.5rem 1rem}.lightbox-add-member .checksley-error-list li{display:none}.lightbox-add-member .checksley-error-list li:first-child{display:block}.lightbox-sprint-add-edit form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{color:#555;opacity:1;position:absolute;right:1rem;top:.7rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.main-nav .active svg path,.main-nav svg path{opacity:1}.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-sprint-add-edit .dates div{float:left;margin-right:1%;position:relative;width:49%}.lightbox-sprint-add-edit .dates div:last-child{margin:0;width:50%}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint{color:#444;display:block;margin-top:1rem;text-align:right}.lightbox-sprint-add-edit .delete-sprint a{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-sprint-add-edit .delete-sprint a:hover{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-generic-ask form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:420px}.lightbox-generic-ask .message,.lightbox-generic-ask .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-generic-ask .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-generic-ask .options a{padding:8px 0;text-align:center;width:100%}.lightbox-ask-choice{text-align:center}.lightbox-ask-choice form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.lightbox-ask-choice .question,.lightbox-ask-choice .subtitle{display:block;line-height:1.5rem;text-align:center}.lightbox-ask-choice .replacement,.lightbox-ask-choice .replacement span{display:block}.lightbox-ask-choice .choices{margin-bottom:2rem}.lightbox-ask-choice .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-account form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-account .question,.lightbox-delete-account .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-account .newsletter{margin:1rem 0;text-align:center}.lightbox-delete-account .newsletter input,.lightbox-delete-account .options a:first-child,.lightbox-delete-project .options a:first-child{margin-right:.5rem}.lightbox-delete-account .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-project .question,.lightbox-delete-project .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-project .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-delete-project .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-generic-error section,.lightbox-generic-loading section,.lightbox-generic-success section{-webkit-flex-basis:500px;-ms-flex-preferred-size:500px;flex-basis:500px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:500px}.lightbox-generic-error h2,.lightbox-generic-loading h2,.lightbox-generic-success h2{line-height:2rem}.lightbox-generic-error p,.lightbox-generic-loading p,.lightbox-generic-success p{text-align:center}.lightbox-generic-loading .spin{margin:1rem auto;width:5rem}.lightbox-generic-loading .spin img{max-height:100%;max-width:100%;width:100%}.lightbox-generic-loading .progress-bar-wrapper{background:#e8e8e8;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#9dce0a;height:24px;position:absolute;-webkit-transition:width .1s linear;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#e8e8e8;bottom:35px;color:#555;padding:.3rem;position:absolute;-webkit-transition:left .1s linear;transition:left .1s linear}.lightbox-create-issue form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row fieldset{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem;width:30%}.lightbox-create-issue .fieldset-row fieldset:last-child{margin:0}.lightbox-block textarea,.lightbox-create-issue textarea{margin-bottom:1rem;max-height:12rem;min-height:8rem}.lightbox-block .form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-select-user .form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single.selected,.lightbox-select-user .user-list-single:hover{background:#f3fbe1;cursor:pointer}.lightbox-select-user .user-list-single:hover{-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.lightbox-select-user .more-watchers{padding:.5rem;text-align:center}.lb-create-edit-userstory .points-per-role{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0}.featured-project .project-card-inner,.highlighted .highlighted-projects-container,.highlighted .most-active,.highlighted .most-liked,.kanban-table,.wiki-summary .wiki-user-modification{-webkit-box-orient:vertical;-webkit-box-direction:normal}.lb-create-edit-userstory .ticket-role-points{margin:.1rem;min-width:20%}.lb-create-edit-userstory .ticket-role-points:first-child{margin-left:0}.lb-create-edit-userstory .ticket-role-points:nth-child(4n+4){margin-right:0}.lb-create-edit-userstory .ticket-role-points:last-child{margin:.1rem 0;min-width:100%}.main-nav a:hover .helper{font-size:.9rem}.main-nav .item{font-size:1.2rem}tg-project-menu{background-position:0 -300px;display:inline-block;min-height:95%;min-width:50px;padding:1rem 0;position:relative;z-index:9}.main-nav a,.main-nav span{display:block}tg-project-menu .menu.menu-fixed{position:fixed;top:1rem}.main-nav{list-style:none;padding:0;position:relative;text-align:center}.related-tasks-body .row,.related-tasks-body .status{text-align:left;position:relative}.main-nav a{color:#fff;padding:.75rem .8rem;position:relative}.main-nav a:hover{background:rgba(0,0,0,.2);color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.main-nav a:hover .helper{-webkit-animation:slideLeft .2s ease-in-out both;animation:slideLeft .2s ease-in-out both;background:-webkit-linear-gradient(left,#000 0,rgba(0,0,0,.8) 100%);background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;padding:.4rem 1rem;position:absolute;top:calc(50% - 1rem);-webkit-transition:all .2s;transition:all .2s;white-space:nowrap;z-index:99}.main-nav a:hover .helper::after{background:#050505;height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);transform:rotate(45deg);width:12px;z-index:98}.main-nav svg{height:1.5rem;width:1.5rem}.main-nav .helper{display:none}.main-nav .icon{font-size:1.5rem;line-height:2.2rem}.main-nav .active{color:#9dce0a}@-webkit-keyframes slideLeft{0%{opacity:0}100%{opacity:1}}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.related-tasks-body .pop-status,.related-tasks-body .pop-status a,.related-tasks-body .row{font-size:.9rem}.related-tasks-body .task-name input,.related-tasks-header .related-tasks-title{font-size:1rem}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine,.related-tasks-body .task-settings a{font-size:1.2rem}.related-tasks-body .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.related-tasks-header .related-tasks-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-tasks{margin-bottom:2rem;position:relative}.related-tasks-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-tasks-header .add-button{background:#444;border:0;display:inline-block;padding:.5rem;-webkit-transition:background .25s;transition:background .25s}.related-tasks-header .add-button.is-active,.related-tasks-header .add-button:hover{background:#9dce0a}.related-tasks-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-tasks-body{width:100%}.related-tasks-body .row{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.5rem 0 .5rem .5rem;width:100%}.related-tasks-body .row:hover{background:0 0}.related-tasks-body .row:hover .task-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .row:last-child{border:0}.related-tasks-body .row .tasks{overflow:hidden;width:100%}.related-tasks-body .row .status{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100px}.related-tasks-body .row .assigned-to{cursor:pointer;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.related-tasks-body .related-task-create-form{padding:0}.related-tasks-body .related-task-create-form.active{padding:.5rem 0 .5rem .5rem}.related-tasks-body .status:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.related-tasks-body .status .not-clickable:hover{color:#444}.related-tasks-body .status .popover a{text-align:left;width:100%}.related-tasks-body .status .popover .point{text-align:center}.related-tasks-body .status .icon{color:#b8b8b8;margin-left:.2rem;opacity:0}.related-tasks-body .pop-status{background:#050505;color:#fff;display:none;left:40%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.related-tasks-body .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.related-tasks-body .avatar,.related-tasks-body .task-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.related-tasks-body .blocked .icon,.related-tasks-body .blocked .icon:hover,.related-tasks-body .blocked a,.related-tasks-body .blocked a:hover,.related-tasks-body .blocked:hover .icon,.related-tasks-body .blocked:hover .icon:hover,.related-tasks-body .blocked:hover a,.related-tasks-body .blocked:hover a:hover,.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#050505;height:15px;position:absolute;transform:rotate(45deg);width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .task-name{display:flex;position:relative}.related-tasks-body .task-name a{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-name input{margin-right:1rem;padding:3px;width:85%}.related-tasks-body .task-name.loading{margin:0;padding:8px;text-align:center;width:100%}.related-tasks-body .task-name.loading span{-webkit-animation:loading .5s linear,spin 1s linear infinite;animation:loading .5s linear,spin 1s linear infinite}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:#ff8282;color:#fff}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .iocaine,.related-tasks-body .iocaine:hover{background:rgba(157,206,10,.3)}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine{display:inline-block;margin-right:.5rem;vertical-align:top}.related-tasks-body .task-settings{margin:0 0 0 2rem;opacity:0;position:absolute;right:0;top:0;width:10%}.related-tasks-body .task-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .task-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .assigned-to{position:relative;text-align:left}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .task-assignedto figcaption{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-assignedto .icon{opacity:0;position:absolute;right:.5rem;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex}.related-tasks-body .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-data-container,.ticket-header .detail-status,.ticket-header .pop-status,.ticket-header .pop-status a,.ticket-status .priority-data .pop-priority,.ticket-status .priority-data .pop-priority a,.ticket-status .severity-data .pop-severity,.ticket-status .severity-data .pop-severity a,.ticket-status .type-data .pop-type,.ticket-status .type-data .pop-type a,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-size:.9rem}.ticket-header .ticket-title{font-size:1.6rem;vertical-align:sub}.ticket-header .pop-status,.ticket-header .ticket-title,.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .type-data .pop-type,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-header{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1.5rem 0 2rem;position:relative}.ticket-header .detail-status{display:inline-block;margin-left:.25rem;position:relative}.ticket-header .detail-status .icon-arrow-bottom{margin-left:.25rem}.ticket-header .detail-status-inner{color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.15rem .25rem}.ticket-header .pop-status{background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;position:absolute;top:1.25rem;width:150px;z-index:99;padding:0;text-transform:none}.ticket-header .pop-status a{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #444;color:#fff;display:block;padding:.5rem 1rem}.ticket-header .pop-status a:last-child{border:0}.ticket-header .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-header .pop-status a:hover.point{color:#fff}.ticket-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-header .pop-status a:hover{background:rgba(157,206,10,.2)}.ticket-data-container{margin-bottom:1rem}.ticket-data-container .icon{margin-left:.25rem}.ticket-status:last-child{margin:0}.ticket-status .level{display:inline-block;margin-right:.5rem;vertical-align:top}.filters h1,.filters h1 a{vertical-align:baseline}.ticket-status .level-name{color:#c2c2c2;float:right;text-transform:lowercase}.ticket-status .clickable:hover{background:#dcdcdc;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .type-data{background:#e8e8e8;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .type-data .pop-type{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .type-data .pop-type a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .type-data .pop-type a:last-child{border:0}.ticket-status .type-data .pop-type a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-status .severity-data{background:#e8e8e8;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .severity-data .pop-severity{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .severity-data .pop-severity a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .severity-data .pop-severity a:last-child{border:0}.ticket-status .severity-data .pop-severity a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-status .priority-data{background:#e8e8e8;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .priority-data .pop-priority{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .priority-data .pop-priority a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .priority-data .pop-priority a:last-child{border:0}.ticket-status .priority-data .pop-priority a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-detail-settings img,.ticket-detail-settings svg{max-height:1.25rem;max-width:1.25rem;width:100%}.ticket-watch-buttons{margin-bottom:1rem}.ticket-watch .ticket-watch-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.ticket-watch .ticket-watch-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ticket-watch .track-icon{position:relative;top:2px}.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{background:#b8b8b8;color:#fff;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:.25rem;text-align:center;text-transform:uppercase;-webkit-transition:background .25s;transition:background .25s}.ticket-watch .add-watcher path,.ticket-watch .ticket-watch-button path{fill:#fff}.ticket-watch .add-watcher:hover,.ticket-watch .ticket-watch-button:hover{background:#9dce0a}.ticket-watch .add-watcher.is-hover,.ticket-watch .ticket-watch-button.is-hover{background:red;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.ticket-watch .add-watcher.is-hover svg,.ticket-watch .ticket-watch-button.is-hover svg{fill:#ff8282}.ticket-watch .add-watcher.active,.ticket-watch .ticket-watch-button.active{background:#9dce0a}.ticket-watch .add-watcher.active:hover,.ticket-watch .ticket-watch-button.active:hover{background:#ff8282}.ticket-watch .add-watcher.active svg,.ticket-watch .ticket-watch-button.active svg{fill:#fff}.ticket-watch .ticket-watch-button{margin-right:.25rem}.wizard-create-project .create-step1 fieldset:first-child,.wizard-create-project .wizard-action a:first-child{margin-right:.5rem}.ticket-detail-settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-top:2rem}.ticket-detail-settings .button-delete,.ticket-detail-settings .item-block,.ticket-detail-settings .item-unblock,.ticket-detail-settings .promote-button,.ticket-detail-settings label{background:#b8b8b8;display:inline-block;margin-right:.5rem;padding:1rem;-webkit-transition:background .2s linear;transition:background .2s linear;-webkit-transition-delay:.1s;transition-delay:.1s}.ticket-detail-settings .button-delete:hover,.ticket-detail-settings .item-block:hover,.ticket-detail-settings .item-unblock:hover,.ticket-detail-settings .promote-button:hover,.ticket-detail-settings label:hover{background:#555}.ticket-detail-settings .button-delete.editable,.ticket-detail-settings .item-block.editable,.ticket-detail-settings .item-unblock.editable,.ticket-detail-settings .promote-button.editable,.ticket-detail-settings label.editable{cursor:pointer}.ticket-detail-settings .button-delete+input,.ticket-detail-settings .item-block,.ticket-detail-settings .item-block+input,.ticket-detail-settings .item-unblock,.ticket-detail-settings .item-unblock+input,.ticket-detail-settings .promote-button+input,.ticket-detail-settings label+input{display:none}.ticket-detail-settings .item-block.is-active,.ticket-detail-settings .item-unblock.is-active{display:inline-block}.ticket-detail-settings .item-unblock{background:#ff8282}.ticket-detail-settings .item-unblock:hover{background:red}.ticket-detail-settings .button-delete{background:#ff8282}.ticket-detail-settings .button-delete:hover{background:red}.ticket-detail-settings svg{fill:#fff;height:100%}.single-project .track-container .icon path,.single-project .track-container .list-itemtype-track-likers.active path,.single-project .track-container .list-itemtype-track-watchers.active path{fill:currentcolor}.wizard-create-project{background:url(../images/invitation_bg.jpg) center center no-repeat;bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910;background-size:cover;color:#fff;text-align:center}.wizard-create-project p{font-size:.9rem}.wizard-create-project .close{font-size:2rem;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.open.wizard-create-project{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.wizard-create-project{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.wizard-create-project fieldset{margin-bottom:1rem}.wizard-create-project .button-gray,.wizard-create-project .button-green{display:block;padding:12px;text-align:center}.wizard-create-project form{width:500px}.wizard-create-project .title{text-align:center;width:100%}.wizard-create-project h1,.wizard-create-project p{color:#fff}.wizard-create-project h1{line-height:1.5rem}.wizard-create-project p{opacity:.8}.wizard-create-project input,.wizard-create-project select,.wizard-create-project textarea{background:rgba(255,255,255,.7)}.wizard-create-project input::-webkit-input-placeholder,.wizard-create-project select::-webkit-input-placeholder,.wizard-create-project textarea::-webkit-input-placeholder{color:#444}.wizard-create-project input::-moz-placeholder,.wizard-create-project select::-moz-placeholder,.wizard-create-project textarea::-moz-placeholder{color:#444}.wizard-create-project input:-moz-placeholder,.wizard-create-project select:-moz-placeholder,.wizard-create-project textarea:-moz-placeholder{color:#444}.wizard-create-project input:-ms-input-placeholder,.wizard-create-project select:-ms-input-placeholder,.wizard-create-project textarea:-ms-input-placeholder{color:#444}.wizard-create-project .close{color:#fff}.wizard-create-project .close:hover{color:#ff8282}.wizard-create-project .wizard-step{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out;-webkit-animation-direction:alternate-reverse;animation-direction:alternate-reverse;display:none}.wizard-create-project .wizard-step.active{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out}.wizard-create-project .wizard-step.active.create-step1,.wizard-create-project .wizard-step.active.create-step2,.wizard-create-project .wizard-step.active.create-step3{display:block}.wizard-create-project .wizard-action div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .wizard-action a{color:#fff;display:inline-block;-webkit-flex-basis:40%;-ms-flex-preferred-size:40%;flex-basis:40%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 .template-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .create-step1 fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 input{display:none}.wizard-create-project .create-step1 input:checked+label{background:rgba(157,206,10,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label{background:rgba(245,245,245,.7);cursor:pointer;display:block;margin-bottom:1rem;padding:1rem;text-align:center;-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label:hover{background:rgba(114,161,20,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label .icon{font-size:3rem;color:#fff}.wizard-create-project .create-step1 h2{color:#fff;margin:.5rem 0 0;text-transform:uppercase}.wizard-create-project .create-step1 p{text-align:center}.wizard-create-project .progress-bar{bottom:0;height:.5rem;left:0;position:absolute;width:100%}.wizard-create-project .step1 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:25%}.wizard-create-project .step1 .progress-state span:nth-child(1){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .step2 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:75%}.wizard-create-project .step2 .progress-state span:nth-child(1),.wizard-create-project .step2 .progress-state span:nth-child(2){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .progress-state{position:absolute;width:100%}.wizard-create-project .progress-state span{color:rgba(255,255,255,.5);display:inline-block;margin-left:-100px;position:absolute;text-align:center;top:-2rem;-webkit-transition:all 1s ease-in;transition:all 1s ease-in;width:200px}.wizard-create-project .progress-state span:nth-child(1){left:25%}.wizard-create-project .progress-state span:nth-child(2){left:75%}.wizard-create-project .progress-bar-wrapper{background:rgba(255,255,255,.3);height:.5rem}.wizard-create-project .bar{background:rgba(157,206,10,.9);height:.5rem;left:0;position:absolute;top:0;width:0}.create-project{background:url(https://farm9.staticflickr.com/8449/7893171238_a201af22bc_k_d.jpg) center center no-repeat;background-size:cover;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;bottom:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.create-project .tagline{font-size:2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#fff;line-height:2rem;text-transform:uppercase}.create-project fieldset{margin-bottom:1rem}.create-project .create-project-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.create-project h1{color:#fff;text-align:center}.create-project .logo,.create-project .tagline{margin-bottom:1rem;text-align:center}.create-project form{margin-bottom:2rem}.create-project input{background:#fff}.create-project input::-webkit-input-placeholder{color:#757575}.create-project input::-moz-placeholder{color:#757575}.create-project input:-moz-placeholder{color:#757575}.create-project input:-ms-input-placeholder{color:#757575}.create-project .button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.create-project .button:hover{background:#212121}.create-project a:hover{color:#fff}.filters h2 .icon-arrow-right{font-size:1rem}.filters-inner .loading .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32;max-height:1rem;max-width:1rem}.profile .timeline-wrapper .spin img,.user-profile .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.filters h1 .icon{margin:0}.filters h2 .icon-arrow-right,.issues-table .subject span,.single-project h1{vertical-align:middle}.filters h2{font-size:1.2rem;margin-top:1rem}.filters input{background:#444;color:#fff}.filters input::-webkit-input-placeholder{color:#b8b8b8}.filters input::-moz-placeholder{color:#b8b8b8}.filters input:-moz-placeholder{color:#b8b8b8}.filters input:-ms-input-placeholder{color:#b8b8b8}.filters .icon-search{color:#b8b8b8;position:absolute;right:.7rem;top:.7rem}.filters-inner{opacity:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}.filters-inner .loading{margin:0;padding:8px;text-align:center;width:100%}.filters-applied{margin-top:.5rem}.filters-step-cat .save-filters{color:#fff;display:block;text-align:center}.filters-step-cat .my-filter-name{background:#444;color:#f5f5f5;width:100%}.filters-step-cat .my-filter-name::-webkit-input-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name::-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-ms-input-placeholder{color:#b8b8b8}.filters-cats{margin-top:2rem}.filters-cats li{border-bottom:1px solid #b8b8b8;text-transform:uppercase}.filters-cats .custom-filters .title{color:#72a114}.filters-cats a{color:#444;display:block;padding:.5rem 0 .5rem .5rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.filters-cats .icon{color:#444;float:right;opacity:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;line-height:1.4;margin-bottom:0}.introjs-overlay{background:-webkit-radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background-color:#f5f5f5}.introjs-helperLayer{border:1px solid rgba(157,206,10,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(68,68,68,.2)}.introjs-bullets ul li a.active{background:#9dce0a}.introjs-button{background-color:#72a114;background-image:none;border:0;border-radius:0;color:#fff;margin-top:10px;padding:.3rem .8rem;text-shadow:none}.introjs-button:focus,.introjs-button:hover{background:#9dce0a;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .description,.single-project .looking-for-people p{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.single-project .title{font-weight:800}.single-project .looking-for-people h3,.single-project .looking-for-people p,.single-project .track-container .list-itemtype-track{font-size:.9rem}.single-project .description,.single-project .title{font-size:1rem}.single-project .single-project-intro{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.single-project .project-logo{margin-right:1rem;width:6rem}.single-project .project-logo img{width:100%}.single-project .single-project-title-wrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.single-project .intro-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem}.single-project .intro-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project h1{color:#000;display:inline-block;line-height:1.2;margin-bottom:0}.single-project .like-watch-container{margin-left:auto}.single-project .track-buttons-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{color:#757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.single-project .track-container .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.single-project .track-container .list-itemtype-track-likers,.single-project .track-container .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .track-container .list-itemtype-track-likers .icon,.single-project .track-container .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.single-project .project-data,.single-project .title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#000}.single-project .track-container .icon svg{height:1rem;width:1rem}.single-project .description{margin:0}.single-project .project-data{display:flex}.single-project .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#757575;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem}.single-project .single-project-tags{margin-bottom:1rem;margin-top:1rem}.single-project .timeline{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-shrink:3;-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;max-width:960px;width:0}.single-project .looking-for-people img{width:100%}.single-project .involved-data{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-organization,.single-project .involved-team{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-organization li,.single-project .involved-team li{-webkit-flex-basis:24%;-ms-flex-preferred-size:24%;flex-basis:24%;margin-right:.14rem}.single-project .involved-organization li:nth-child(4n),.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-organization a,.single-project .involved-team a{display:block}.single-project .involved-organization img,.single-project .involved-team img{border-radius:.2rem;width:100%}.issues-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table .pop-status,.issues-table .pop-status a,.issues-table .table-main{font-size:.9rem}.issues-table .title{font-size:1rem}.empty-issues .title{font-size:1.2rem;text-transform:uppercase}.empty-issues p,.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.issues-table .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8}.issues-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .avatar,.kanban-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.issues-table .row.is-blocked{background:#ffe8e8}.issues-table .row.is-blocked .blocked-text{color:red;margin-right:.5rem}.issues-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#555}.issues-table .table-main{border-bottom:1px solid #ebebeb}.issues-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-webkit-flex-basis:60%;-ms-flex-preferred-size:60%;flex-basis:60%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes{color:#555;-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes.inactive{color:#b8b8b8}.issues-table .votes.is-voted{color:#9dce0a}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field{-webkit-box-flex:0;-webkit-flex:0 0 160px;-ms-flex:0 0 160px;flex:0 0 160px;max-width:160px}.issues-table .issue-assignedto{cursor:pointer;position:relative}.issues-table .issue-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .issue-assignedto figcaption{max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.issues-table .issue-assignedto .icon{opacity:0;position:absolute;right:0;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .pop-status{background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99}.issues-table .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.search-filter,.search-result-table{border-top:1px solid #f5f5f5}.issues-table .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.issues-table .pop-status.fix{bottom:0;top:auto}@media (max-width:1280px){.issues-table .created-field,.issues-table .level-field{display:none}}.empty-issues{margin-top:4rem;text-align:center}.empty-issues img{margin-bottom:1rem}.empty-issues p,.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem}.kanban-table-body,.kanban-table-header .task-colum-name,.kanban-table-header .task-colum-name .icon{font-size:1rem}.kanban-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table .vfold.task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold .kanban-task,.kanban-table .vfold.task-colum-name .icon-bulk,.kanban-table .vfold.task-colum-name .icon-closed-eye,.kanban-table .vfold.task-colum-name .icon-open-eye,.kanban-table .vfold.task-colum-name .icon-plus,.kanban-table .vfold.task-colum-name .icon-vfold,.kanban-table .vfold.task-colum-name .icon-vunfold,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1;max-width:30px;min-height:2.5rem;min-width:30px;width:30px}.kanban-table .readonly{cursor:auto}.kanban-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.kanban-table-header .kanban-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.kanban-table-header .task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem .5rem .5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name span{max-width:65%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kanban-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.kanban-table-header .task-colum-name .icon.hfold,.kanban-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.kanban-table-header .icon-closed-eye,.kanban-table-header .icon-open-eye{display:inline-block}.kanban-table-header .icon-closed-eye svg,.kanban-table-header .icon-open-eye svg{fill:#b8b8b8;height:1.1rem;margin-top:.25rem;width:1.1rem}.kanban-table-header .icon-closed-eye:hover svg,.kanban-table-header .icon-open-eye:hover svg{fill:#72a114}.kanban-table-header .icon-open-eye .svg-eye-closed{display:none}.kanban-table-header .icon-closed-eye .svg-eye-closed,.kanban-table-header .icon-open-eye .svg-eye-open{display:block}.kanban-table-header .icon-closed-eye .svg-eye-open{display:none}.kanban-table-body,.kanban-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.kanban-table-body{display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;overflow-y:auto;widows:300px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#b8b8b8;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#050505}.kanban-table-body .task-column .kanban-wip-limit{background:red;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-inner{display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.search-filter{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:0;z-index:9}.search-filter a{background:#fff;color:#b8b8b8;display:inline-block;margin-right:1rem;padding:1rem 1.25rem}.search-filter .icon,.search-filter a:hover .icon{margin-right:.4rem}.search-filter .name,.search-filter a:hover .name{padding-left:5px}.search-filter a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.search-filter a.active{border-left:1px solid #f5f5f5;border-right:1px solid #f5f5f5;color:#444;position:relative;top:1px}.search-filter a.active .icon{color:#9dce0a}.search-in input{background:#444;color:#fff}.search-in input::-webkit-input-placeholder{color:#b8b8b8}.search-in input::-moz-placeholder{color:#b8b8b8}.search-in input:-moz-placeholder{color:#b8b8b8}.search-in input:-ms-input-placeholder{color:#b8b8b8}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{color:#b8b8b8}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #f5f5f5}.search-result-table .user-story-name .icon{font-size:1rem;color:#b8b8b8}.empty-search-results .title{font-size:1.2rem;text-transform:uppercase}.empty-search-results p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.search-result-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.search-result-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row .ref{-webkit-flex-basis:30px;-ms-flex-preferred-size:30px;flex-basis:30px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .status{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.search-result-table .user-story-name span{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-table .user-story-name .icon:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.search-result-table .points,.search-result-table .status{position:relative}.search-result-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.search-result-table .avatar img{width:35px}.search-result-table .avatar .avatar-caption{display:block;margin-left:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:80px}.empty-search-results{margin-top:4rem;text-align:center}.empty-search-results img{margin-bottom:1rem}.empty-search-results p{margin:0}.team-filters nav li{font-size:1.6rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.table-team .team-header,.team-filters nav li:last-child{border-bottom:0}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters nav a{display:block;padding:1rem 0 1rem 1rem}.team-filters nav a.active,.team-filters nav a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.team-filters nav .active,.team-filters nav a.active.icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.team-filters nav .icon{color:#050505;float:right;opacity:0}.table-team .leave-project,.table-team .popover,.table-team .popover a{font-size:.9rem}.table-team .attribute .points{font-size:1.6rem}.table-team .attribute,.table-team .attribute .points,.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.policy-table .policy-table-header,.table-team .avatar .name,.table-team .team-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.table-team .row{padding:.5rem}.table-team .username{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:6;-webkit-flex:6;-ms-flex:6;flex:6;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{color:#050505;font-size:1.8rem}.table-team .attribute .points{color:#444}.table-team .attribute .top{color:#9dce0a;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{color:#b8b8b8;display:block}.table-team .leave-project .icon{margin-right:.2rem}.table-team .leave-project:hover .icon{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .hero{width:100%}.table-team .hero .row{background:#f5f5f5;border-bottom:0;margin:1rem 0}.table-team .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.table-team .avatar img{-webkit-flex-basis:66px;-ms-flex-preferred-size:66px;flex-basis:66px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:66px}.table-team .avatar figcaption{margin-left:1rem;width:65%}.table-team .avatar figcaption span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.table-team .avatar .name,.table-team .avatar .position{display:block;width:100%}.table-team .popover{background:#050505;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99}.table-team .popover a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#050505;bottom:-5px;content:'';height:15px;left:50%;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:15px}.policy-table .policy-table-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{border-bottom:2px solid #b8b8b8}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none,.policy-table .policy-table-project{padding:1rem}.policy-table .policy-table-project{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#72a114;-webkit-transition:background .3s linear;transition:background .3s linear}.policy-table label{background:#b8b8b8;border-radius:5px;display:block;padding:.5rem}.policy-table label:hover{background:#9dce0a;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear}.user-change-password fieldset{margin-bottom:1rem;width:50%}.user-change-password fieldset:last-child{margin-top:2rem}.user-change-password label{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;display:block;margin-bottom:.5rem}.user-change-password .button-green{color:#fff;display:block;padding:12px;text-align:center}.user-profile .use-default-image{font-size:.75rem}.user-profile .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;border:0;-webkit-transform-origin:center center;transform-origin:center center}.user-profile{max-width:780px}.user-profile form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.user-profile fieldset{margin-bottom:1rem}.user-profile label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.user-profile .project-details-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.user-profile .project-details-image .image,.user-profile .submit-button,.wiki-nav li .loading{width:100%}.user-profile .change-image{display:block}.user-profile .image-container{position:relative;margin-bottom:.5rem}.user-profile .loading-overlay{display:none}.user-profile .loading-overlay.active{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.user-profile .use-default-image{display:block;margin-top:.25rem;text-align:center}.user-profile .use-default-image:hover{color:red}.user-profile .project-details-form-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.user-profile form{display:block}}.user-profile .delete-account{font-size:.9rem;display:block;margin-top:1rem}.wiki-nav li input{font-size:1rem}.attachment-list .attachment-settings .editable-settings,.attachment-list .attachment-settings .settings,.attachment-list .icon-delete,.wiki-nav li{font-size:1.2rem}.wiki-nav li{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.wiki-nav li:hover .icon{opacity:1;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li a{display:block;padding:1rem 0 1rem 1rem}.wiki-nav li a span{cursor:pointer}.wiki-nav li .icon{color:#050505;float:right;opacity:0;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li input{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background:#444;color:#f5f5f5}.attachment-gallery .single-attachment .attachment-name,.attachments-header .size-info{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.wiki-nav li input::-webkit-input-placeholder{color:#b8b8b8}.wiki-nav li input::-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-ms-input-placeholder{color:#b8b8b8}.wiki-nav li .loading{margin:0;padding:8px;text-align:center}.wiki-nav .add-button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.wiki-summary .wiki-user-modification,.wiki-summary div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.wiki-summary .username{font-size:1.2rem;color:#9dce0a;white-space:nowrap}.wiki-summary{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary div{display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:1rem}.wiki-summary .number{line-height:2rem;top:0}.wiki-summary .wiki-user-modification{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary figure{margin-right:.3rem;width:32px}.attachment-gallery{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.attachment-gallery .single-attachment{margin-bottom:.5rem;margin-right:.5rem;max-width:200px}.attachment-gallery .single-attachment:hover .icon-delete{opacity:1}.attachment-gallery .single-attachment .attachment-image{display:inline-block}.attachment-gallery .single-attachment img{height:150px;margin-bottom:.2rem;width:200px}.attachment-gallery .single-attachment img:hover{-webkit-filter:saturate(150%) hue-rotate(60deg);filter:saturate(150%) hue-rotate(60deg);-webkit-transition:all .3s cubic-bezier(.01,.7,1,1);transition:all .3s cubic-bezier(.01,.7,1,1)}.attachment-gallery .single-attachment.deprecated img{opacity:.5}.attachment-gallery .single-attachment.deprecated .attachment-name{color:#757575}.attachment-gallery .single-attachment .attachment-data{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.attachment-gallery .single-attachment .attachment-name{max-width:175px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block}.attachment-gallery .single-attachment .icon-delete{color:#ff0062;margin-left:auto;opacity:0;-webkit-transition:opacity .3s ease-in;transition:opacity .3s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.attachment-gallery .single-attachment .icon-delete:hover{color:#ff2400}.attachment-list .attachment-comments span,.attachment-list .attachment-settings .editable-settings,.attachment-list .attachment-settings .settings,.attachment-list .editable-attachment-comment span,.attachment-list .single-attachment.deprecated,.attachment-list .single-attachment.deprecated .attachment-name a{color:#757575}.attachment-gallery .single-attachment .loading-container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:150px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0 .5rem .5rem 0;width:200px}.attachment-gallery .single-attachment .loading-spinner{margin:0 auto;max-height:3rem;max-width:3rem}.attachment-list .single-attachment{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;position:relative}.attachment-list .single-attachment:hover .settings{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.attachment-list .attachment-name{max-width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding-right:1rem}.attachment-list .attachment-comments,.attachment-list .editable-attachment-comment{-webkit-box-flex:2;-webkit-flex:2;-ms-flex:2;flex:2;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;margin-right:.5rem}.attachment-list .attachment-size{-webkit-flex-basis:125px;-ms-flex-preferred-size:125px;flex-basis:125px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.attachment-list .attachment-settings{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:10%;-ms-flex-preferred-size:10%;flex-basis:10%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin-left:auto}.attachment-list .attachment-settings .editable-settings:hover,.attachment-list .attachment-settings .settings:hover{color:#000}.attachment-list .attachment-settings .settings{opacity:0}.attachment-list .attachment-settings .editable-settings{opacity:1}.attachment-list .attachment-settings .icon-delete:hover{color:#ff2400}.attachment-list .attachment-settings .icon-drag-v{cursor:move}.attachment-list .icon-delete{color:#757575}.attachment-list .icon-delete:hover{color:#ff2400}.attachment-list .editable-attachment-deprecated{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:1rem}.attachment-list .editable-attachment-deprecated span{color:#757575}.attachment-list .editable-attachment-deprecated input{margin-right:.2rem;vertical-align:middle}.attachment-list .editable-attachment-deprecated input:checked+span{color:#212121}.attachment-list .percentage{background:rgba(0,0,0,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.attachments-header .size-info,.more-attachments,.single-attachment{font-size:.9rem}.attachments-header .attachments-title{font-size:1rem;color:#212121;padding:0 1rem}.attachments-empty,.attachments-header .attachments-title,.single-attachment .attachment-name{font-weight:800;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.attachments{margin-bottom:2rem}.attachments-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#757575;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.attachments-header .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.attachments-header label{cursor:pointer;margin-left:.25rem}.attachments-header label.add-attachment-button{background:#757575;border:0;display:inline-block;padding:.5rem;-webkit-transition:background .25s;transition:background .25s}.attachments-header label.add-attachment-button:hover{background:#212121}.attachments-header label svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.attachments-header button{background:0 0;margin-right:.2rem}.attachments-header button.is-active svg,.attachments-header button:hover svg{fill:#212121}.attachments-header button svg{fill:#757575;height:1.6rem;margin-bottom:-.2rem;width:1.6rem}.attachments-header .size-info{color:#757575;padding-left:1rem}.attachments-header input{display:none}.attachments-empty{font-size:1.2rem;border:3px dashed #757575;color:#757575;margin-top:.5rem;padding:1rem;text-align:center}.single-attachment.ui-sortable-helper{background:#999;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.single-attachment.sortable-placeholder{background:#757575;height:40px}.single-attachment .attachment-name{padding-right:1rem}.single-attachment .attachment-name .icon{margin-right:.25rem}.single-attachment .attachment-name svg{height:1.2rem;width:1.2rem}.single-attachment .attachment-size{color:#757575}.more-attachments{border-bottom:1px solid #757575;display:block;padding:1rem 0 1rem 1rem}.live-announcement,.live-announcement-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.more-attachments .more-attachments-num{color:#000;margin-left:.5rem}.more-attachments:hover{background:#999;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.attachment-preview img{max-height:80vh;max-width:80vw}.live-announcement-inner .title{font-size:1.6rem;color:#107a8a;margin-bottom:.5rem}.live-announcement-inner .title,.live-announcement-inner .warning a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.live-announcement{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#98e0eb;display:flex;height:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;-webkit-transition:width .5s,height .5s;transition:width .5s,height .5s;-webkit-transition-delay:.5s;transition-delay:.5s;width:0;z-index:99}.live-announcement .live-announcement-inner{opacity:0;-webkit-transition:opacity .5s;transition:opacity .5s;width:100%}.live-announcement.visible{height:146px;pointer-events:auto;-webkit-transition-delay:0s;transition-delay:0s;width:100%}.live-announcement.visible .live-announcement-inner{opacity:1;-webkit-transition:opacity .5s .5s;transition:opacity .5s .5s}.live-announcement-inner{display:flex;max-width:1200px}.live-announcement-inner .announcement-decoration{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin-right:1rem}.live-announcement-inner .text{padding:1.25rem 3rem 1.25rem 2rem;position:relative;width:100%}.live-announcement-inner .warning,.live-announcement-inner .warning a{color:#107a8a}.live-announcement-inner .close{height:2.5rem;position:absolute;right:0;top:1rem;width:2.5rem}.live-announcement-inner .close svg{fill:#18b7cf;-webkit-transition:fill .2s;transition:fill .2s}.live-announcement-inner .close svg:hover{fill:#107a8a}.discover-header .project-number{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#72a114}.discover-header{background:url(../images/discover.png) bottom left repeat-x #f5f5f5;margin-bottom:2.5rem;padding:1rem 1rem 2rem;text-align:center}.discover-header .discover-header-inner{max-width:1200px;min-width:768px;margin:0 auto}.discover-header .title{font-size:3rem;margin-bottom:0}.discover-header form{margin:0 30%;position:relative}@media (max-width:767px){.discover-header .discover-header-inner{width:90%;min-width:0}.discover-header form{margin:0 .5rem}}.discover-header input[type=text]{background:#fff;border:0;padding:1rem;width:100%}.discover-header input[type=text]:focus{outline-color:#9dce0a}.discover-header input[type=text]:-webkit-autofill{background:rgba(135,155,137,.5)}.discover-header .search-button{position:absolute;right:1rem;top:1rem}.discover-header .search-button:hover svg{fill:#72a114}.discover-header svg{fill:#b8b8b8;height:1.5rem;-webkit-transition:all .2;transition:all .2;width:1.5rem}.discover-search-subfilter .results{font-size:.9rem}.discover-results-header .title{font-size:1.6rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;text-transform:uppercase}.discover-results-header .discover-results-header-inner{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.discover-results-header svg{width:1.1rem;height:1.1rem;fill:#b8b8b8}.discover-results-header h2{display:inline-block}.filter-discover-search .discover-search-filter{margin-right:1rem}.filter-discover-search .discover-search-filter.active{color:#72a114}.discover-search-subfilter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:relative}.discover-search-subfilter:after,.discover-search-subfilter:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.discover-search-subfilter:after{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:8px;margin-left:-8px}.discover-search-subfilter:before{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.discover-search-subfilter.most-liked-subfilter::after,.discover-search-subfilter.most-liked-subfilter::before{left:85%}.discover-search-subfilter.most-active-subfilter::after,.discover-search-subfilter.most-active-subfilter::before{left:95%}.discover-search-subfilter.ng-enter{-webkit-animation:dropdownFade .2s;animation:dropdownFade .2s}.discover-search-subfilter .results{color:#ff8282;display:block;padding:.5rem 1rem;-webkit-transition:all .2s;transition:all .2s}.discover-search-subfilter .results:hover{color:red}.discover-search-subfilter .filter-list{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 0 0 auto}.discover-search-subfilter .filter-list a{display:block;padding:.5rem 1rem;-webkit-transition:all .2s;transition:all .2s}.featured-project,.featured-projects-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.discover-search-subfilter .filter-list a:hover{background:#b8b8b8;color:currentColor}.discover-search-subfilter .filter-list a.active{background:#9dce0a;color:#f5f5f5}.featured-project .project-card-description,.featured-project .statistic{font-size:.9rem}.featured-project .project-card-name a{font-size:1.2rem}.featured-project .project-card-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.featured-projects .title{font-size:1.6rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#444;text-align:center}.featured-projects{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.featured-projects{width:90%;min-width:0}}.featured-projects-inner{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.featured-project{background:#fff;border:1px solid #f5f5f5;margin:.5rem;display:flex;-webkit-flex-basis:23%;-ms-flex-preferred-size:23%;flex-basis:23%;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:23%}.featured-project .tags-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.3rem}.featured-project .project-tag{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.featured-project .project-card-inner{padding:1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.featured-project .project-card-description{color:#555}.featured-project .project-card-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:auto}.featured-project .project-card-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.featured-project .project-card-statistics .svg-eye-closed{display:none}.featured-project .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.featured-project .project-card-name a,.featured-project .statistic.active{color:#72a114}.featured-project .statistic.active svg{fill:#72a114}.featured-project .project-card-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.featured-project .project-card-logo{display:inline-block;-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:50px;height:50px;margin-right:.5rem}.featured-project .project-card-logo img{width:100%}.featured-project .project-card-name{line-height:.9}.featured-project .project-card-name a:hover{color:#9dce0a}.featured-project .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8;margin:0 .5rem}@media (max-width:767px){.featured-project{-webkit-flex-basis:45%;-ms-flex-preferred-size:45%;flex-basis:45%}}@media (max-width:480px){.featured-project{-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%}}.filter-highlighted li,.highlighted-project .project-description,.highlighted-project .statistic{font-size:.9rem}.highlighted-project .project-title{font-size:1.2rem}.highlighted .title{font-size:1.6rem}.highlighted .empty-highlighted-project span{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted-project .project-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.highlighted{margin:1rem auto 4rem;max-width:1200px;min-width:768px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}@media (max-width:767px){.highlighted{width:90%;min-width:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.highlighted tg-most-active{margin-top:4rem}}.highlighted tg-most-active,.highlighted tg-most-liked{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.highlighted tg-most-liked{margin-right:8%}@media (max-width:767px){.highlighted tg-most-liked{margin-right:0}}.highlighted .most-active,.highlighted .most-liked{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.highlighted .header{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.highlighted .header svg{width:1.5rem;height:1.5rem;fill:#b8b8b8;margin:.5rem}.highlighted .title-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.highlighted .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#444;display:inline-block;margin:0}.empty-discover-results .title,.home-project .project-card-description,.home-wrapper .title-bar,.projects-empty p,.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted .highlighted-projects-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.highlighted .loading-container{margin-top:calc(50% - 1rem)}.highlighted .loading-spinner{display:block;margin:2rem auto;max-height:3rem;max-width:3rem}.highlighted .view-more-projects{margin-top:auto;width:100%}.highlighted .empty-highlighted-project{border:2px dashed #f5f5f5;padding:2rem;text-align:center}.highlighted .empty-highlighted-project svg{width:2rem;height:2rem;display:block;fill:#b8b8b8;margin:1rem auto}.highlighted .empty-highlighted-project span{color:#555;display:block}.filter-highlighted{position:relative}.filter-highlighted .current-filter{padding:1rem}.filter-highlighted .current-filter span{margin-left:.2rem;position:relative;top:.2rem}.filter-highlighted .filter-list{background:#000;position:absolute;right:0;top:1.5rem}.filter-highlighted .filter-list.ng-enter{-webkit-animation:dropdownFade .2s ease-in;animation:dropdownFade .2s ease-in}.filter-highlighted .filter-list.ng-leave{-webkit-animation:dropdownFade .2s ease-in;animation:dropdownFade .2s ease-in;-webkit-animation-direction:reverse;animation-direction:reverse}.filter-highlighted li{color:#fff;cursor:pointer;min-width:8rem;padding:.25rem .5rem}.filter-highlighted li:hover{background:rgba(157,206,10,.4)}.highlighted-project{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:9rem;-ms-flex-preferred-size:9rem;flex-basis:9rem;min-height:9rem;padding:1.5rem 0}.highlighted-project:nth-last-child(-n+2){border-bottom:0}.highlighted-project .project-logo{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;height:auto;margin-right:1rem;width:3rem}.highlighted-project .project-logo img{width:100%}.highlighted-project .project-data-container{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.highlighted-project .single-project-header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.highlighted-project .project-title{display:inline-block;margin-bottom:.5rem}.highlighted-project .project-title a{color:#72a114}.highlighted-project .project-title a:hover{color:#9dce0a}.highlighted-project .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8;margin-left:.5rem}.highlighted-project .project-description{color:#555;margin-bottom:0}.highlighted-project .project-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.highlighted-project .project-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.highlighted-project .project-statistics .svg-eye-closed{display:none}.highlighted-project .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.highlighted-project .statistic.active{color:#72a114}.highlighted-project .statistic.active svg{fill:#72a114}.discover-results .statistic{font-size:.9rem}.discover-search .discover-header form{margin:0 8rem;position:relative}.discover-search .discover-header .search-button{left:1rem;right:auto}.discover-search .discover-header .searchbox input{padding-left:3.5rem;padding-right:23rem}.discover-search .searchbox-filters{position:absolute;right:1rem;top:.7rem;width:auto}.discover-search .searchbox-filters input{display:none}.discover-search .searchbox-filters label{border-radius:4px;color:#b8b8b8;cursor:pointer;display:inline-block;padding:.4rem .75rem;-webkit-transition:all .2s;transition:all .2s;-webkit-transition-delay:.2s;transition-delay:.2s}.discover-search .searchbox-filters label.active{background:#9dce0a;color:#fff}.discover-search .searchbox-filters label:hover{background:#f5f5f5;color:#555}.discover-results{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.discover-results{width:90%;min-width:0}}.discover-results .discover-results-inner .spin{margin-top:4rem}.discover-results .list-itemtype-project{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:1rem 0}.discover-results .list-itemtype-project:last-child{border-bottom:0}.discover-results .list-itemtype-project-left{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%}.discover-results .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.discover-results .list-itemtype-project-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;vertical-align:middle}.discover-results .look-for-people{margin-left:.5rem}.discover-results .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8}.discover-results .project-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.discover-results .project-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.discover-results .project-statistics .svg-eye-closed{display:none}.discover-results .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.discover-results .statistic.active{color:#72a114}.discover-results .statistic.active svg{fill:#72a114}.discover-results .more-results{display:block;margin:0 20rem;-webkit-transition:inherit;transition:inherit}.discover-results div[tg-loading] img{display:block;margin:0 auto}.empty-discover-results{margin:4rem auto 1rem;max-width:1200px;min-width:768px;text-align:center}@media (max-width:767px){.empty-discover-results{width:90%;min-width:0}}.empty-discover-results img{margin-bottom:1rem}.empty-discover-results .title{font-size:1.2rem;margin:0;text-transform:uppercase}.external-app-wrapper .app-card a,.external-app-wrapper .app-card p,.external-app-wrapper .user-card a{font-size:.75rem}.external-app-wrapper .cancel{font-size:.9rem}.external-app-wrapper .app-card h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:6rem;margin:0 auto;width:6rem}.external-app-wrapper h1{margin-bottom:0}.external-app-wrapper .app-card,.external-app-wrapper .user-card{line-height:1.4;margin-bottom:2rem;text-align:left}.external-app-wrapper .app-card .card-inner,.external-app-wrapper .user-card .card-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.external-app-wrapper .app-card a,.external-app-wrapper .button-green,.external-app-wrapper .user-card a{display:block}.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.external-app-wrapper .app-card h3,.external-app-wrapper .app-card p,.external-app-wrapper .user-card h3,.external-app-wrapper .user-card p{margin:0}.external-app-wrapper .app-card a,.external-app-wrapper .user-card .card-inner{margin-bottom:.5rem}.external-app-wrapper .app-card .app-image{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.external-app-wrapper .user-card{background:#F0EFD1;border:1px solid #000;padding:1rem}.external-app-wrapper .user-card .user-image{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .cancel{display:block;margin-top:.5rem;text-align:left}@media (max-width:480px){.external-app-wrapper{margin:0;min-width:100%;padding:2rem 1rem;text-align:center;width:100%}}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #f5f5f5;cursor:pointer;-webkit-transition:background .2s;transition:background .2s;-webkit-transition-delay:.2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(157,206,10,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single>a,.working-on .duty-single>a{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.empty-ticket .data,.home-project .project-card-inner{-webkit-box-orient:vertical;-webkit-box-direction:normal}.watching .duty-single>a.blocked,.working-on .duty-single>a.blocked{background:rgba(255,130,130,.2);color:red}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper,.home-wrapper .title-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-wrapper{display:flex}.home-wrapper .duty-summary{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .project-list{width:250px}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-weight:100;font-size:1.6rem;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#757575;display:flex;margin:0 0 .5rem;padding:.9rem 1rem}.home-project .project-card-description,.home-project .statistic,.projects-empty p{font-size:.9rem}.home-project{background:#fff;border:1px solid #f5f5f5;margin:.5rem .5rem 1rem;cursor:pointer;-webkit-transition:.2s;transition:.2s;-webkit-transition-delay:.1s;transition-delay:.1s}.home-project .tags-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.3rem}.home-project .project-tag{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.home-project .project-card-inner{padding:1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home-project .project-card-description{color:#555}.home-project .project-card-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:auto}.home-project .project-card-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.home-project .project-card-statistics .svg-eye-closed{display:none}.home-project .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.empty-ticket,.home-project .project-card-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-project .statistic.active{color:#72a114}.home-project .statistic.active svg{fill:#72a114}.home-project .project-card-header{display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.home-project .project-card-logo{display:inline-block;-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:50px;height:50px;margin-right:.5rem}.home-project .project-card-logo img{width:100%}.home-project .project-card-name{line-height:.9}.home-project .project-card-name a{font-size:1.2rem;color:#72a114}.home-project .project-card-name a:hover{color:#9dce0a}.home-project .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8;margin:0 .5rem}.home-project:hover{border:1px solid #9dce0a}.projects-empty{text-align:center}.projects-empty svg{height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty svg path{fill:#f5f5f5}.navbar .nav-left>a path,.navbar a:hover svg path{fill:#fff}.projects-empty .create-project-button{display:block;margin-bottom:.25rem}.projects-empty .import-project-button{display:block}.watching-empty,.working-on-empty{margin-bottom:4rem}.watching-empty p,.working-on-empty p{margin:2rem 9rem 1rem;text-align:center}.empty-ticket{display:flex}.empty-ticket .data,.navbar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.empty-ticket:not(:last-child){border-bottom:1px solid #f5f5f5;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#e8e8e8;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:40vw}.empty-ticket .line:last-child{margin:0;width:20vw}.navbar{display:flex;height:40px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:relative}.navbar::after{background-size:200%;bottom:0;content:'';height:100%;left:0;position:absolute;right:0;top:0;z-index:-1}.navbar .nav-left,.navbar .nav-right{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.navbar .nav-left>a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left>a.logo{background:rgba(0,0,0,.2);padding:.4rem .75rem}.navbar .nav-left>a svg{height:1.6rem;max-height:1.6rem;max-width:2rem;width:1.6rem}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar a{color:#fff;display:inline-block;-webkit-transition:all .2s linear;transition:all .2s linear}.navbar a:hover{background:rgba(0,0,0,.2);color:#212121}.navbar a.user-avatar{min-width:200px;padding:0 0 0 2rem;text-align:right}.navbar a.user-avatar span{padding-right:1rem}.navbar img{height:2.5rem;padding-left:.5rem;vertical-align:middle}.navbar svg{height:1.2rem;max-height:1.2rem;max-width:1.2rem;width:1.2rem}.navbar svg path{fill:#fff;-webkit-transition:all .2s;transition:all .2s}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;display:block}.navbar .navbar-dropdown a{padding:.8rem .5rem}.navbar .navbar-dropdown{border-radius:2px;display:none;left:calc(50% - 350px/2);min-width:350px;position:absolute;top:2.4rem;z-index:999}.navbar-dropdown{background:#212121;border:1px solid #000;padding:.3rem}.navbar-dropdown.dropdown-user{left:calc(50% - 200px/2);min-width:200px}.navbar-dropdown.dropdown-user ul{margin-bottom:0}.navbar-dropdown ul{margin:0 0 .5rem;padding:0}.navbar-dropdown ul:after,.navbar-dropdown ul:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:rgba(33,33,33,0);border-bottom-color:#212121}.navbar-dropdown ul:after{border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown a{color:#757575;display:block;padding:.8rem .5rem}.navbar-dropdown .create-options,.profile-filter{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.navbar-dropdown a:hover{background:rgba(255,255,255,.1);color:#212121}.navbar-dropdown a.create-organization-btn,.navbar-dropdown a.create-project-btn,.navbar-dropdown a.see-more-projects-btn{color:#fff;text-align:center}.navbar-dropdown a.create-organization-btn:hover,.navbar-dropdown a.create-project-btn:hover,.navbar-dropdown a.see-more-projects-btn:hover{color:#fff}.navbar-dropdown a.see-more-projects-btn{margin-bottom:.3rem}.navbar-dropdown a.create-project-btn{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.navbar-dropdown a.import-project-button{padding-left:.75rem;padding-right:.75rem}.navbar-dropdown .create-options{display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #f5f5f5}.profile-filter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile,.profile-filter .searchbox{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.profile-filter .searchbox{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{color:grayer;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs,.profile-projects,.profile-timeline{border-top:1px solid #f5f5f5}.profile-filter .searchbox input:focus{border-bottom:1px solid #b8b8b8;outline:0;-webkit-transition:border-bottom .3s ease-in;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#b8b8b8;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#050505}.profile .timeline-wrapper .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile{display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{background:#8f8f8f;margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;-webkit-transition:all .3s cubic-bezier(.09,.43,.35,.95);transition:all .3s cubic-bezier(.09,.43,.35,.95)}.profile .timeline-wrapper>div.ng-hide{opacity:0;padding-top:.5vh}.profile .timeline-wrapper .spin{margin:10% auto;width:3rem}.profile .profile-sidebar{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.profile .profile-sidebar .button-gray{display:block;margin-bottom:2rem;padding-left:2rem;padding-right:2rem}.profile .empty-tab{padding:5vh;text-align:center}.profile .empty-tab svg{margin:2rem auto;max-width:160px;text-align:center}.profile .empty-tab p{font-size:.9rem}.profile-bar .profile-stats .stat-name{font-size:.9rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username{font-size:1.2rem}.profile-bar h2{font-size:1.6rem}.profile-bar .profile-stats .stat-number,.profile-bar h1{font-size:2rem}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar .profile-organizations h3,.profile-bar .profile-stats .stat-number,.profile-bar h1{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-bar .profile-image-wrapper{height:200px;margin-bottom:1rem;overflow:hidden;position:relative}.profile-bar .profile-image-wrapper.is-current-user:hover img{-webkit-filter:brightness(40%) saturate(150%) hue-rotate(60deg);filter:brightness(40%) saturate(150%) hue-rotate(60deg);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1);-webkit-transition-delay:.3s;transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;-webkit-transform:translateY(100%);transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);-webkit-transition:all .3s cubic-bezier(.01,.7,1,1);transition:all .3s cubic-bezier(.01,.7,1,1)}.profile-bar .button-green{display:block;margin-bottom:1rem}.profile-bar .profile-data{position:relative}.profile-bar .flag{position:absolute;right:0;top:0;width:12px}.profile-bar .flag path{fill:#b8b8b8;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar .flag:hover path{fill:red;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar h1{line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar h2{color:#555;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#b8b8b8;margin-bottom:1rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#b8b8b8}.main-nav svg path,.navbar a svg path{fill:#fff}.profile-bar .profile-stats{border-bottom:1px solid #f5f5f5;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1.25rem;padding:1rem .5rem}.profile-bar .profile-stats .stat{padding:0 .2rem;text-align:center}.profile-bar .profile-stats .stat-number{display:block;line-height:1}.profile-bar .profile-stats .stat-name{display:block}.profile-bar .profile-organizations{border-bottom:1px solid #f5f5f5;border-top:1px solid #f5f5f5;margin-bottom:1rem;padding:1rem 0}.profile-bar .profile-organizations h3{margin-bottom:.5rem}.profile-bar .profile-organizations .profile-organizations-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.profile-bar .profile-organizations .organization{background:#b8b8b8;border-radius:5px;height:45px;margin-right:.2rem;width:45px}.profile-bar .profile-quote{background:url(../images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contact-single .profile-contact-data h1 span{font-size:.9rem}.profile-contact-single .profile-contact-data .extra-info{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-contact-single .profile-contact-data h1,.profile-contact-single .profile-contact-data h1 span{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.profile-contacts{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.profile-contact-filters{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.profile-contact-filters a{border-bottom:2px solid #fff;color:#b8b8b8;display:inline-block;padding:1rem 1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-contact-filters a.active,.profile-contact-filters a:hover{border-bottom:2px solid #b8b8b8;color:#72a114}.profile-contact-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.8rem 1rem}.profile-contact-single .profile-contact-picture{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:1rem;max-width:54px}.profile-contact-single .profile-contact-picture img{border-radius:.2rem;width:100%}.profile-contact-single .profile-contact-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-contact-single .profile-contact-data h1{font-size:1.2rem;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;line-height:1.6;margin-bottom:0;text-transform:none}.profile-contact-single .profile-contact-data h1 span{background:#f5f5f5;color:#555;margin-left:1rem;padding:.1rem .3rem}.profile-contact-single .profile-contact-data p{color:#555;margin-bottom:0}.profile-contact-single .profile-contact-data .extra-info{color:#555}.profile-contact-single .profile-contact-data .position{margin-right:.3rem}.profile-contact-single .profile-project-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-left:auto;width:100px}.profile-contact-single .profile-project-stats div{color:#b8b8b8;margin-right:.5rem}.profile-contact-single .profile-project-stats div .icon{margin-right:.2rem;vertical-align:center}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{display:inline-block;padding:1rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#444;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #f5f5f5;border-right:1px solid #f5f5f5;position:relative;top:1px;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .icon{margin-right:.4rem}.profile-sidebar p{font-size:.9rem}.profile-sidebar h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin-bottom:.5rem;padding:.5rem}.profile-sidebar h4 .icon{color:#b8b8b8;margin-right:.3rem;vertical-align:text-bottom}.profile-sidebar a{color:#72a114}.profile-sidebar .trans-button{margin-bottom:1rem}.profile-projects .list-itemtype-project{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:10rem}.profile-projects .list-itemtype-project .project-list-single-title-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.profile-projects .list-itemtype-project .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:200px}.project-list-wrapper .help-area{font-size:.9rem;color:#b8b8b8;width:200px}.project-list-wrapper .drag{font-size:1.2rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:2rem 0 1rem;padding:.9rem 1rem}.project-list-wrapper .project-list-title h1{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.project-list-wrapper .create-options a.create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .create-options a.import-project-button{padding:.53rem .8rem}.project-list-wrapper .create-options a.import-project-button:hover{background:#444}.project-list-wrapper .create-options a.import-project-button .icon-upload{margin:0}.project-list-wrapper .project-list-section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .placeholder{background-color:#fdfdfd;height:5rem}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:#fcfef8;cursor:move;-webkit-transition:background .3s;transition:background .3s}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .list-itemtype-project .list-itemtype-project-data-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-list-wrapper .list-itemtype-project .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.project-list-wrapper .drag{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;color:#b8b8b8;opacity:0;-webkit-transition:opacity .2s;transition:opacity .2s}.profile-timeline .single-attachment span{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child,.profile-timeline .activity-member-view a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-timeline .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32}.profile-timeline .activity-item{border-bottom:1px solid #f5f5f5;padding:1rem .5rem 1rem 0;position:relative}.profile-timeline .activity-item p{margin-bottom:0}.profile-timeline .activity-item .username,.profile-timeline .activity-item a{color:#72a114}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{color:#555}.profile-timeline .activity-item a:hover{color:#9dce0a}.profile-timeline .activity-item blockquote{line-height:1.4rem;margin-bottom:0;margin-left:calc(35px + 1rem);margin-top:.5rem;overflow-x:auto;overflow-y:hidden;white-space:pre-line}.profile-timeline .activity-item img{max-height:640px;max-width:640px}.profile-timeline .activity-item .activity-info{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#b8b8b8;font-size:.75rem;position:absolute;right:.5rem;top:1.2rem}.profile-timeline .activity-item .profile-contact-picture,.profile-timeline .activity-item .profile-member-picture{border-radius:.1rem;-webkit-flex-basis:2rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;vertical-align:center;width:2rem}.profile-timeline .activity-item .profile-contact-picture img,.profile-timeline .activity-item .profile-member-picture img{width:100%}.profile-timeline .activity-member-view{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-timeline .activity-member-view p{color:#b8b8b8}a:hover,h1 .date,h2 .date,h3 .date,h4 .date,h5 .date,h6 .date{color:#000}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.profile-timeline .single-attachment .icon{margin-right:.3rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{max-height:3rem;max-width:3rem}.markItUpEditor{font-size:.9rem;line-height:1.5;font-family:monospace}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}.checksley-error-list{font-weight:100;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}body{background:#fff}.extrabar,.master,.menu-secondary,.menu-tertiary{background:#fff;border-left:1px solid #000;border-right:1px solid #000}.master,.menu-secondary{background:#fff}.menu-tertiary{background-color:#fff}.extrabar{background:#fff}h1,h2,h3,h4,h5,h6{font-family:Arial,Helvetica,sans-serif}a{color:#212121}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{background:#fff;border-color:#000;color:#000}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#000}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#000}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#000}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#000}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{border:1px solid #ff2400}.checksley-error-list{background:rgba(255,36,0,.7);color:#fff}blockquote{border-left:5px solid #757575}blockquote,blockquote p,cite{color:#000}.navbar a :hover,.summary{color:#fff}.button-gray{background:#000}.tag{background:#fff;border:1px solid #000}.summary{background:#212121}.navbar{background:#000}.navbar::after{background:url(../images/menu-vert.png) top left}.activity-item p,.duty-custom-fields .custom-field-data .custom-field-description,.kanban-table-header .task-colum-name .icon,.points-per-role>li,.private path,.table-team .avatar .position,.taskboard-table-header .task-colum-name .icon,.us-created-by .created-by .created-date,.us-created-by .created-by .created-title,.watching .duty-id,.working-on .duty-id{color:#000}tg-project-menu{background-color:#000;background-image:none}.main-nav .active{background:#fff}.main-nav .active svg path{fill:#000}.taskboard-table-header .task-colum-name{background:#fff;border-top:3px solid #000}.taskboard-table-body .taskboard-tasks-box{background:#fff;border:1px solid #000}.kanban-table-header .task-colum-name{background:#fff;border-top:3px solid #000}.kanban-table-body .kanban-uses-box{background:#757575}.points-per-role>li:first-child{background:#000}.us-detail-settings .button-gray{background:0 0;border:1px solid #000;color:#000}.us-detail-settings .button-gray.active,.us-detail-settings .button-gray:hover{color:#fff}.history-tabs a,.more-attachments span,.us-detail-settings .button-gray span{color:#000}.login-main,.login-main a{color:#fff}.home-project-list li{border:1px solid #000}.home-project-list p{color:#000}.profile-content-tabs .tab,.profile-sidebar p{color:#212121}.settings-nav .active{background:#000;color:#fff}.admin-submenu ul a{color:#000}.policy-table input:checked+label{color:#fff}.policy-table label{color:#000}.policy-table label:hover{color:#fff}.admin-common .admin-subtitle,.admin-membership-table .avatar .email,.admin-membership-table .delete{color:#000}.admin-functionalities .functionality.active{background:#fff;border:1px solid #000}.home-wrapper .title-bar{color:#fff} \ No newline at end of file diff --git a/dist/v-1454396495445/styles/theme-material-design.css b/dist/v-1454396495445/styles/theme-material-design.css new file mode 100644 index 0000000..1bb3e68 --- /dev/null +++ b/dist/v-1454396495445/styles/theme-material-design.css @@ -0,0 +1,4 @@ +@charset "UTF-8";.introjs-arrow,blockquote::after,blockquote::before,q::after,q::before{content:''}.pika-table,table{border-collapse:collapse;border-spacing:0}.kanban-task-minimized .task-name,h1 .date,h1 span{text-overflow:ellipsis;white-space:nowrap}.lightbox textarea,.wizard-create-project textarea,textarea{resize:vertical}.change-entry .activity-fromto,.kanban-task-maximized .task-name,.profile-bar .not-full-name,.profile-bar h1{word-wrap:break-word}.codehilite .hll{background-color:#49483e}.codehilite .c{color:#75715e}.codehilite .err{color:#960050;background-color:#1e0010}.codehilite .k{color:#66d9ef}.codehilite .l{color:#ae81ff}.codehilite .n{color:#f8f8f2}.codehilite .o{color:#f92672}.codehilite .p{color:#f8f8f2}.codehilite .c1,.codehilite .cm,.codehilite .cp,.codehilite .cs{color:#75715e}.codehilite .ge{font-style:italic}.codehilite .gs{font-weight:700}.codehilite .kc,.codehilite .kd{color:#66d9ef}.codehilite .kn{color:#f92672}.codehilite .kp,.codehilite .kr,.codehilite .kt{color:#66d9ef}.codehilite .ld{color:#e6db74}.codehilite .m{color:#ae81ff}.codehilite .s{color:#e6db74}.codehilite .na{color:#a6e22e}.codehilite .nb{color:#f8f8f2}.codehilite .nc{color:#a6e22e}.codehilite .no{color:#66d9ef}.codehilite .nd{color:#a6e22e}.codehilite .ni{color:#f8f8f2}.codehilite .ne,.codehilite .nf{color:#a6e22e}.codehilite .nl,.codehilite .nn{color:#f8f8f2}.codehilite .nx{color:#a6e22e}.codehilite .py{color:#f8f8f2}.codehilite .nt{color:#f92672}.codehilite .nv{color:#f8f8f2}.codehilite .ow{color:#f92672}.codehilite .w{color:#f8f8f2}.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#ae81ff}.codehilite .s2,.codehilite .sb,.codehilite .sc,.codehilite .sd{color:#e6db74}.codehilite .se{color:#ae81ff}.codehilite .s1,.codehilite .sh,.codehilite .si,.codehilite .sr,.codehilite .ss,.codehilite .sx{color:#e6db74}.codehilite .bp,.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#f8f8f2}.codehilite .il{color:#ae81ff}.codehilite .gu{color:#75715e}.codehilite .gd{color:#f92672}.codehilite .gi{color:#a6e22e}.mCustomScrollbar{-ms-touch-action:none;touch-action:none}.mCustomScrollbar.mCS_no_scrollbar{-ms-touch-action:auto;touch-action:auto}.mCustomScrollBox{position:relative;overflow:hidden;height:100%;max-width:100%;outline:0;direction:ltr}.mCSB_container{overflow:hidden;width:auto;height:auto}.mCSB_inside>.mCSB_container{margin-right:30px}.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container{margin-right:0;margin-left:30px}.mCS-dir-rtl>.mCSB_inside>.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-left:0}.mCSB_scrollTools{position:absolute;width:16px;height:auto;left:auto;top:0;right:0;bottom:0;opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_outside+.mCSB_scrollTools{right:-26px}.mCS-dir-rtl>.mCSB_inside>.mCSB_scrollTools,.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{right:auto;left:0}.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{left:-26px}.mCSB_scrollTools .mCSB_draggerContainer{position:absolute;top:0;left:0;bottom:0;right:0;height:auto}.mCSB_scrollTools a+.mCSB_draggerContainer{margin:20px 0}.mCSB_scrollTools .mCSB_draggerRail{width:2px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCSB_scrollTools .mCSB_dragger{cursor:pointer;width:100%;height:30px;z-index:1}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{position:relative;width:4px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px;text-align:center}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:12px}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:8px}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonUp{display:block;position:absolute;height:20px;width:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools .mCSB_buttonDown{bottom:0}.mCSB_horizontal.mCSB_inside>.mCSB_container{margin-right:0;margin-bottom:30px}.mCSB_horizontal.mCSB_outside>.mCSB_container{min-height:100%}.mCSB_horizontal>.mCSB_container.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal{width:auto;height:16px;top:auto;right:0;bottom:0;left:0}.mCustomScrollBox+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:-26px}.mCSB_scrollTools.mCSB_scrollTools_horizontal a+.mCSB_draggerContainer{margin:0 20px}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:2px;margin:7px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger{width:30px;height:100%;left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:4px;margin:6px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:12px;margin:2px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:8px;margin:4px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{display:block;position:absolute;width:20px;height:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft{left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{right:0}.mCSB_container_wrapper{position:absolute;height:auto;width:auto;overflow:hidden;top:0;left:0;right:0;bottom:0;margin-right:30px;margin-bottom:30px}.mCSB_container_wrapper>.mCSB_container{padding-right:30px;padding-bottom:30px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:20px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:20px}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden+.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:20px}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container_wrapper{margin-right:0;margin-left:30px}.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden>.mCSB_container{padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden>.mCSB_container{padding-bottom:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0;margin-left:0}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;transition:opacity .2s ease-in-out,background-color .2s ease-in-out}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar{-webkit-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out}.introjs-helperLayer,.introjs-overlay{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out}.mCS-autoHide>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide>.mCustomScrollBox~.mCSB_scrollTools{opacity:0;filter:"alpha(opacity=0)";-ms-filter:"alpha(opacity=0)"}.mCS-autoHide:hover>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide:hover>.mCustomScrollBox~.mCSB_scrollTools,.mCustomScrollBox:hover>.mCSB_scrollTools,.mCustomScrollBox:hover~.mCSB_scrollTools,.mCustomScrollbar>.mCustomScrollBox>.mCSB_scrollTools.mCSB_scrollTools_onDrag,.mCustomScrollbar>.mCustomScrollBox~.mCSB_scrollTools.mCSB_scrollTools_onDrag{opacity:1;filter:"alpha(opacity=100)";-ms-filter:"alpha(opacity=100)"}.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.4);filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75);filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85);filter:"alpha(opacity=85)";-ms-filter:"alpha(opacity=85)"}.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9);filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp{background-image:url(mCSB_buttons.png);background-repeat:no-repeat;opacity:.4;filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_buttonUp{background-position:0 0}.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -20px}.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -40px}.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -56px}.mCSB_scrollTools .mCSB_buttonDown:hover,.mCSB_scrollTools .mCSB_buttonLeft:hover,.mCSB_scrollTools .mCSB_buttonRight:hover,.mCSB_scrollTools .mCSB_buttonUp:hover{opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_buttonDown:active,.mCSB_scrollTools .mCSB_buttonLeft:active,.mCSB_scrollTools .mCSB_buttonRight:active,.mCSB_scrollTools .mCSB_buttonUp:active{opacity:.9;filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCS-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:rgba(0,0,0,.85)}.mCS-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:rgba(0,0,0,.9)}.mCS-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:4px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px auto}.mCS-light-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px 0}.mCS-light-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -20px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -40px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px 0}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -20px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -40px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px 0}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:6px;margin:5px auto}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px 0}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -20px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -40px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px 0}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -20px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -40px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -56px}.mCS-light-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.1)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:2px}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:2px;margin:7px auto}.mCS-dark-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-rounded.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger,.mCS-rounded.mCSB_scrollTools .mCSB_dragger{height:14px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:14px;margin:0 1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger{width:14px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:14px;margin:1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:16px;height:16px;margin:-1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:4px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:16px;width:16px;margin:0 -1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:4px;margin:6px 0}.mCS-rounded.mCSB_scrollTools .mCSB_buttonUp{background-position:0 -72px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -92px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -112px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -128px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px -72px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -92px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -112px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools_vertical .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_vertical .mCSB_draggerRail{width:4px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{background-color:transparent;background-position:center}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAANElEQVQYV2NkIAAYiVbw//9/Y6DiM1ANJoyMjGdBbLgJQAX/kU0DKgDLkaQAvxW4HEvQFwCRcxIJK1XznAAAAABJRU5ErkJggg==);background-repeat:repeat-y;opacity:.3;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{height:4px;margin:6px 0;background-repeat:repeat-x}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px -72px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -92px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -112px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYV2NkIAAYSVFgDFR8BqrBBEifBbGRTfiPZhpYjiQFBK3A6l6CvgAAE9kGCd1mvgEAAAAASUVORK5CYII=)}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px -72px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -92px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -112px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-y;background-image:-moz-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to right,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-x;background-image:-moz-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to bottom,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-3d.mCSB_scrollTools_vertical .mCSB_dragger{height:70px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger{width:70px}.mCS-3d-dark.mCSB_scrollTools,.mCS-3d.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{width:8px;background-color:#000;background-color:rgba(0,0,0,.2);box-shadow:inset 1px 0 1px rgba(0,0,0,.5),inset -1px 0 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:8px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:8px;margin:4px 0;box-shadow:inset 0 1px 1px rgba(0,0,0,.5),inset 0 -1px 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:8px;margin:4px auto}.mCS-3d.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);box-shadow:inset 1px 0 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{box-shadow:inset 0 1px 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer,.mCS-3d-thick.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.mCSB_inside+.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCSB_inside+.mCS-3d-thick.mCSB_scrollTools_vertical{right:1px}.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCS-3d-thick.mCSB_scrollTools_vertical{box-shadow:inset 1px 0 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal,.mCS-3d-thick.mCSB_scrollTools_horizontal{bottom:1px;box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;box-shadow:inset 1px 0 0 rgba(255,255,255,.4);width:12px;margin:2px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4);height:12px;width:auto}.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{background-color:#000;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-thick-dark.mCSB_scrollTools{box-shadow:inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal{box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 1px 0 0 rgba(255,255,255,.4),inset -1px 0 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4),inset 0 -1px 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#777}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer{background-color:#fff;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{right:0;margin:12px 0}.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:0;margin:0 12px}.mCS-dir-rtl>.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCS-dir-rtl>.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{left:0;right:auto}.mCS-minimal-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_vertical .mCSB_dragger{height:50px}.mCS-minimal-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_horizontal .mCSB_dragger{width:50px}.mCS-minimal.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools .mCSB_draggerRail{width:6px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px}.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:6px;margin:5px 0}.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:12px}.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:12px;margin:2px 0}.mCS-light-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools .mCSB_draggerRail{width:12px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;margin:3px 5px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:6px;margin:5px 3px;position:absolute;width:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:12px;margin:2px 0}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent;border-width:1px;border-style:solid;border-color:#fff;border-color:rgba(255,255,255,.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail{border-color:#000;border-color:rgba(0,0,0,.2)}.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.6)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.6)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.dropdown-menu{border:1px solid #ddd;background-color:#fff}.dropdown-menu li{border-top:1px solid #ddd;padding:2px 5px}.dropdown-menu li:first-child{border-top:none}.dropdown-menu .active,.dropdown-menu li:hover{background-color:#6eb7db;color:#fff}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff}.dropdown-menu{list-style:none;padding:0;margin:0}.dropdown-menu a:hover{cursor:pointer}.markItUp .markItUpButton1 a{background-image:url(../images/markitup/h1.png)}.markItUp .markItUpButton2 a{background-image:url(../images/markitup/h2.png)}.markItUp .markItUpButton3 a{background-image:url(../images/markitup/h3.png)}.markItUp .markItUpButton4 a{background-image:url(../images/markitup/bold.png)}.markItUp .markItUpButton5 a{background-image:url(../images/markitup/italic.png)}.markItUp .markItUpButton6 a{background-image:url(../images/markitup/stroke.png)}.markdown .markItUpButton7 a{background-image:url(../images/markitup/list-bullet.png)}.markdown .markItUpButton8 a{background-image:url(../images/markitup/list-numeric.png)}.markdown .markItUpButton9 a{background-image:url(../images/markitup/picture.png)}.markdown .markItUpButton10 a{background-image:url(../images/markitup/link.png)}.markdown .markItUpButton11 a{background-image:url(../images/markitup/quotes.png)}.markdown .markItUpButton12 a{background-image:url(../images/markitup/code.png)}.markdown .preview-icon a{background-image:url(../images/markitup/preview.png)}.markdown .help a{background-image:url(../images/markitup/help.png)}.markItUp *{margin:0;padding:0;outline:0}.markItUp a:link,.markItUp a:visited{color:#000;text-decoration:none}.markItUpContainer{font:11px Verdana,Arial,Helvetica,sans-serif}.markItUpEditor{font:12px 'Courier New',Courier,monospace;padding:5px;height:320px;clear:both;overflow:auto}.markItUpPreviewFrame{overflow:auto;background-color:#FFF;width:99.9%;height:300px;margin:5px 0}.markItUpFooter{width:100%}.markItUpResizeHandle{overflow:hidden;width:22px;height:5px;margin-left:auto;margin-right:auto;background-image:url(../images/markitup/handle.png);cursor:n-resize}.markItUp .markItUpHeader ul{margin:0}.markItUpHeader ul li{list-style:none;position:relative;margin:3px}.markItUpHeader ul li:hover>ul{display:block}.markItUpHeader ul .markItUpDropMenu{background:url(../images/markitup/menu.png) 115% 50% no-repeat;margin-right:5px}.markItUpHeader ul .markItUpDropMenu li{margin-right:0}.markItUpHeader ul ul{display:none;position:absolute;top:18px;left:0;background:#FFF;border:1px solid #000}.markItUpHeader ul ul li{float:none;border-bottom:1px solid #000}.markItUpHeader ul ul .markItUpDropMenu{background:url(../images/markitup/submenu.png) 100% 50% no-repeat #FFF}.markItUpHeader ul .markItUpSeparator{margin:2px 10px 0;width:1px;height:16px;overflow:hidden;background-color:#CCC}.introjs-button,button{overflow:visible}.markItUpHeader ul ul .markItUpSeparator{width:auto;height:1px;margin:0}.markItUpHeader ul ul ul{position:absolute;top:-1px;left:150px}.markItUpHeader ul ul ul li{float:none}.markItUpHeader ul a{display:block;width:16px;height:16px;text-indent:-10000px;background-repeat:no-repeat;padding:3px;margin:0}.markItUpHeader ul ul a{display:block;text-indent:0;width:120px;padding:5px 5px 5px 25px;background-position:2px 50%}.markItUpHeader ul ul a:hover{color:#FFF;background-color:#000}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}mark{background:#ff0;color:#000}sub,sup{line-height:0;position:relative}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}optgroup{font-weight:700}/*! + * Pikaday + * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ + */.pika-single{display:block;position:relative;width:240px;padding:8px;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-title{position:relative;text-align:center}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;filter:alpha(opacity=0);opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.introjs-bullets ul,.introjs-button,.pika-select{display:inline-block}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-table{width:100%;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700;text-align:center}.pika-button{cursor:pointer;display:block;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.is-today .pika-button{color:#3af;font-weight:700}.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.pika-button:hover{color:#fff!important;background:#ff8000!important;box-shadow:none!important;border-radius:3px!important}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;position:absolute!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border-radius:4px;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0);filter:progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000);box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid #fff;position:absolute}.introjs-arrow.top,.introjs-arrow.top-middle,.introjs-arrow.top-right{top:-10px;border-color:transparent transparent #fff}.introjs-arrow.top-right{right:10px}.introjs-arrow.top-middle{left:50%;margin-left:-5px}.introjs-arrow.left,.introjs-arrow.right{top:10px}.introjs-arrow.right,.introjs-arrow.right-bottom{right:-10px;border-color:transparent transparent transparent #fff}.introjs-arrow.right-bottom{bottom:10px}.introjs-arrow.bottom{bottom:-10px;border-color:#fff transparent transparent}.introjs-arrow.left,.introjs-arrow.left-bottom{left:-10px;border-color:transparent #fff transparent transparent}.introjs-arrow.left-bottom{bottom:10px}.introjs-tooltip{position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{position:relative;margin:10px 0 0;text-decoration:none;font:11px/normal sans-serif;white-space:nowrap;cursor:pointer;outline:0;-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;zoom:1}.introjs-progress,.loader-active,.taskboard,.taskboard-inner,body.loading-project,h1 .date,h1 span{overflow:hidden}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-bullets{text-align:center}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0}.introjs-bullets ul li{list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{height:10px;margin:10px 0 5px;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{float:left;width:0;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.admin-membership header a,.header-with-actions .button,.kanban .kanban-settings,.save-wiki{float:right}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.master,fieldset{position:relative}body,html{width:100%;min-height:100%}*{box-sizing:border-box}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{border:0;font:inherit;font-size:100%;margin:0;padding:0;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}body{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.3}.icon{font-family:taiga}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body .master.ng-animate{-webkit-transition:0;transition:0}.drag-active{overflow-x:hidden}.master{height:100%;min-height:100%}.menu-secondary,.menu-tertiary,.wrapper{min-height:calc(100vh - 40px)}.centered{margin:1rem auto;max-width:1200px;min-width:960px;width:90%}.wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-secondary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary.filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0;-webkit-transition:all .2s linear;transition:all .2s linear;width:0}.menu-secondary.filters-bar.active{padding:2em 1em;-webkit-transition:all .2s linear;transition:all .2s linear;width:260px}.menu-secondary.filters-bar.active .filters-inner{opacity:1;-webkit-transition:all .4s ease-in;transition:all .4s ease-in}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;min-width:0;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions .action-buttons{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;margin-left:10px}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}h1 span,h2{font-size:1.6rem}h1{font-size:2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:1rem;text-transform:uppercase}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.ttf) format("truetype")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.ttf) format("truetype")}@font-face{font-family:OpenSans-Regular;src:url(../fonts/OpenSans-Regular.ttf) format("truetype")}@font-face{font-family:OpenSans-Semibold;src:url(../fonts/OpenSans-Semibold.ttf) format("truetype")}@font-face{font-family:taiga;font-style:normal;font-weight:400;src:url(../fonts/taiga.eot);src:url(../fonts/taiga.eot?) format("eot"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype")}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.5}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}.wysiwyg dl dt,strong{font-weight:700}h1 span{margin-right:.5rem;vertical-align:bottom}h1 span.green,h1 span:last-child{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#3f51b5}h1 .date{max-width:500px;color:#BDBDBD}h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.2;margin-bottom:1rem}p{line-height:1.5;margin:0 0 20px}p img{margin:0}em{font-style:italic}[class*=' icon-']::before,[class^=icon-]::before,[data-icon]::before{font-family:taiga!important;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal!important;font-variant:normal!important;font-weight:400!important;line-height:1;speak:none;text-transform:none!important}hr{border:solid #212121;border-width:1px 0 0;clear:both;height:0;margin:10px 0 30px}a,a:visited{text-decoration:none}a:hover,a:visited:hover{-webkit-transition:color .3s linear;transition:color .3s linear}[data-icon]::before{content:attr(data-icon)}.admin-contrib .help .alt-image,.admin-third-parties .help .alt-image,.wysiwyg dl dt{font-style:italic}.icon-bug::before{content:'a'}.icon-copy::before{content:'b'}.icon-minimize::before{content:'c'}.icon-maximize::before{content:'d'}.icon-comment::before{content:'e'}.icon-plus::before{content:'f'}.icon-attachments::before{content:'g'}.icon-edit::before{content:'h'}.icon-documents::before{content:'i'}.icon-delete::before{content:'j'}.icon-arrow-bottom::before{content:'k'}.icon-arrow-left::before{content:'l'}.icon-arrow-right::before{content:'m'}.icon-arrow-up::before{content:'n'}.icon-briefcase::before{content:'o'}.icon-caret-down::before{content:'p'}.icon-caret-up::before{content:'q'}.icon-check-square::before{content:'r'}.icon-notification-error::before{content:'s'}.icon-settings::before{content:'t'}.icon-document::before{content:'u'}.icon-warning::before{content:'v'}.icon-move::before{content:'w'}.icon-drag-v::before{content:'x'}.icon-filter::before{content:'y'}.icon-help::before{content:'z'}.icon-reload::before{content:'A'}.icon-writer::before{content:'B'}.icon-stats::before{content:'C'}.icon-floppy::before{content:'D'}.icon-warning-alt::before{content:'E'}.icon-video::before{content:'F'}.icon-bulk::before{content:'G'}.icon-vunfold::before{content:'H'}.icon-tasks::before{content:'I'}.icon-kanban::before{content:'J'}.icon-search::before{content:'K'}.icon-wiki::before{content:'L'}.icon-team::before{content:'M'}.icon-vfold::before{content:'N'}.icon-issues::before{content:'O'}.icon-iocaine::before{content:'P'}.icon-archive::before{content:'Q'}.icon-capslock::before{content:'R'}.icon-upload::before{content:'S'}.icon-github::before{content:'T'}.icon-timeline::before{content:'U'}.icon-scrum::before{content:'V'}.icon-project::before{content:'W'}.icon-heart::before{content:'X'}.icon-eye::before{content:'Y'}@-webkit-keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@-webkit-keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;flex:10}}@keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;-ms-flex:10;flex:10}}@-webkit-keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes blink{85%{opacity:1}100%{opacity:.6}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote cite,sup{font-size:.9rem}.spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32;max-height:2rem;max-width:2rem}blockquote,blockquote p{line-height:1.25rem}blockquote{margin:0 0 20px;padding:.5rem 1.25rem}blockquote cite{display:block}blockquote cite::before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}sup{vertical-align:super}.icon{vertical-align:middle}.clickable{cursor:pointer}.not-clickable{cursor:default}.draggable{cursor:move}svg{height:1rem;width:1rem}.pika-single{z-index:999999}.pika-single .pika-title{color:#424242}.pika-single .is-selected .pika-button{background:#3f51b5;border-radius:0!important;box-shadow:inset 0 1px 3px #3f51b5}.pika-single .is-today .pika-button{color:#3f51b5}.pika-single .is-today.is-selected button{color:#fff}.pika-single .pika-button:hover{background:#8c9eff!important;border-radius:0!important;box-shadow:inset 0 1px 3px #8c9eff!important}fieldset{border:0;margin:0;padding:0;width:100%}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{border:1px solid;margin:0;padding:8px;width:100%}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{-webkit-transition:border .3s linear;transition:border .3s linear}button,button:active,button:focus{border:0;outline:0}textarea{min-height:10rem}.checksley-error-list{margin-bottom:0}.checksley-error-list li{padding:.2rem}.icon-capslock{bottom:.6rem;color:#757575;display:none;position:absolute;right:1rem}.auth,.error-main{bottom:0;z-index:999;left:0}.admin-membership header:after{clear:both;content:'';display:table}.admin-membership .check input{height:40px;width:85px}.admin-roles p{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#BDBDBD}.auth .logo,.auth .tagline{color:#fff;text-align:center}.admin-attributes .admin-attributes-section{margin-bottom:2rem}.admin-attributes .admin-attributes-section .checksley-error-list{height:0;position:relative}.admin-attributes .admin-attributes-section .checksley-error-list li{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(244,67,54,.7);position:absolute;width:100%}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.project-values-title{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#EEE;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem;text-transform:uppercase}.project-values-title h2{margin:0}.auth .logo,.auth .tagline,.auth form{margin-bottom:1rem}.project-values-title h2 span{margin-left:.5rem;text-transform:none}.project-values-title a{display:inline-block}.auth{background:url(https://lh4.googleusercontent.com/-k7YewfrSQ_Q/VGdNZND0NBI/AAAAAAAAD1A/UDZBeSGR7iM/w1465-h824-no/Ultimate%2BMaterial%2BLollipop%2BCollection%2B-%2B480) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:fixed;right:0;top:0}.invitation-main .avatar,.invitation-main .invitation-container,.kanban{-webkit-box-orient:vertical;-webkit-box-direction:normal}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.auth .logo{font-size:3rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.auth .auth-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{text-align:center;width:100%}.auth .logo-svg svg{height:8rem;width:8rem}.kanban,.taskboard{height:calc(100vh - 40px)}.auth fieldset{margin-bottom:.5rem}.auth .login-text,.auth .register-text{text-align:center}.auth .login-text a:hover,.auth .register-text a:hover{color:#8c9eff}.auth .button{color:#fff;display:block;text-align:center}.auth a:hover{color:#fff}.moustache{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moustache;animation-name:moustache;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;fill:rgba(63,81,181,.9);stroke:#8c9eff;stroke-width:1px;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transition:.3s;transition:.3s}.moustache:hover{fill:rgba(140,158,255,.9);-webkit-transition:.3s;transition:.3s}.list-itemtype-project .icon path,.list-itemtype-project .list-itemtype-track-likers.active path,.list-itemtype-project .list-itemtype-track-watchers.active path,.list-itemtype-ticket .icon path,.list-itemtype-ticket .list-itemtype-track-likers.active path,.list-itemtype-ticket .list-itemtype-track-watchers.active path,.list-itemtype-timeline .icon path,.list-itemtype-timeline .list-itemtype-track-likers.active path,.list-itemtype-timeline .list-itemtype-track-watchers.active path,.list-itemtype-user .icon path,.list-itemtype-user .list-itemtype-track-likers.active path,.list-itemtype-user .list-itemtype-track-watchers.active path{fill:currentcolor}@-webkit-keyframes moustache{0%,30%,70%,90%{-webkit-transform:rotate(0);transform:rotate(0)}10%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}@keyframes moustache{0%,30%,70%,90%{-webkit-transform:rotate(0);transform:rotate(0)}10%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}.backlog-menu{background:#EEE;color:#212121;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .trans-button{color:#212121;display:inline-block;padding:.4rem 1.5rem}.backlog-menu .trans-button.active,.backlog-menu .trans-button:hover{background:#757575;color:#EEE}.backlog-menu .trans-button.active:hover{background:#c2c2c2}.backlog-menu .trans-button.move-to-sprint{display:none}.invitation-main,.invitation-main .invitation-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-menu .button-bulk{margin-left:.2rem}.invitation-main{background:url(https://lh6.googleusercontent.com/-2l_mJ5g6j4k/VGdNZCpaERI/AAAAAAAAD2o/zCx5Z3cYv6Y/w1465-h824-no/Ultimate%2BMaterial%2BLollipop%2BCollection%2B-%2B497) center center no-repeat;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-size:cover;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;z-index:999}.invitation-main .invitation-form .forgot-pass{font-size:.9rem}.invitation-main .avatar .person-name,.invitation-main .invitation-text,.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.invitation-main .invitation-container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar .person-name{color:#fff}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{color:#fff;text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{color:#BDBDBD;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#424242;-webkit-transition:color .3s linear;transition:color .3s linear}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header,.invitation-main .register-text{color:#fff}.invitation-main .login-form,.invitation-main .register-form{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .register-text a{color:#3f51b5}.invitation-main .button-auth{display:block}.invitation-main .button-blackish:hover{background:#3f51b5}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.issues .filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:260px}.issues .filters-inner{opacity:1;padding:1rem}.kanban{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px)}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.error-main,.taskboard-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.error-main{background:url(https://lh6.googleusercontent.com/-2l_mJ5g6j4k/VGdNZCpaERI/AAAAAAAAD2o/zCx5Z3cYv6Y/w1465-h824-no/Ultimate%2BMaterial%2BLollipop%2BCollection%2B-%2B497) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:fixed;right:0;top:0}.basic-table,.taskboard-inner,.us-story-main-data .us-title{-webkit-box-orient:vertical;-webkit-box-direction:normal}.error-main .error-container{color:#fff;-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;text-align:center}.error-main .logo-svg{padding:0 32%;text-align:center;width:100%}.error-main h1{color:#fff;margin-bottom:3rem}.error-main a{color:#3f51b5}.error-main a:hover{color:#8c9eff}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.taskboard-inner{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%}.us-story-main-data .us-title,.us-story-main-data header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.team h2{margin:1rem 0}.team h2 span:last-child{color:#3f51b5}.us-story-main-data .us-title .block-desc-container,.us-story-main-data .us-title .us-related-task{font-size:.9rem}.us-story-main-data .us-title,.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{font-size:1.2rem}.us-story-main-data .us-title .us-title-text{font-size:1.6rem}.blocked-warning .blocked,.blocked-warning .icon,.issue-nav a{font-size:2rem}.blocked-warning .blocked{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.us-story-main-data .us-title,.us-story-main-data .us-title .us-number,.us-story-main-data .us-title .us-title-text{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.us-story-main-data .us-title .block-description-title,.us-story-main-data .us-title.blocked .unblock{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.card-placeholder p,.wiki .wiki-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32}.us-story-main-data{margin-bottom:1rem}.us-story-main-data header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.us-story-main-data .us-title{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;background:#EEE;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:.5rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear}.us-story-main-data .us-title.blocked{background:#f44336;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:middle}.us-story-main-data .us-title.blocked .us-title-text,.us-story-main-data .us-title.blocked input{margin-bottom:.5rem}.us-story-main-data .us-title.blocked .us-name,.us-story-main-data .us-title.blocked .us-number,.us-story-main-data .us-title.blocked .us-related-task{color:#fff}.us-story-main-data .us-title.blocked a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title.blocked a:hover{color:#ff5252}.us-story-main-data .us-title.blocked .unblock{color:#fff;float:right}.us-story-main-data .us-title.blocked .unblock:hover{color:#ff5252;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title p{margin-bottom:0}.us-story-main-data .us-title .us-edit-name-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.us-story-main-data .us-title .edit-subject{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%}.us-story-main-data .us-title input{background:#fff;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.us-story-main-data .us-title .save-container{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.us-story-main-data .us-title .us-title-text{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-bottom:0;max-width:92%;width:100%}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{max-height:1.5rem;max-width:1.5rem}.us-story-main-data .us-title .us-title-text:hover .icon-edit{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.us-story-main-data .us-title .us-number{color:#BDBDBD;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;line-height:2.2rem;margin-right:.5rem}.us-story-main-data .us-title .us-name{color:#757575;display:inline-block;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;line-height:2.2rem;padding-right:1rem;width:100%}.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{color:#BDBDBD;margin-left:.5rem}.us-story-main-data .us-title .icon-edit{opacity:0}.us-story-main-data .us-title .us-related-task{color:#BDBDBD;margin-top:.5rem}.us-story-main-data .us-title .us-related-task a{border-left:1px solid #BDBDBD;padding:0 .2rem}.us-story-main-data .us-title .us-related-task a:hover{color:#3f51b5}.us-story-main-data .us-title .us-related-task a:first-child{border:0}.us-story-main-data .us-title .block-description-title{color:#fff;margin-right:.5rem}.us-story-main-data .us-title .block-description{color:#fff;display:inline-block;margin-right:5rem}.basic-table,.subheader{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.blocked-warning{margin-bottom:1rem}.blocked-warning .blocked{color:#f44336;line-height:2.5rem;margin-bottom:.5rem}.blocked-warning .icon{vertical-align:middle}.blocked-warning .block-description{color:#424242;margin:0}.duty-content .edit-description,.wiki-content{margin-bottom:2rem}.issue-nav{position:absolute;right:1rem;top:1rem}.subheader{display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:1280px){.subheader{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}}.subheader .ticket-created-by{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-basis:250px;-ms-flex-preferred-size:250px;flex-basis:250px}@media (max-width:1280px){.subheader .ticket-created-by{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}}.subheader .tags-block{-webkit-box-flex:3;-webkit-flex:3;-ms-flex:3;flex:3}@media (max-width:1280px){.subheader .tags-block{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}}.duty-content{position:relative}.duty-content .in-progress{cursor:progress}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#EEE;cursor:pointer}.duty-content:hover .view-description .no-description{color:#424242}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#BDBDBD}.duty-content textarea{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-content .edit{color:#424242}.duty-content .view-description .edit{background:#EEE;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .save{top:.4rem}.duty-content .edit-description .edit{position:absolute;right:2.5rem;top:.4rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wiki .remove{font-size:.9rem;color:#BDBDBD}.wiki .wiki-title{font-size:1.6rem}.wiki .remove:hover span{color:#424242;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove:hover .icon{color:#f44336;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove .icon{color:#BDBDBD;margin-right:.2rem}.wiki-content{position:relative}.wiki-content .in-progress{cursor:progress}.wiki-content.editable:hover .wysiwyg{background:#EEE;cursor:pointer}.wiki-content .view-wiki-content:hover .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .view-wiki-content .edit{background:#EEE;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .icon:hover{color:#424242;opacity:.3;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .preview-icon{position:absolute;right:3.5rem}.wiki-content .edit-wiki-content .action-container{position:absolute;right:1rem;top:.3rem}.wiki-content .edit-wiki-content .edit{position:absolute;right:3.5rem;top:.4rem}.wiki-content .preview{padding-top:1.8rem}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row,.card-placeholder .placeholder-avatar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.basic-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #e4e4e4;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}.basic-table .row .width-1{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:4;-webkit-flex-grow:4;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:5;-webkit-flex-grow:5;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:7;-webkit-flex-grow:7;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.beta{left:0;position:absolute;top:0;z-index:9999}.button,.button-auth,.button-blackish,.button-bulk,.button-gray,.button-green,.button-red,.trans-button,a.button-gray,a.button-green{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:0 0;border:0;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;padding:.4rem 2rem;text-align:center;text-transform:uppercase;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:middle}.trans-button{font-size:1rem}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button:hover,.trans-button:hover{color:#fff;-webkit-transition:all .2s linear;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.trans-button span{-webkit-animation:loading .5s linear;animation:loading .5s linear}.admin-project-export-result .spin img,.loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.button span,.button-auth span,.button-blackish span,.button-bulk span,.button-gray span,.button-green span,.button-red span,.trans-button span{color:#fff}.button .icon,.button-auth .icon,.button-blackish .icon,.button-bulk .icon,.button-gray .icon,.button-green .icon,.button-red .icon,.trans-button .icon{color:#fff;margin-right:.3rem}.trans-button .icon,.trans-button span{color:#212121;-webkit-transition:color .2s linear;transition:color .2s linear}.trans-button.active .icon,.trans-button.active span,.trans-button:hover .icon,.trans-button:hover span{color:#3f51b5}.trans-button:visited{color:#212121}.submit-button{width:100%}.button-green,a.button-green{background:#3f51b5}.button-green.active,.button-green:hover,a.button-green.active,a.button-green:hover{background:#8c9eff;color:#fff}.button-gray,a.button-gray{background:#757575}.button-gray.active,.button-gray:hover,a.button-gray.active,a.button-gray:hover{background:#8c9eff;color:#fff}.button-blackish{background:#212121;color:#EEE}.button-blackish:hover{background:#212121;color:#fff}.button-red{background:#ff5252}.button-red:hover{background:#f44336;color:#fff}.button-red .icon{color:#fff}.button-block{background:#fff;color:#f44336}.button-block:hover{background:#ff5252;color:#fff}.button-bulk{background:#3f51b5;padding:.35rem .5rem}.button-bulk .icon{margin-right:0}.button-bulk:hover{background:#8c9eff}.button-auth{background:#424242}.button-auth .icon,.button-auth img{font-size:1.2rem;color:#fff;margin-right:.5rem}.button-auth:hover{background:#000}.card-placeholder{background:#e9e9e9;border:1px dashed #dadada;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:flex}.card-placeholder .image{background:#dadada;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.card-placeholder .line{background:#dadada;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{color:#757575;margin:0}.check{background-color:#d5d5d5;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:500px;left:-10px;opacity:0;position:absolute;top:-10px;width:500px;z-index:999}.check input+div{background-color:#757575;height:25px;-webkit-transition:all .2s linear;transition:all .2s linear;width:50%}.check input~.check-text{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff;position:absolute;top:.2rem}.check input~.check-yes{opacity:0;right:.5rem}.check input~.check-no{left:.5rem;opacity:.6}.check input:checked+div{background-color:#8c9eff;margin-left:50%;-webkit-transition:all .2s linear;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.check input:disabled{cursor:auto}.check input:disabled+div{background-color:#BDBDBD}.ticket-created-by{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}@media (max-width:1280px){.ticket-created-by{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:.5rem}}.ticket-created-by .user-avatar{-webkit-flex-basis:2rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-left:.5rem}.ticket-created-by .user-avatar img{width:100%}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#757575;display:block;text-align:right}.ticket-estimation .points-per-role,.wysiwyg-help{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}@media (max-width:1280px){.ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ticket-created-by .created-by{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{text-align:left}}.ticket-created-by .created-by .created-title{color:#3f51b5}.ticket-created-by .created-by .created-date{margin-left:.5rem}@media (max-width:1280px){.ticket-created-by .created-by .created-date{margin-left:0}}.drag-drop-help,.help-button,.help-markdown{font-size:.75rem}.wysiwyg-help{background:#EEE;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:-.5rem;padding:.25rem .5rem}.drag-drop-help{color:#757575}.help-button:hover span,.help-markdown:hover span{-webkit-transition:color .2s linear;transition:color .2s linear}.help-button:hover .icon,.help-markdown:hover .icon{color:#8c9eff;-webkit-transition:color .2s linear;transition:color .2s linear}.help-button .icon,.help-markdown .icon{margin-right:.2rem}.ticket-estimation .popover,.ticket-estimation .popover a,.ticket-estimation .popover.fix,.ticket-estimation .popover.fix a{font-size:.9rem}.ticket-estimation .popover,.ticket-estimation .popover.fix,.ticket-estimation .ticket-role-points .points,.ticket-estimation .ticket-role-points .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .points-per-role{display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.empty-burndown,.loading-bar{-webkit-box-orient:horizontal}.ticket-estimation .ticket-role-points{background:rgba(189,189,189,.2);color:#BDBDBD;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.1rem;min-height:2rem;padding:.5rem 1rem;position:relative;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .ticket-role-points.clickable.active,.ticket-estimation .ticket-role-points.clickable:hover{background:rgba(140,158,255,.9);color:#EEE}.ticket-estimation .ticket-role-points.clickable.active .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable.active .points,.ticket-estimation .ticket-role-points.clickable.active .role,.ticket-estimation .ticket-role-points.clickable:hover .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable:hover .points,.ticket-estimation .ticket-role-points.clickable:hover .role{color:#EEE}.ticket-estimation .ticket-role-points:last-child{background:rgba(26,35,126,.5);border-bottom:0;color:#EEE}.ticket-estimation .ticket-role-points:last-child .icon-arrow-bottom,.ticket-estimation .ticket-role-points:last-child .points,.ticket-estimation .ticket-role-points:last-child .role{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#EEE}.ticket-estimation .ticket-role-points .icon-arrow-bottom{color:#BDBDBD;margin-left:.25rem;vertical-align:middle}.ticket-estimation .ticket-role-points .points{color:#424242}.ticket-estimation .popover{background:#212121;color:#fff;display:none;left:.5rem;list-style-type:none;margin:0;padding:10px;position:absolute;top:100%;width:200px;z-index:99}.ticket-estimation .popover a{border-bottom:1px solid #424242;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#212121;content:'';height:10px;left:10px;position:absolute;top:-5px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:10px}.ticket-estimation .popover li{display:inline-block;width:23%}.ticket-estimation .popover a{display:block;text-align:center}.ticket-estimation .popover a.active,.ticket-estimation .popover a:hover{background:#8c9eff;color:#fff}.ticket-estimation .popover.fix{background:#212121;color:#fff;display:none;left:-160px;list-style-type:none;margin:0;padding:10px;position:absolute;top:100%;width:200px;z-index:99}.ticket-estimation .popover.fix a{border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.ticket-estimation .popover.fix a:last-child{border:0}.ticket-estimation .popover.fix a:hover{color:#8c9eff;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#212121;content:'';height:10px;left:90%;position:absolute;top:-5px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:10px}.single-filter{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;cursor:pointer;display:block;margin-bottom:.5rem;opacity:.5;position:relative}.single-filter:after{clear:both;content:'';display:table}.single-filter.active,.single-filter.selected,.single-filter:hover{color:#424242;opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{background:#d5d5d5;display:block;width:100%}.single-filter .number{background:#bbb;position:absolute;right:0;top:0}.single-filter .icon-delete{color:#424242;position:absolute;right:.5rem;top:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.single-filter .icon-delete:hover{color:#f44336;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task .avatar a,.kanban-task .task-text,.kanban-task-maximized .task-archived p,.kanban-task-maximized .task-points,.kanban-task-minimized .task-archived{font-size:.9rem}.kanban-task-minimized .icon-drag-h{font-size:1rem}.kanban-task .icon-drag-h,.kanban-task .icon-edit{font-size:1.2rem}.kanban-task .task-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.kanban-task{background:#fff8e4;border:1px solid #f1e8cd;box-shadow:none;cursor:move;margin:.2rem;position:relative}.kanban-task:last-child{margin-bottom:0}.kanban-task:hover .icon-drag-h,.kanban-task:hover .icon-edit{color:#cfc29b;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.kanban-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.kanban-task.ui-sortable-placeholder{background:#424242}.kanban-task.blocked{background:#f44336;border:1px solid #ea1c0d;color:#fff}.kanban-task.blocked a,.kanban-task.blocked span{color:#fff}.kanban-task.card-placeholder{background:#e9e9e9;border:3px dashed #dadada;cursor:default}.kanban-task .kanban-tagline{border-color:#f1e8cd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.6rem}.kanban-task .kanban-tag{border-top:.3rem solid #f1e8cd;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.kanban-task .kanban-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.kanban-task .avatar-wrapper{-webkit-flex-basis:55px;-ms-flex-preferred-size:55px;flex-basis:55px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:55px}.kanban-task .avatar-wrapper img{width:100%}.kanban-task .avatar a{text-align:center}.kanban-task .avatar img{margin:0 auto}.kanban-task .avatar img:hover{border:2px solid #3f51b5;-webkit-transition:border .3s linear;transition:border .3s linear}.kanban-task .task-text{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 .5rem 0 .8rem}.kanban-task .task-assigned{color:#cfc29b;display:block}.kanban-task .task-num{color:#424242;margin-right:.3rem}.kanban-task .loading{bottom:.5rem;position:absolute}.kanban-task .icon-drag-h,.kanban-task .icon-edit{color:#f1e8cd;opacity:0;position:absolute;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.kanban-task .icon-drag-h:hover,.kanban-task .icon-edit:hover{color:#e0cd91;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task-maximized .task-archived{background:#e1e1e1;padding:.5rem;text-align:left;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived:hover{background:#dadada;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-maximized .task-archived span{color:#BDBDBD}.kanban-task-maximized .task-archived p{color:#BDBDBD;margin:0}.kanban-task-maximized .task-archived p:last-child{color:#757575;margin:.5rem 0;text-align:center}.kanban-task-maximized .icon-edit,.kanban-task-maximized .loading{bottom:.2rem;right:.5rem}.kanban-task-maximized .icon-drag-h{font-size:2rem;bottom:.2rem;cursor:move;right:45%}.kanban-task-maximized .task-points{color:#e0cd91;margin:0}.kanban-task-maximized .task-points span{display:inline-block}.kanban-task-maximized .task-points span:first-child{padding-right:.2rem}.kanban-task-maximized .task-points .points-text{text-transform:lowercase}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{line-height:1.4;text-transform:none}.kanban-task-maximized .kanban-tag{border-top:.3rem solid}.kanban-task-minimized .kanban-task-inner{padding:0 .3rem}.kanban-task-minimized .task-archived{background:#e1e1e1;padding:.3rem;text-align:left}.kanban-task-minimized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-minimized .task-archived span{color:#BDBDBD}.kanban-task-minimized .task-archived .task-name{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kanban-task-minimized .task-archived p{color:#BDBDBD;margin:0}.kanban-task-minimized .task-archived p:last-child{display:none}.kanban-task-minimized .task-num{vertical-align:top}.kanban-task-minimized .task-name{display:inline-block;overflow:hidden;width:135px}.kanban-task-minimized .task-points{display:none}.kanban-task-minimized .icon-drag-h,.kanban-task-minimized .icon-edit{top:1.4rem}.kanban-task-minimized .icon-edit{bottom:.2rem;right:1rem}.kanban-task-minimized .icon-drag-h{cursor:move;right:.1rem;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.kanban-task-minimized .kanban-tag{border-top:.2rem solid}.level{background-color:#BDBDBD;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project .list-itemtype-track,.list-itemtype-ticket .list-itemtype-track,.list-itemtype-timeline .list-itemtype-track,.list-itemtype-user .extra-info,.list-itemtype-user .list-itemtype-track{font-size:.9rem}.list-itemtype-ticket h2{font-size:1rem}.list-itemtype-project h2,.list-itemtype-user h2,.loader p{font-size:1.2rem}.list-itemtype-project p,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.list-itemtype-project{border-bottom:1px solid #EEE;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{color:#BDBDBD;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-project .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-project .list-itemtype-track-likers,.list-itemtype-project .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-project .icon svg{height:1rem;width:1rem}.list-itemtype-project h2,.list-itemtype-project p{margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-project .list-itemtype-avatar img{width:100%}.list-itemtype-project .list-itemtype-project-data-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;width:3rem}.list-itemtype-project .list-itemtype-project-members,.list-itemtype-project .list-itemtype-project-tags{-webkit-align-self:flex-end;-ms-flex-item-align:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-project .list-itemtype-project-image img{width:100%}.list-itemtype-project .list-itemtype-project-members{align-self:flex-end;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-wrap:wrap-reverse;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse;margin-top:1rem}.list-itemtype-project .list-itemtype-project-members img{border-radius:.1rem;margin-right:.3rem;width:2rem}.list-itemtype-project .list-itemtype-project-tags{align-self:flex-end;display:flex;-webkit-box-flex:3;-webkit-flex:3;-ms-flex:3;flex:3;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:.5rem}.list-itemtype-project .tag{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket h2,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user h2,.list-itemtype-user p{margin-bottom:0}.list-itemtype-ticket,.list-itemtype-timeline,.list-itemtype-user{border-bottom:1px solid #EEE;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track{color:#BDBDBD;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-ticket .list-itemtype-track-likers,.list-itemtype-ticket .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user,.list-itemtype-user .list-itemtype-track{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-ticket .icon svg{height:1rem;width:1rem}.list-itemtype-ticket .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-ticket .list-itemtype-avatar img{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-project{color:#BDBDBD}.list-itemtype-ticket .list-itemtype-ticket-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-id{color:#BDBDBD;margin-right:.3rem}.list-itemtype-ticket .ticket-blocked{color:#f44336;margin-left:.3rem}.list-itemtype-user{display:flex}.list-itemtype-user .list-itemtype-track{color:#BDBDBD;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-user .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-user .list-itemtype-track-likers,.list-itemtype-user .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-user .icon svg{height:1rem;width:1rem}.list-itemtype-user .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .list-itemtype-avatar img{width:100%}.list-itemtype-user .extra-info{margin-top:.25rem}.list-itemtype-timeline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track{color:#BDBDBD;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-timeline .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-timeline .list-itemtype-track-likers,.list-itemtype-timeline .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track-likers .icon,.list-itemtype-timeline .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-timeline .list-itemtype-track-likers.active,.list-itemtype-timeline .list-itemtype-track-watchers.active{color:#3f51b5}.list-itemtype-timeline .icon svg{height:1rem;width:1rem}.list-itemtype-timeline .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-timeline h2{margin-bottom:0}.admin-menu li,.empty-backlog .title,.empty-burndown .title,.sprints-empty .title,.taskboard-table-header .task-colum-name,.ticket-header .detail-status-inner,.ticket-header .ticket-title,.wysiwyg h1,.wysiwyg h2,.wysiwyg h3,tg-project-menu{text-transform:uppercase}.list-itemtype-timeline .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.loader p{color:#757575;text-align:center}.loader{background-color:#fff;bottom:0;display:none;height:100%;left:0;opacity:0;position:fixed;right:0;top:0;z-index:-100}.loader .container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar,.notification-light{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.loading-bar{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:loadBar;animation-name:loadBar;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;background:#757575;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{-webkit-animation-delay:0s;animation-delay:0s;background:#ffc107}.loading-bar .item-1{-webkit-animation-delay:1s;animation-delay:1s;background:#009688}.loading-bar .item-2{-webkit-animation-delay:2s;animation-delay:2s;background:#e91e63}.loading-bar .item-3{-webkit-animation-delay:3s;animation-delay:3s;background:#9c27b0}.loading-bar .item-4{-webkit-animation-delay:4s;animation-delay:4s;background:#cddc39}.loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;-webkit-transform-origin:32 32;transform-origin:32 32}.markItUpHeader ul{background:#EEE;padding:.3rem}.markItUpHeader ul li{display:inline-block;float:none}.markItUpHeader ul li a{opacity:.8}.markItUpHeader ul li a:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.markItUpHeader ul .preview-icon{position:absolute;right:2.5rem}.markItUpContainer{padding:0}.markdown{position:relative}.preview .actions{background:#EEE;margin-top:.5rem;min-height:2rem;padding:.3rem}.notification-light p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.notification-message-success .warning{font-size:1.2rem;color:#fff;line-height:1.2}.notification-message-error .warning{font-size:2rem;color:#fff;line-height:2.4rem}.notification-message-error .icon-notification-error{font-size:3rem;display:inline;vertical-align:sub}.notification-message-error .warning,.notification-message-success .warning{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.notification-message-success{background:rgba(140,158,255,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);opacity:1;right:-370px;top:2%;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{-webkit-animation:animSlide 2s linear both;animation:animSlide 2s linear both;opacity:1}.notification-message-success p{margin:0}@-webkit-keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}.notification-message-error{background:rgba(244,67,54,.9);top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error.inactive{-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-light p,.notification-message-error .text p{margin:0}.notification-message-error .icon-delete{color:#fff;position:absolute;right:1rem;top:1rem}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(189,189,189,.95);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;opacity:0;padding:1rem;position:absolute;top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s;width:100%;z-index:99999}.paginator ul,.summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.notification-light.inactive{opacity:0;-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s}.notification-light.active{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s;transition:all .6s}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{margin-right:1rem;width:2rem}.notification-light .close path{fill:#fff}.notification-message-light-error{background:rgba(244,67,54,.8)}.paginator{margin:2rem 0}.paginator ul{display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator .dots,.paginator a{background:#BDBDBD;color:#fff;padding:.5rem 1rem;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator a:hover{background:#212121;color:#fff;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator .active span{background:#8c9eff}.paginator .dots{background:0 0;color:#BDBDBD}.v-pagination-list{overflow:hidden}.v-pagination-next,.v-pagination-previous{background-color:#757575;color:#EEE;display:block;padding:.1rem 0;text-align:center;visibility:hidden;width:100%}.select-color,.select-color:after{background:#212121;position:absolute}.v-pagination-next:hover,.v-pagination-previous:hover{background-color:#212121;-webkit-transition:background .3s linear;transition:background .3s linear}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.private{display:inline-block;margin-left:.5rem;width:.5rem}.private svg{width:1rem;height:1rem}.private path{fill:#BDBDBD;-webkit-transition:fill .3s linear;transition:fill .3s linear}.select-color,.select-color a{font-size:.9rem}.select-color input{font-size:1rem}.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;border-radius:0 10px 10px 0;padding:15px}.select-color a{border-bottom:1px solid #424242;color:#fff;display:block;padding:10px 2px}.select-color a:last-child{border:0}.select-color a:hover{color:#8c9eff;-webkit-transition:color .3s linear;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:15px}.select-color li{float:left;margin:0 .5rem .5rem 0}.select-color li:nth-child(7n){margin-right:0}.select-color li:nth-last-child(-n+7){margin-bottom:0}.select-color .color{background-color:#BDBDBD;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background-color:#EEE;width:243px}.select-color input::-webkit-input-placeholder{color:#757575}.select-color input::-moz-placeholder{color:#757575}.select-color input:-moz-placeholder{color:#757575}.select-color input:-ms-input-placeholder{color:#757575}.select-color .selected-color{background:#BDBDBD;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.settings-nav .active{background:#fff}.summary .description{font-size:.9rem}.empty-burndown .title{font-size:1.2rem}.empty-burndown,.empty-burndown .title,.summary .description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.empty-burndown a,.summary .number{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.summary{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;padding:1em}.summary .summary-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .data .number{color:#8c9eff}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{line-height:1}.summary .stats{cursor:pointer;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .color-line,.summary .stats:hover .graph{fill:#8c9eff;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats.active .graph,.summary .stats.active svg,.summary .stats:hover svg{fill:#3f51b5}.summary .stats.active .color-line,.summary .stats.active .white-line{display:none}.summary .stats svg{fill:#000;height:100%;max-height:2rem;max-width:2rem;-webkit-transition:all .2s;transition:all .2s;width:100%}.summary .stats .color-line,.summary .stats .graph{fill:#8a8a8a;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats .white-line{fill:#424242}.summary .stats .color-line,.summary .stats .white-line{display:block}.summary-progress-bar{background:#fff;height:30px;margin-bottom:0;margin-right:10px;padding:3px;position:relative;width:15%}.summary-progress-bar .current-progress{background:#8c9eff;height:24px}.summary-progress-bar .defined-points{background:#ff5252;height:24px;position:absolute;width:calc(100% - 6px)}.summary-progress-bar .project-points-progress{background:#fff;height:24px;position:absolute}.summary-progress-bar .closed-points-progress{background:#8c9eff;height:24px;position:absolute}.large-summary{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.large-summary .large-summary-wrapper{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.empty-burndown,.taskboard-task .taskboard-tagline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.large-summary .summary-progress-bar{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.empty-burndown,.upvote-btn{-webkit-align-content:center;-ms-flex-line-pack:center}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats-divider{margin-right:2rem}.large-summary .icon{font-size:1.4rem;margin-right:.4rem}.large-summary .icon.icon-stats{color:#3f51b5;float:right;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#8c9eff;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#8c9eff}.large-summary .icon.icon-stats.active:hover{color:#3f51b5;-webkit-transition:color .3s linear;transition:color .3s linear}.empty-burndown{align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(26,35,126,.15);display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{-webkit-flex-basis:5rem;-ms-flex-preferred-size:5rem;flex-basis:5rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;width:5rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.empty-burndown .title{color:#1a237e;margin:0}.empty-burndown path{fill:#1a237e}.empty-burndown a{-webkit-animation:blink 2s infinite;animation:blink 2s infinite}.graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.wysiwyg,.wysiwyg .codehilite{overflow:auto}.graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;-webkit-transition:none;transition:none}.tag,.tags-block .add-tag-text,.tags-block .tag{font-size:.9rem}.tags-block .icon-plus{font-size:1.2rem}.tag{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:#EEE;border-radius:0 5px 5px 0;color:#424242;display:inline-block;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.tag .icon-delete{color:#BDBDBD;margin-left:1rem}.tag .icon-delete:hover{color:#f44336}.ui-autocomplete{background:#fff;border:1px solid #BDBDBD;z-index:99910}.ui-autocomplete .ui-state-focus{background:#8c9eff}.ui-autocomplete li{cursor:pointer}.ui-helper-hidden-accessible{display:none}.tags-block .tags-container{display:inline-block}.tags-block input{margin-right:.25rem;padding:.4rem;width:14rem}.tags-block input+.icon-floppy{margin-left:.5rem}.tags-block .tag{margin:0 .5rem .5rem 0;padding:.5rem}.tags-block .add-tag{color:#BDBDBD}.tags-block .add-tag:hover{color:#8c9eff}.taskboard-task .task-assigned,.taskboard-task .taskboard-text,.taskboard-task .taskboard-user-avatar a{font-size:.9rem}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit,.taskboard-task .icon-iocaine{font-size:1.2rem}.taskboard-task .task-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name,.watch-options a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.taskboard-task{background:#fff8e4;border:1px solid #f1e8cd;box-shadow:none;cursor:move;margin:.2rem;position:relative}.taskboard-task:hover .icon-drag-h,.taskboard-task:hover .icon-edit{color:#cfc29b;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.taskboard-task.ui-sortable-placeholder{background:#424242}.taskboard-task .blocked{background:#f44336;border:1px solid #ea1c0d;color:#fff}.taskboard-task .blocked a,.taskboard-task .blocked span,.taskboard-task .blocked:hover .icon-drag-h,.taskboard-task .blocked:hover .icon-edit{color:#fff}.taskboard-task.card-placeholder{background:#e9e9e9;border:3px dashed #dadada;cursor:default}.taskboard-task .taskboard-tagline{border-color:#f1e8cd;display:flex;height:.6rem}.taskboard-task .taskboard-tag{border-top:.3rem solid #f1e8cd;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.taskboard-task .taskboard-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.taskboard-task .taskboard-user-avatar{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:55px}.taskboard-task .taskboard-user-avatar a{display:block;text-align:center}.taskboard-task .taskboard-user-avatar img{margin:0 auto}.taskboard-task .taskboard-user-avatar img:hover{border:2px solid #3f51b5;-webkit-transition:border .3s linear;transition:border .3s linear}.taskboard-task .iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.taskboard-task .icon-iocaine{background:#000;border-radius:5px;color:#fff;left:.2rem;padding:.1rem;position:absolute;top:1rem}.taskboard-task .task-assigned{color:#cfc29b;display:block}.taskboard-task .task-assigned:hover{color:#3f51b5}.taskboard-task .task-num{color:#424242;margin-right:.5em}.taskboard-task .taskboard-text{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;padding:0 .5rem 0 1rem;word-wrap:break-word}.taskboard-task .icon{-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task .loading{bottom:.5rem;position:absolute}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit{bottom:.5rem;color:#f1e8cd;opacity:0;position:absolute}.taskboard-task .icon-drag-h:hover,.taskboard-task .icon-edit:hover{color:#cfc29b}.taskboard-task .icon-edit,.taskboard-task .loading{right:1rem}.taskboard-task .icon-drag-h{font-size:2rem;cursor:move;right:45%}.task-drag{box-shadow:1px 1px 15px 6px rgba(0,0,0,.1)}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;position:relative}.track-button .track-inner{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;background:#EEE;border-radius:4px 0 0 4px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;margin-right:.1rem;min-width:140px}.track-button .track-button-counter,.watch-options a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.track-button .track-inner:hover{background:#e1e1e1;-webkit-transition:background .3s;transition:background .3s}.track-button .track-inner span{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.track-button .track-inner .icon-arrow-up{margin-left:auto;padding:0 .5rem;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.track-button:hover{color:#212121}.track-button.active .track-inner{background:rgba(140,158,255,.2)}.track-button.active .track-icon path{fill:#3f51b5}.track-button.watch-container{margin-right:1rem;position:relative}.track-button .track-icon{padding:.3rem .6rem .3rem .75rem}.track-button .track-icon svg{height:1.1rem;position:relative;top:2px;width:1.1rem}.track-button .track-icon path{fill:#424242}.track-button .track-button-counter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #EEE;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;min-width:2rem}.like-button.active.is-hover .track-inner,.watch-button.active.is-hover .track-inner{background:#f44336;color:#EEE;-webkit-transition:background .3s;transition:background .3s}.like-button.active.is-hover path,.watch-button.active.is-hover path{fill:#ff5252}.watch-options{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;background:rgba(0,0,0,.9);border-radius:4px;margin:2.5rem 0 0;min-width:300px;padding:1rem;position:absolute;right:0;top:0;z-index:99}.watch-options.hidden{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse}.watch-options li{margin:0}.assigned-to-list,.ticket-watchers{margin-top:1rem}.watch-options li:last-child a{border:0}.watch-options a{border-bottom:1px solid rgba(189,189,189,.3);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.assigned-to-list .user-list-single,.upvote-btn{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.watch-options a.active{color:#8c9eff}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check path{fill:#8c9eff}.upvote-btn{align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#EEE;color:#BDBDBD;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e1e1e1;color:#1a237e;-webkit-transition:background .3s;transition:background .3s}.upvote-btn a:hover path{fill:#1a237e}.upvote-btn a.active{background:rgba(140,158,255,.2);color:#3f51b5;-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.active path{fill:#3f51b5}.upvote-btn a.is-hover{background:#f44336;color:#EEE}.upvote-btn a.is-hover svg{-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.is-hover path{fill:#ff5252}.upvote-btn svg{height:1rem;width:1rem}.assigned-to-list .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.upvote-btn span{display:block}.upvote-btn path{fill:#BDBDBD}.assigned-to-list .user-list-single{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #EEE;display:flex;padding:.25rem 0;vertical-align:middle}.assigned-to-list .user-list-single:last-child{border:0}.assigned-to-list .user-list-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-name{color:#424242;margin-left:.5rem}.assigned-to-list .user-list-single.selected,.assigned-to-list .user-list-single:hover{background:#fff;cursor:pointer}.assigned-to-list .user-list-single:hover{-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{background:#fff;cursor:pointer;margin-bottom:1rem;position:relative;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.1s;transition-delay:.1s}.assigned-to-list .user-list-single.is-active .icon-delete{opacity:1;position:absolute;right:1rem;top:1.5rem;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .user-list-single{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #EEE;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.25rem 0;vertical-align:middle}.ticket-watchers .user-list-single:last-child{border:0}.ticket-watchers .user-list-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-watchers .user-list-name{color:#424242;margin-left:.5rem;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.ticket-watchers .user-list-single:hover .icon-delete{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .icon-delete{opacity:0;position:absolute;right:.5rem;top:0;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.ticket-watchers .icon-delete:hover{color:#f44336;-webkit-transition:color .3s ease-in;transition:color .3s ease-in}.wysiwyg code,.wysiwyg pre{font-size:.9rem}.wysiwyg h2{font-size:1.2rem}.wysiwyg h1{font-size:2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.wysiwyg h2,.wysiwyg h3{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.wysiwyg{line-height:1.4rem;margin-bottom:2rem;padding:1rem}.wysiwyg h1{line-height:2.5rem}.wysiwyg h2{margin-bottom:.5rem}.wysiwyg ol,.wysiwyg ul{list-style-position:outside;margin-left:1rem}.wysiwyg ul{list-style-type:disc}.wysiwyg dl dt{font-size:1em;margin-top:16px;padding:0}.wysiwyg dl dd{margin-bottom:16px;padding:0 16px}.wysiwyg p,.wysiwyg table{margin-bottom:1rem}.wysiwyg a{color:#3f51b5}.wysiwyg a:hover{color:#8c9eff}.wysiwyg code,.wysiwyg pre{background:#5c5c5c;color:#EEE;direction:ltr;font-family:'courier new',monospace;margin-bottom:1rem;overflow:auto;unicode-bidi:embed;white-space:pre}.admin-functionalities .functionality .title,.admin-membership-table .avatar .name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-membership-table .avatar figcaption span,.admin-submenu ul a span,.admin-submenu-roles .single-role,.admin-webhooks .webhook-url span,.custom-fields-table .custom-description{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wysiwyg pre{line-height:1.4rem;padding:.5rem}.wysiwyg table{border:1px solid #BDBDBD}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#BDBDBD 1px solid}.wysiwyg th{border-right:#BDBDBD 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#BDBDBD 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.wysiwyg textarea{background:#fff;max-height:none}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{color:#b8b8b8;margin-bottom:2rem}.admin-common .total{font-size:1.2rem;background-color:#f5f5f5;color:#444;padding:.3rem 1rem}.admin-common .total:hover .edit-value{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-field-options{margin-bottom:1rem;text-align:right}.custom-fields-table{margin-bottom:2em}.custom-fields-table .row{border-bottom:0;padding:.5rem 0}.custom-fields-table .table-header{border-bottom:3px solid #f5f5f5}.custom-fields-table .table-header .custom-description span,.custom-fields-table .table-header .custom-name span{padding-left:1.1rem}.custom-fields-table .table-body form:last-child .row{border:0}.custom-fields-table .table-body .row:hover{background:rgba(157,206,10,.05);cursor:move;-webkit-transition:background .2s linear;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag-v{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-fields-table .table-body form.row:hover{background:0 0;cursor:default}.custom-fields-table .table-body .custom-description{color:#b8b8b8}.custom-fields-table .single-custom-field{border-bottom:1px solid #f5f5f5;color:#555}.custom-fields-table .icon-drag-v{color:#b8b8b8;opacity:0;padding:0 .1rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .icon-drag-v:hover{color:#555;cursor:move;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{color:#555;margin-right:.5rem}.custom-fields-table .custom-name{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{max-width:100%;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.custom-fields-table .custom-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.admin-functionalities .functionality{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.3rem;margin-right:.3rem;opacity:.5;padding:1rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:top;width:32%}.admin-functionalities .functionality.active{background-color:rgba(114,161,20,.3);opacity:1}.admin-functionalities .functionality .icon{font-size:3rem;-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;margin:0 auto;min-width:60px}.admin-functionalities .functionality .desc{text-align:center;width:100%}.admin-functionalities .functionality .activate-input{display:none}.admin-functionalities .functionality .activate-input+label{color:#fff;cursor:pointer;display:block;text-align:center}.admin-functionalities .functionality .title{display:block}.admin-functionalities .functionality select{margin-top:1rem}.admin-functionalities .videoconference-attributes select{margin-bottom:.5rem}.admin-functionalities .button-green{color:#fff;display:block;text-align:center}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.admin-membership-table .avatar figcaption{margin-left:1rem;width:75%}.admin-membership-table .avatar figcaption span{width:100%}.admin-membership-table .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:35px}.admin-membership-table .avatar .email,.admin-membership-table .avatar .name{display:block;width:100%}.admin-membership-table .avatar .email{color:#b8b8b8}.admin-membership-table .header-role,.admin-membership-table .header-status{padding-left:.5rem}.admin-membership-table .row-role{padding-right:1rem}.admin-membership-table .row-status{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.admin-membership-table .active,.admin-membership-table .resend{padding:.4rem .5rem}.admin-membership-table .active{background-color:#f5f5f5}.admin-membership-table .resend{background-color:#72a114;color:#fff}.admin-membership-table .resend:hover{background-color:#9dce0a;color:#fff;-webkit-transition:background-color .3s linear;transition:background-color .3s linear}.admin-membership-table .delete{font-size:1.2rem;color:#b8b8b8}.admin-membership-table .delete:hover{color:red}.admin-membership-table .pending{color:#ff8282}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-webkit-flex-basis:210px;-ms-flex-preferred-size:210px;flex-basis:210px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.admin-menu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #dcdcdc}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.admin-project-export-result .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;-webkit-transform-origin:32 32;transform-origin:32 32}.project-details .loading-spinner,.ticket-assigned-to .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.admin-project-export-buttons{margin:2rem 0 1rem}.admin-project-export-result{margin-top:1rem}.admin-project-export-result .spin{margin:0 auto;width:2.5rem}.admin-project-export-result .spin img{width:100%}.admin-project-export-result h3{font-size:1.2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin:.5rem;padding:.5rem;text-align:center}.admin-roles .general-category,.admin-roles .role-name,.project-details .looking-for-people,.project-details label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-project-export-result p{color:#b8b8b8;margin:.5rem 0;text-align:center}.project-details .delete-project:hover,.project-details .use-default-image:hover{color:red}.project-details .delete-project,.project-details .private-or-public,.project-details .use-default-image{font-size:.75rem}.project-details .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;border:0;-webkit-transform-origin:center center;transform-origin:center center}.project-details form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-details fieldset{margin-bottom:1rem}.project-details label{display:block;margin-bottom:.2rem}.project-details .project-details-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.project-details .project-details-image .image{width:100%}.project-details .change-image{display:block}.project-details .image-container{position:relative;margin-bottom:.5rem}.project-details .loading-overlay{display:none}.project-details .loading-overlay.active{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.project-details .use-default-image{display:block;margin-top:.25rem;text-align:center}.project-details .project-details-form-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.project-details form{display:block}}.project-details .looking-for-people{border-bottom:1px solid #f5f5f5;border-top:1px solid #f5f5f5;padding:1rem 0}.project-details .looking-for-people-selector{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-details .looking-for-people-selector svg{width:1rem;height:1rem;fill:#b8b8b8;margin-left:.5rem}.project-details .looking-for-people-selector .check{margin-left:auto}.project-details .looking-for-people-reason{display:block;margin-top:1rem}.project-details .looking-for-people-reason.ng-hide-remove-active{-webkit-animation:dropdownFade .3s;animation:dropdownFade .3s}.project-details .looking-for-people-reason.ng-hide-add-active{-webkit-animation:dropdownFade .2s reverse;animation:dropdownFade .2s reverse;-webkit-animation-delay:.1s;animation-delay:.1s}.project-details .delete-project{display:block;margin-top:1rem;text-align:right}.project-details .private-or-public{color:#b8b8b8;margin-bottom:2rem}.project-details .private-or-public svg{width:1.1rem;height:1.1rem;fill:#b8b8b8;margin-right:.5rem;vertical-align:middle}.project-privacy-settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.project-privacy-settings .privacy-option{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-transition:.2 linear;transition:.2 linear}.project-privacy-settings .privacy-option:first-child{margin-right:.5rem}.project-privacy-settings input[type=radio],.project-privacy-settings input[type=text]{display:none}.project-privacy-settings label{background:#f5f5f5;color:#444;text-align:center;-webkit-transition:all .2s linear;transition:all .2s linear}.project-privacy-settings label:hover{background:rgba(157,206,10,.4);color:#444}.project-privacy-settings label:hover svg{fill:#444}.project-privacy-settings label svg{width:1.1rem;height:1.1rem;fill:#444;margin-left:.5rem;vertical-align:middle}.project-privacy-settings .privacy-project:checked+label{background:#9dce0a;color:#fff}.project-privacy-settings .privacy-project:checked+label svg{width:1.1rem;height:1.1rem;fill:#fff}.project-privacy-settings .privacy-project:checked~input[type=text]{display:block}.admin-roles .general-category{font-size:.9rem}.admin-roles .edit-value{font-size:1rem}.admin-roles .role-name{font-size:2rem;color:#444}.admin-roles .edit-value{color:#b8b8b8;cursor:pointer;margin-left:.5rem;opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-roles .edit-role{background-color:#f5f5f5;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .edit-role .icon-floppy{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .edit-role .icon-floppy:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .any-computable-role{background:red;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category .check{margin-left:.5rem}.admin-roles .general-category .check input{height:40px;width:85px}.admin-submenu-roles .single-role{max-width:175px;display:inline-block}.admin-submenu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.admin-contrib .help .alt-image,.admin-contrib .help code,.admin-contrib .select-input-text .help-copy,.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-body span,.admin-webhooks .history-single-response-header a{font-size:.9rem}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#8fa291;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a.active{background:#a3b2a4;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a span{display:block;max-width:85%}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#050505}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child,.admin-webhooks .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body .response-container,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-webhooks .table-header{border-bottom:1px solid #b8b8b8}.admin-webhooks .table-body .webhook-service{color:#555}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #f5f5f5}.admin-webhooks .webhooks-options{margin-bottom:1rem;text-align:right}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.admin-webhooks .webhook-url{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.admin-webhooks .webhook-url span{max-width:65%;color:#b8b8b8;display:inline-block;vertical-align:middle}.admin-contrib .help code,.admin-third-parties .help code{direction:ltr;line-height:1.4rem;unicode-bidi:embed;white-space:pre}.admin-webhooks .webhook-url a{color:#72a114;margin-left:.5rem}.admin-webhooks .webhook-url a:hover{color:#9dce0a}.admin-webhooks .webhook-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;min-width:100px;text-align:center}.admin-webhooks .webhook-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.admin-webhooks .webhook-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .webhooks-history.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #f5f5f5;margin-left:22%}.admin-webhooks .history-single{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(157,206,10,.1);-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single.history-single-open:hover{background:0 0}.admin-webhooks .history-single.history-single-open .icon-arrow-bottom{-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:-webkit-transform .3s linear;transition:-webkit-transform .3s linear;transition:transform .3s linear;transition:transform .3s linear,-webkit-transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s linear;transition:-webkit-transform .3s linear;transition:transform .3s linear;transition:transform .3s linear,-webkit-transform .3s linear}.admin-webhooks .history-response-icon{background:#555;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#9dce0a}.admin-webhooks .history-response-icon.history-error{background:red}.admin-webhooks .history-single-response{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header a,.admin-webhooks .history-single-response-header span:first-child{color:#b8b8b8}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .history-single-request-header .icon,.admin-webhooks .history-single-response-header .icon{margin-right:.3rem;vertical-align:middle}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-response-body .response-container{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin-bottom:.5rem}.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-response-body span{color:#b8b8b8;-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{border:0;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.admin-contrib h2,.admin-contrib label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-contrib .help h3,.admin-contrib .help ol span{font-family:opensans-semibold}.admin-contrib form{margin:1rem 0;max-width:700px;width:100%}.admin-contrib h2{font-size:1.2rem;margin-bottom:0}.admin-contrib fieldset{border-bottom:1px solid #f5f5f5;margin-bottom:1rem;padding-bottom:1rem}.admin-contrib .contrib-input{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.admin-contrib .contrib-test{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:7.5rem;-ms-flex-preferred-size:7.5rem;flex-basis:7.5rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-left:.5rem;text-align:center}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .contrib-form-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-contrib .select-input-text .help-copy{opacity:0}.admin-contrib .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-contrib .check-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0}.admin-contrib .help{margin-top:2rem}.admin-contrib .help h3{margin-bottom:1rem}.admin-contrib .help ol{padding:0 0 0 2rem}.admin-contrib .help .img{margin-bottom:1rem}.admin-contrib .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-contrib .help .code-info{padding-left:1rem}.admin-contrib .help .code-info li{margin-bottom:.5rem}.admin-contrib .help .code-info span{font-family:opensans-semibold}.default-values fieldset{margin-bottom:1rem}.default-values fieldset:last-child{margin-top:1.5rem}.default-values label,.default-values select{display:inline-block;width:49.7%}.default-values a{color:#fff;display:block;text-align:center}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field .icon{margin-right:.3rem}.project-csv .field-with-options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row .icon,.project-values-settings a{font-size:1.2rem}.admin-third-parties .help .alt-image,.admin-third-parties .help code,.admin-third-parties .select-input-text .help-copy,.backlog-table-body .doom-line span,.backlog-table-body .pop-points,.backlog-table-body .pop-points a,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open a,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-body .pop-role,.backlog-table-body .pop-role a,.backlog-table-body .pop-status,.backlog-table-body .pop-status a,.backlog-table-body .row,.backlog-table-body .tags-block .tag,.backlog-table-header .pop-points,.backlog-table-header .pop-points a,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open a,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom a,.backlog-table-header .pop-role,.backlog-table-header .pop-role a,.backlog-table-header .pop-status,.backlog-table-header .pop-status a,.backlog-table-header .row,.login-form-container .forgot-pass,.register-form-container .register-text{font-size:.9rem}.project-values-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{color:#b8b8b8;opacity:0}.project-values-row .icon:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.project-values-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #f5f5f5}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-header .points,.login-form-container .remember-me+label{cursor:pointer}.project-values-body .project-values-row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.project-values-name{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.project-values-value{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{color:#555;margin-right:.5rem}.project-values-settings a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.project-values-settings a:hover .icon-delete{color:red}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.admin-third-parties .help h3,.admin-third-parties .help ol span{font-family:opensans-semibold}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.admin-third-parties fieldset{margin-bottom:1rem}.admin-third-parties label{display:block;margin-bottom:.2rem}.admin-third-parties textarea{height:10rem}.admin-third-parties .submit-button{color:#fff;display:block;text-align:center}.cancel-account p,.change-email-form p,.change-password-text{color:#444;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-third-parties .help{margin-top:2rem}.cancel-account form,.change-email-form form{margin-top:1rem}.admin-third-parties .help h3{margin-bottom:1rem}.admin-third-parties .help ol{padding:0 0 0 2rem}.admin-third-parties .help .img{margin-bottom:1rem}.admin-third-parties .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-third-parties .help .code-info li,.cancel-account p{margin-bottom:.5rem}.admin-third-parties .help .code-info{padding-left:1rem}.admin-third-parties .help .code-info span{font-family:opensans-semibold}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-email-form p{margin-bottom:.5rem}.change-password-form-container .token-change-password{position:relative}.change-password-form-container input:focus+.get-token{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.change-password-form-container .get-token{font-size:.9rem;color:#b8b8b8;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.change-password-form-container .get-token:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.login-form-container .forgot-pass{color:#555;opacity:1;position:absolute;right:1rem;top:.6rem;-webkit-transition:all .3s linear;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.login-form-container .remember-me{vertical-align:top}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin-bottom:1rem;text-align:center}.backlog-table-header .backlog-table-title{font-size:1rem}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a,.empty-backlog .title{font-size:1.2rem}.backlog-table-body .doom-line span{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.backlog-table-body .pop-points,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-body .user-story-name a,.backlog-table-header .pop-points,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-role,.backlog-table-header .pop-status,.empty-backlog{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.backlog-table-body,.backlog-table-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.backlog-table-body.show-tags .tags-block,.backlog-table-header.show-tags .tags-block{display:block}.backlog-table-body .row,.backlog-table-header .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-subtitle:hover,.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-subtitle:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-subtitle .input,.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-subtitle .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-webkit-flex-basis:25px;-ms-flex-preferred-size:25px;flex-basis:25px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .votes,.backlog-table-body .backlog-table-title .votes,.backlog-table-body .row .votes,.backlog-table-header .backlog-table-subtitle .votes,.backlog-table-header .backlog-table-title .votes,.backlog-table-header .row .votes{color:#555;-webkit-flex-basis:65px;-ms-flex-preferred-size:65px;flex-basis:65px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .backlog-table-subtitle .votes.inactive,.backlog-table-body .backlog-table-title .votes.inactive,.backlog-table-body .row .votes.inactive,.backlog-table-header .backlog-table-subtitle .votes.inactive,.backlog-table-header .backlog-table-title .votes.inactive,.backlog-table-header .row .votes.inactive{color:#b8b8b8}.backlog-table-body .backlog-table-subtitle .votes.is-voted,.backlog-table-body .backlog-table-title .votes.is-voted,.backlog-table-body .row .votes.is-voted,.backlog-table-header .backlog-table-subtitle .votes.is-voted,.backlog-table-header .backlog-table-title .votes.is-voted,.backlog-table-header .row .votes.is-voted{color:#9dce0a}.backlog-table-body .backlog-table-subtitle .user-stories,.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-subtitle .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{overflow:hidden;width:100%}.backlog-table-body .backlog-table-subtitle .status,.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-subtitle .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .points,.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-subtitle .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-webkit-flex-basis:125px;-ms-flex-preferred-size:125px;flex-basis:125px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .points,.backlog-table-body .status,.backlog-table-header .points,.backlog-table-header .status{position:relative;text-align:right}.backlog-table-body .points .popover a,.backlog-table-body .status .popover a,.backlog-table-header .points .popover a,.backlog-table-header .status .popover a{text-align:left;width:100%}.backlog-table-body .points .popover .point,.backlog-table-body .status .popover .point,.backlog-table-header .points .popover .point,.backlog-table-header .status .popover .point,.empty-backlog,.sprints .loading,.sprints .sprint-table .sprint-empty{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{color:#b8b8b8;margin-left:.2rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-status a:last-child,.backlog-table-header .pop-status a:last-child{border:0}.backlog-table-body .pop-status a:hover,.backlog-table-header .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-status a:hover.point,.backlog-table-header .pop-status a:hover.point{color:#fff}.backlog-table-body .pop-status:after,.backlog-table-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-status.fix,.backlog-table-header .pop-status.fix{bottom:0;top:auto}.backlog-table-body .pop-role,.backlog-table-header .pop-role{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-role a:last-child,.backlog-table-header .pop-role a:last-child{border:0}.backlog-table-body .pop-role a:hover,.backlog-table-header .pop-role a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-role a:hover.point,.backlog-table-header .pop-role a:hover.point{color:#fff}.backlog-table-body .pop-role:after,.backlog-table-header .pop-role:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#9dce0a;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{background:#050505;bottom:10px;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px 3rem 10px 10px;position:absolute;width:150px;z-index:99}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points a:last-child,.backlog-table-header .pop-points a:last-child{border:0}.backlog-table-body .pop-points a:hover,.backlog-table-header .pop-points a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points a:hover.point,.backlog-table-header .pop-points a:hover.point{color:#fff}.backlog-table-body .pop-points:after,.backlog-table-header .pop-points:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{border-bottom:1px solid #444;color:#fff;padding:10px 2px}.backlog-table-body .pop-points-open a:last-child,.backlog-table-header .pop-points-open a:last-child{border:0}.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open a:hover.point,.backlog-table-header .pop-points-open a:hover.point{color:#fff}.backlog-table-body .pop-points-open:after,.backlog-table-header .pop-points-open:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{background:#050505;bottom:0;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:auto;width:200px;z-index:99}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open.pop-bottom a:last-child,.backlog-table-header .pop-points-open.pop-bottom a:last-child{border:0}.backlog-table-body .pop-points-open.pop-bottom a:hover,.backlog-table-header .pop-points-open.pop-bottom a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open.pop-bottom a:hover.point,.backlog-table-header .pop-points-open.pop-bottom a:hover.point{color:#fff}.backlog-table-body .pop-points-open.pop-bottom:after,.backlog-table-header .pop-points-open.pop-bottom:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open li,.backlog-table-header .pop-points-open li{display:inline-block;width:23%}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{display:block;text-align:center}.backlog-table-body .user-story-name,.sprints .sprint-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-table-body .pop-points-open a.active,.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a.active,.backlog-table-header .pop-points-open a:hover{background:#9dce0a;color:#fff}.backlog-table-header .backlog-table-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:2px solid #b8b8b8;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:30px}.backlog-table-header .header-points span{color:#b8b8b8}.backlog-table-body .row{border-bottom:1px solid #ebebeb;cursor:move;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag-v,.backlog-table-body .row:hover .us-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .is-checked,.backlog-table-body .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body input:checked{color:#9dce0a;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.backlog-table-body .user-story-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{display:inline-block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.backlog-table-body .user-story-name span{line-height:1.5}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff8282;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:red;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .blocked a{color:#fff!important}.backlog-table-body .blocked .icon,.backlog-table-body .blocked .icon:hover,.backlog-table-body .blocked a:hover{color:#fff}.backlog-table-body .doom-line{background:red;margin:.2rem 0;padding:.6rem 0;position:relative;width:100%}.backlog-table-body .doom-line span{color:#fff;position:absolute;right:.5rem;top:-3px}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;width:30px}.backlog-table-body .icon-drag-v:hover,.backlog-table-body .us-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .us-settings{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 0 0 2rem;opacity:0}.backlog-table-body .icon-drag-v{cursor:move;opacity:0;padding:.1rem .5rem 0 0}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.empty-backlog{padding:2rem}.empty-backlog img{margin-bottom:1rem}.empty-backlog .title{margin-bottom:.5rem}.empty-backlog a{color:#72a114}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint .description{font-size:.75rem}.sprints .filter-closed-sprints,.sprints .sprint-table .column-us,.sprints .us-item-row .user-story-name{font-size:.9rem}.sprints .sprint .number,.sprints .sprint .sprint-date,.sprints .sprint-name a,.sprints-empty .title{font-size:1.2rem}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint-header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#72a114;padding:.25rem .25rem 0;-webkit-transition:background .2s;transition:background .2s}.sprints .add-sprint:hover{background:#9dce0a}.sprints .add-sprint svg{height:1.4rem;max-height:1.4rem;max-width:1.5rem;width:1.5rem}.sprints .add-sprint path{fill:#f5f5f5}.sprints .filter-closed-sprints{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading-spinner{border:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;-webkit-transform-origin:center center;transform-origin:center center}.sprints .sprint-name a{max-width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;margin-right:3px}.sprints .sprint{margin-bottom:2rem;overflow:hidden}.sprints .sprint header{position:relative}.sprints .sprint:hover .icon-edit{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.sprints .sprint .icon{display:inline-block}.sprints .sprint .icon-arrow-up{-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:baseline}.sprints .sprint .icon-arrow-up.active{-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.sprints .sprint .icon-arrow-up:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.sprints .sprint .icon-edit{color:#b8b8b8;opacity:0;position:absolute;right:0;top:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;vertical-align:baseline}.sprints .sprint .icon-edit:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.sprints .sprint .description{line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{color:#b8b8b8;-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1}.sprints .sprint .sprint-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.sprints .sprint ul{margin:0}.sprints .sprint li{display:inline-block}.sprints .sprint li:first-child{margin-right:3px}.sprints .sprint-progress-bar{background:#b8b8b8;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#72a114;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table .sprint-empty{background:#e6e6e6;border:2px dashed #d2d2d2;color:#555;padding:1rem}.sprints .sprint-table .row{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:#d7d7d7;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .row.readonly,.taskboard-table .taskboard-task.readonly{cursor:auto}.sprints .sprint-table .row:last-child{border-bottom:0}.sprints .sprint-table .row.sortable-placeholder{background:#d7d7d7;height:40px}.sprints .sprint-table .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .column-us{-webkit-flex-flow:3;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{max-width:230px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.sprints .sprint-table .us-name.closed{color:#c5c5c5}.sprints .sprint-table .us-name.blocked{color:red}.sprints .sprint-table .column-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#c5c5c5}.sprints .sprint-table .column-points.blocked{color:red}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.sprints .us-item-row .icon-drag-v,.sprints .us-item-row .popover,.sprints .us-item-row .status,.sprints .us-item-row .tags-block,.sprints .us-item-row .us-settings,.sprints .us-item-row input,.taskboard-table-body .column-fold .taskboard-task .icon,.taskboard-table-body .column-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .column-fold .taskboard-task .taskboard-text,.taskboard-table-body .row-fold .taskboard-task .icon,.taskboard-table-body .row-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .row-fold .taskboard-task .taskboard-text{display:none}.sprints .us-item-row .user-story-name{line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#b8b8b8}.sprint-closed .sprint-progress-bar .current-progress{background:#9f9f9f}.sprint-closed .button-gray{background:#b8b8b8}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{margin-bottom:.5rem}.sprints-empty a{color:#72a114}.taskboard-userstory-box .points-value{font-size:.9rem}.taskboard-table-header .task-colum-name,.taskboard-table-header .task-colum-name .icon{font-size:1rem}.taskboard-table-body .column-fold .taskboard-task,.taskboard-table-body .row-fold .taskboard-task{background:0 0;border:0;margin:0;min-height:0}.category-config,.ticket-assigned-to{border-bottom:1px solid #b8b8b8}.category-config:first-child,.ticket-assigned-to{border-top:1px solid #b8b8b8}.taskboard-table-body .column-fold .taskboard-task .taskboard-task-inner,.taskboard-table-body .row-fold .taskboard-task .taskboard-task-inner{padding:.2rem}.taskboard-table-body .column-fold .taskboard-task .avatar,.taskboard-table-body .row-fold .taskboard-task .avatar{height:35px;width:35px}.taskboard-table-body .column-fold .taskboard-task.ui-sortable-helper,.taskboard-table-body .row-fold .taskboard-task.ui-sortable-helper{box-shadow:none}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .row-fold .task-column,.taskboard-table-body .task-column.column-fold,.taskboard-table-body .task-column.row-fold{-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .column-fold .avatar-task-link,.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table,.taskboard-table-header .taskboard-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;overflow:hidden}.taskboard-table{display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;width:100%}.taskboard-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:flex;position:absolute}.taskboard-table-header .task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-header .task-colum-name .icon:hover{color:#72a114}.taskboard-table-header .task-colum-name .icon.hfold,.taskboard-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.taskboard-table-header .task-colum-name.column-fold{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.3rem 0}.taskboard-table-header .task-colum-name.column-fold span{display:none}.taskboard-table-header .task-colum-name.column-fold .hfold,.taskboard-table-header .task-colum-name.column-fold .hunfold{margin:0}.taskboard-table-body{height:100%;overflow:auto;width:100%}.taskboard-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;width:300px}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .column-fold .taskboard-task{max-width:40px;width:40px}.taskboard-table-body .task-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;min-height:10rem;width:100%}.taskboard-table-body .avatar-task-link,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .icon-plus,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .task-row:hover .new-task{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(255,0,0,.6)}.taskboard-table-body .task-row.blocked .points-value,.taskboard-table-body .task-row.blocked .points-value:hover,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a:hover{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(255,0,0,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-table-body .taskboard-userstory-box .icon{color:#b8b8b8;position:absolute;right:.5rem;top:.7rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-body .taskboard-userstory-box .icon:hover{color:#72a114}.taskboard-table-body .taskboard-userstory-box .icon.icon-plus{right:2rem}.taskboard-table-body .taskboard-userstory-box .icon.icon-vfold,.taskboard-table-body .taskboard-userstory-box .icon.icon-vunfold{left:0;right:inherit}.taskboard-table-body .avatar-assigned-to{display:block}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .tag-list{display:none;margin-bottom:1rem}.taskboard-userstory-box .us-title{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{color:#b8b8b8}.taskboard-userstory-box .points-value span{margin-right:.1rem}.points-list a{color:#72a114;margin-left:.5rem}.points-list a:hover span{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.points-list span{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.ticket-assigned-to{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:1rem 0;position:relative}.ticket-assigned-to:hover .assigned-to .icon-delete{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;-webkit-transform-origin:32 32;transform-origin:32 32;margin:1rem auto;max-height:2rem;max-width:2rem}.filters-inner .loading .loading-spinner,.lightbox-generic-loading .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.ticket-assigned-to .user-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;position:relative}.ticket-assigned-to .user-avatar img{width:100%}.ticket-assigned-to .user-avatar.is-iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.ticket-assigned-to .user-avatar .iocaine-symbol{left:-.5rem;position:absolute;top:-.75rem;z-index:9}.ticket-assigned-to .user-avatar .iocaine-symbol svg{background:#444;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.ticket-assigned-to .assigned-to{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-to .assigned-to .assigned-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block;margin:.2rem 0 .25rem}.ticket-assigned-to .assigned-to .assigned-to-options{display:inline-block}.category-config .category-item,.category-config .resume{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.ticket-assigned-to .assigned-to .icon-delete{color:#b8b8b8;opacity:0;position:absolute;right:0;top:2rem}.ticket-assigned-to .assigned-to .icon-delete:hover{color:red}.ticket-assigned-to .assign-to-me,.ticket-assigned-to .user-assigned{cursor:default}.ticket-assigned-to .assign-to-me:hover,.ticket-assigned-to .user-assigned:hover{color:currentColor}.ticket-assigned-to .assign-to-me.editable,.ticket-assigned-to .user-assigned.editable{color:#72a114}.ticket-assigned-to .assign-to-me.editable:hover,.ticket-assigned-to .user-assigned.editable:hover{cursor:pointer}.ticket-assigned-to .assign-to-me .icon,.ticket-assigned-to .user-assigned .icon{vertical-align:middle}.ticket-assigned-to .assign-to-me>span,.ticket-assigned-to .user-assigned>span{max-width:80%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-config .resume{-webkit-box-align:space-between;-webkit-align-items:space-between;-ms-flex-align:space-between;align-items:space-between;cursor:pointer;display:flex;padding:1rem;position:relative}.category-config .resume-title{width:280px}.category-config .count{color:#b8b8b8;float:left;padding-right:5px}.category-config .summary-role{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#b8b8b8;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#72a114}.category-config .summary-role .role-summary-single.inactive{background:#555}.category-config .icon{font-size:2rem;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;text-align:right}.category-config .category-items{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden;background-color:#f5f5f5;width:100%}.category-config .category-items.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.colors-table .row,.duty-custom-fields .custom-fields-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #f5f5f5}.colors-table .icon,.colors-table .icon-check-square{font-size:1.2rem}.colors-table .table-header:hover{background:0 0}.colors-table .table-header .row{padding-left:50px}.colors-table form:last-child .row{border:0}.colors-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.colors-table .row.edition .current-color,.duty-custom-fields form label{cursor:pointer}.colors-table .row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.colors-table .row:last-child{border:0}.colors-table .row.edition,.colors-table .row.new-value{padding-left:50px}.colors-table .row.hidden{display:none}.colors-table .row .color-column{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100px;position:relative}.colors-table .row .is-archived-column,.colors-table .row .is-closed-column,.colors-table .row .options-column,.colors-table .row .status-wip-limit{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.colors-table .row .status-name{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px;position:relative}.colors-table .row .status-name span{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.duty-custom-fields .custom-field-value.js-value-view-mode,.lightbox-generic-ask .subtitle{white-space:pre-line}.colors-table .row .status-slug{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px}.colors-table .row .options-column{max-width:100px;opacity:0;text-align:right}.colors-table .row .is-archived-column{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row .is-closed-column{max-width:130px;text-align:center}.colors-table .row .status-wip-limit{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#b8b8b8;border-radius:2px;height:40px;width:40px}.activity-single .activity-user img,.duty-custom-fields form input{width:100%}.colors-table .icon{color:#b8b8b8;margin-right:1rem;opacity:0}.colors-table .icon.icon-check-square,.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.colors-table .icon:hover{color:#72a114;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.colors-table .icon-delete:hover{color:red}.colors-table .icon-check-square{color:#72a114}.duty-custom-fields .custom-field-data .custom-field-description{font-size:.9rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom{font-size:1.2rem;cursor:pointer;-webkit-transform:rotate(-90deg);transform:rotate(-90deg);-webkit-transition:-webkit-transform .2s linear;transition:-webkit-transform .2s linear;transition:transform .2s linear;transition:transform .2s linear,-webkit-transform .2s linear}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields{margin-bottom:2rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom.open{-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .2s linear;transition:-webkit-transform .2s linear;transition:transform .2s linear;transition:transform .2s linear,-webkit-transform .2s linear}.duty-custom-fields .custom-fields-body{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.duty-custom-fields .custom-fields-body.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.duty-custom-fields .custom-field-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;padding:1rem}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-single .custom-field-options{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-custom-fields .custom-field-single .custom-field-options a{color:#b8b8b8}.duty-custom-fields .custom-field-single .custom-field-options a:hover{color:#72a114}.duty-custom-fields .custom-field-data{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px}.duty-custom-fields .custom-field-data .custom-field-name{display:block}.duty-custom-fields .custom-field-data .custom-field-description{color:#888;display:block;line-height:.9rem}.duty-custom-fields .custom-field-options{margin:0}.duty-custom-fields .custom-field-value{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff8282}.external-reference{font-size:.9rem;color:#b8b8b8;margin-top:.5rem}.external-reference a{border-left:1px solid #b8b8b8;padding:0 .2rem;-webkit-transition:color .3s linear;transition:color .3s linear}.external-reference a:hover{color:#72a114}.external-reference a:first-child{border:0}.activity-single .comment-restore,.activity-single .date,.activity-single .deleted-comment,.activity-single.deleted-comment,.change-entry .activity-fromto,.more-activity,.more-comments,.show-more-comments{font-size:.9rem}.activity-single .deleted-comment .comment-body p,.activity-single.deleted-comment .comment-body p{font-size:1rem}.history-tabs{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.change-entry .activity-changed{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.history{margin-bottom:1rem}.changes-title{display:block;padding:.5rem}.changes-title:hover .icon{color:#72a114;-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.changes-title .icon{color:#444;float:right;-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:all .2s linear;transition:all .2s linear}.main-nav a:hover .helper::after,.related-tasks-body .pop-status:after{-webkit-transform:rotate(45deg);content:''}.change-entry{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.change-entry:last-child{border-bottom:0}.change-entry .activity-changed,.change-entry .activity-fromto{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.history-tabs{border-bottom:3px solid #b8b8b8;margin-bottom:0;padding:.5rem 0}.history-tabs li{font-size:1.2rem;display:inline-block}.history-tabs li:first-child{border-right:1px solid #b8b8b8}.history-tabs a{color:#b8b8b8;padding:0 2rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs a.active{color:#444}.history-tabs a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs .icon{margin-right:.5rem}.add-comment .in-progress{cursor:progress}.add-comment:after{clear:both;content:'';display:table}.add-comment.active .button-green{display:block;margin-top:.5rem}.add-comment.active textarea{height:6rem;-webkit-transition:height .3s ease-in;transition:height .3s ease-in}.add-comment.active .help-markdown{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.add-comment.active .preview-icon{opacity:1;position:absolute;right:1rem}.add-comment .help-markdown,.add-comment .preview-icon,.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave.ng-leave-active:last-child{opacity:0}.add-comment textarea{background:#fff;height:5rem;min-height:41px}.add-comment .save-comment{color:#fff;float:right}.add-comment .button-green{display:none}.more-comments,.show-more-comments{color:#b8b8b8;display:block;border-bottom:1px solid #b8b8b8}.add-comment .edit,.add-comment .preview-icon{position:absolute;right:1rem}.show-more-comments{border-top:1px solid #b8b8b8;padding:1rem 0 1rem 1rem}.show-more-comments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.more-comments{padding:1rem}.more-comments .prev-comments-num{color:#72a114;margin-left:.5rem}.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{-webkit-transition:all .3s ease-in;transition:all .3s ease-in}.comment-list.activeanimation .comment-single.ng-enter.ng-enter-active:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{opacity:1}.activity-single{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:2rem 0;position:relative}.activity-single:hover .comment-delete,.activity-single:hover .comment-restore{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.activity-single:first-child{margin-top:0}.activity-single:last-child{border-bottom:0}.activity-single .deleted-comment,.activity-single.deleted-comment{color:#b8b8b8;padding:.5rem}.activity-single .deleted-comment a,.activity-single.deleted-comment a{color:#b8b8b8;margin-left:.3rem}.activity-single .deleted-comment a:hover,.activity-single.deleted-comment a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .deleted-comment img,.activity-single.deleted-comment img{-webkit-filter:grayscale(100%);filter:grayscale(100%);opacity:.5}.activity-single .deleted-comment .comment-body,.activity-single.deleted-comment .comment-body{display:none;margin:.2rem 0 .5rem}.activity-single .activity-username,.activity-single .username{margin-bottom:.5rem;color:#72a114}.activity-single .comment-restore{color:#b8b8b8;position:absolute;right:0;top:.4rem}.activity-single .comment-restore .icon{vertical-align:baseline}.activity-single .comment-restore:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .activity-user{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.activity-single .activity-content{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:calc(100% - 80px)}.activity-single .changes{background:#f5f5f5}.activity-single .changes .change-entry{display:none}.activity-single .changes .change-entry.active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.activity-single .date{color:#b8b8b8;margin-left:1rem}.activity-single .wysiwyg{margin-bottom:0}.activity-single .comment-delete{color:red;opacity:0;position:absolute;right:0;top:2rem;-webkit-transition:all .2s linear;transition:all .2s linear}.activity-single .comment-delete:hover{color:#ff8282;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single.activity .change-entry{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.more-activity{border-bottom:1px solid #b8b8b8;color:#b8b8b8;display:block;padding:1rem}.more-activity .prev-activity-num{color:#72a114;margin-left:.5rem}.lightbox{background:rgba(255,255,255,.98);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox-generic-form label{font-size:.75rem}.lightbox-add-member .help-text,.lightbox-delete-account .newsletter input+label,.lightbox-sprint-add-edit .delete-sprint,.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem}.lightbox-select-user .more-watchers{font-size:1rem}.lightbox-add-member .add-member-wrapper .icon-delete,.lightbox-add-member .icon,.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-size:1.2rem}.lightbox h2{font-size:1.6rem}.lightbox .close,.lightbox-add-member .icon-delete{font-size:2rem}.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress,.lightbox-select-user .more-watchers{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.lightbox h2,.lightbox-delete-account .newsletter input+label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox .close{color:#555;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.lightbox-add-member .add-member-wrapper fieldset,.lightbox-generic-form fieldset{position:relative}.lightbox-add-member .checksley-error-list,.lightbox-generic-form .attachment-delete{right:.5rem}.lightbox .close:hover{color:#72a114}.open.lightbox{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.lightbox{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox-generic-loading .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32}.lightbox-generic-form form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form textarea{min-height:4.5rem;resize:vertical}.lightbox-generic-form label{background:#f5f5f5;border:1px solid #b8b8b8;color:#444;cursor:pointer;display:block;padding:7px 30px;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#444;vertical-align:middle}.lightbox-generic-form .settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-add-member .button,.lightbox-add-member .extra-text{margin-top:1rem}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#9dce0a;border:1px solid #72a114}.lightbox-generic-form .settings .blocked:hover{background:#ff8282;border:1px solid red}.lightbox-generic-form .settings .client-requirement input:checked+label,.lightbox-generic-form .settings .iocaine-flag input:checked+label,.lightbox-generic-form .settings .team-requirement input:checked+label{background:#72a114;border:1px solid #72a114;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:red;border:1px solid red;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-form .attachments{margin-bottom:0}.lightbox-generic-form .attachment-body{max-height:7.5rem;overflow-y:auto}.lightbox-generic-form .attachment-delete svg{fill:#b8b8b8;height:1.25rem;width:1.25rem}.lightbox-generic-form .attachment-delete:hover svg{fill:red}.lightbox-generic-bulk form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-search form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-search fieldset{margin-bottom:1rem}.lightbox-add-member .add-member-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.lightbox-add-member .add-member-wrapper:last-child,.lightbox-add-member fieldset{margin-bottom:0}.lightbox-add-member .add-member-wrapper fieldset:first-child{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.lightbox-add-member .add-member-wrapper fieldset:last-child{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.lightbox-add-member select{width:80%}.lightbox-add-member .icon{margin-left:.5rem}.lightbox-add-member .icon-delete:hover{color:red}.lightbox-add-member .help-text{padding:.5rem 1rem}.lightbox-add-member .checksley-error-list li{display:none}.lightbox-add-member .checksley-error-list li:first-child{display:block}.lightbox-sprint-add-edit form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{color:#555;opacity:1;position:absolute;right:1rem;top:.7rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-sprint-add-edit .dates div{float:left;margin-right:1%;position:relative;width:49%}.lightbox-sprint-add-edit .dates div:last-child{margin:0;width:50%}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint{color:#444;display:block;margin-top:1rem;text-align:right}.lightbox-sprint-add-edit .delete-sprint a{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-sprint-add-edit .delete-sprint a:hover{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-generic-ask form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:420px}.lightbox-generic-ask .message,.lightbox-generic-ask .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-generic-ask .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-generic-ask .options a{padding:8px 0;text-align:center;width:100%}.lightbox-ask-choice{text-align:center}.lightbox-ask-choice form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.lightbox-ask-choice .question,.lightbox-ask-choice .subtitle{display:block;line-height:1.5rem;text-align:center}.lightbox-ask-choice .replacement,.lightbox-ask-choice .replacement span{display:block}.lightbox-ask-choice .choices{margin-bottom:2rem}.lightbox-ask-choice .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-account form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-account .question,.lightbox-delete-account .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-account .newsletter{margin:1rem 0;text-align:center}.lightbox-delete-account .newsletter input,.lightbox-delete-account .options a:first-child,.lightbox-delete-project .options a:first-child{margin-right:.5rem}.lightbox-delete-account .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-project .question,.lightbox-delete-project .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-project .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-delete-project .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-generic-error section,.lightbox-generic-loading section,.lightbox-generic-success section{-webkit-flex-basis:500px;-ms-flex-preferred-size:500px;flex-basis:500px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:500px}.lightbox-generic-error h2,.lightbox-generic-loading h2,.lightbox-generic-success h2{line-height:2rem}.lightbox-generic-error p,.lightbox-generic-loading p,.lightbox-generic-success p{text-align:center}.lightbox-generic-loading .spin{margin:1rem auto;width:5rem}.lightbox-generic-loading .spin img{max-height:100%;max-width:100%;width:100%}.lightbox-generic-loading .progress-bar-wrapper{background:#e8e8e8;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#9dce0a;height:24px;position:absolute;-webkit-transition:width .1s linear;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#e8e8e8;bottom:35px;color:#555;padding:.3rem;position:absolute;-webkit-transition:left .1s linear;transition:left .1s linear}.lightbox-create-issue form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row fieldset{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem;width:30%}.lightbox-create-issue .fieldset-row fieldset:last-child{margin:0}.lightbox-block textarea,.lightbox-create-issue textarea{margin-bottom:1rem;max-height:12rem;min-height:8rem}.lightbox-block .form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-select-user .form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single.selected,.lightbox-select-user .user-list-single:hover{background:#f3fbe1;cursor:pointer}.lightbox-select-user .user-list-single:hover{-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.lightbox-select-user .more-watchers{padding:.5rem;text-align:center}.lb-create-edit-userstory .points-per-role{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0}.featured-project .project-card-inner,.highlighted .highlighted-projects-container,.highlighted .most-active,.highlighted .most-liked,.kanban-table,.wiki-summary .wiki-user-modification{-webkit-box-orient:vertical;-webkit-box-direction:normal}.lb-create-edit-userstory .ticket-role-points{margin:.1rem;min-width:20%}.lb-create-edit-userstory .ticket-role-points:first-child{margin-left:0}.lb-create-edit-userstory .ticket-role-points:nth-child(4n+4){margin-right:0}.lb-create-edit-userstory .ticket-role-points:last-child{margin:.1rem 0;min-width:100%}.main-nav a:hover .helper{font-size:.9rem}.main-nav .item{font-size:1.2rem}tg-project-menu{background-position:0 -300px;display:inline-block;min-height:95%;min-width:50px;padding:1rem 0;position:relative;z-index:9}.main-nav a,.main-nav span{display:block}tg-project-menu .menu.menu-fixed{position:fixed;top:1rem}.main-nav{list-style:none;padding:0;position:relative;text-align:center}.related-tasks-body .row,.related-tasks-body .status{text-align:left;position:relative}.main-nav a{color:#fff;padding:.75rem .8rem;position:relative}.main-nav a:hover{background:rgba(0,0,0,.2);color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.main-nav a:hover .helper{-webkit-animation:slideLeft .2s ease-in-out both;animation:slideLeft .2s ease-in-out both;background:-webkit-linear-gradient(left,#000 0,rgba(0,0,0,.8) 100%);background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;padding:.4rem 1rem;position:absolute;top:calc(50% - 1rem);-webkit-transition:all .2s;transition:all .2s;white-space:nowrap;z-index:99}.main-nav a:hover .helper::after{background:#050505;height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);transform:rotate(45deg);width:12px;z-index:98}.main-nav svg{height:1.5rem;width:1.5rem}.main-nav svg path{opacity:1}.main-nav .helper{display:none}.main-nav .icon{font-size:1.5rem;line-height:2.2rem}.main-nav .active{background:rgba(0,0,0,.2);color:#9dce0a}.main-nav .active svg path{fill:#9dce0a;opacity:1}@-webkit-keyframes slideLeft{0%{opacity:0}100%{opacity:1}}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.related-tasks-body .pop-status,.related-tasks-body .pop-status a,.related-tasks-body .row{font-size:.9rem}.related-tasks-body .task-name input,.related-tasks-header .related-tasks-title{font-size:1rem}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine,.related-tasks-body .task-settings a{font-size:1.2rem}.related-tasks-body .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.related-tasks-header .related-tasks-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-tasks{margin-bottom:2rem;position:relative}.related-tasks-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-tasks-header .add-button{background:#444;border:0;display:inline-block;padding:.5rem;-webkit-transition:background .25s;transition:background .25s}.related-tasks-header .add-button.is-active,.related-tasks-header .add-button:hover{background:#9dce0a}.related-tasks-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-tasks-body{width:100%}.related-tasks-body .row{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.5rem 0 .5rem .5rem;width:100%}.related-tasks-body .row:hover{background:0 0}.related-tasks-body .row:hover .task-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .row:last-child{border:0}.related-tasks-body .row .tasks{overflow:hidden;width:100%}.related-tasks-body .row .status{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100px}.related-tasks-body .row .assigned-to{cursor:pointer;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.related-tasks-body .related-task-create-form{padding:0}.related-tasks-body .related-task-create-form.active{padding:.5rem 0 .5rem .5rem}.related-tasks-body .status:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.related-tasks-body .status .not-clickable:hover{color:#444}.related-tasks-body .status .popover a{text-align:left;width:100%}.related-tasks-body .status .popover .point{text-align:center}.related-tasks-body .status .icon{color:#b8b8b8;margin-left:.2rem;opacity:0}.related-tasks-body .pop-status{background:#050505;color:#fff;display:none;left:40%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.related-tasks-body .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.related-tasks-body .avatar,.related-tasks-body .task-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.related-tasks-body .blocked .icon,.related-tasks-body .blocked .icon:hover,.related-tasks-body .blocked a,.related-tasks-body .blocked a:hover,.related-tasks-body .blocked:hover .icon,.related-tasks-body .blocked:hover .icon:hover,.related-tasks-body .blocked:hover a,.related-tasks-body .blocked:hover a:hover,.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#050505;height:15px;position:absolute;transform:rotate(45deg);width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .task-name{display:flex;position:relative}.related-tasks-body .task-name a{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-name input{margin-right:1rem;padding:3px;width:85%}.related-tasks-body .task-name.loading{margin:0;padding:8px;text-align:center;width:100%}.related-tasks-body .task-name.loading span{-webkit-animation:loading .5s linear,spin 1s linear infinite;animation:loading .5s linear,spin 1s linear infinite}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:#ff8282;color:#fff}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .iocaine,.related-tasks-body .iocaine:hover{background:rgba(157,206,10,.3)}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine{display:inline-block;margin-right:.5rem;vertical-align:top}.related-tasks-body .task-settings{margin:0 0 0 2rem;opacity:0;position:absolute;right:0;top:0;width:10%}.related-tasks-body .task-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .task-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .assigned-to{position:relative;text-align:left}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .task-assignedto figcaption{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-assignedto .icon{opacity:0;position:absolute;right:.5rem;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex}.related-tasks-body .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-data-container,.ticket-header .detail-status,.ticket-header .pop-status,.ticket-header .pop-status a,.ticket-status .priority-data .pop-priority,.ticket-status .priority-data .pop-priority a,.ticket-status .severity-data .pop-severity,.ticket-status .severity-data .pop-severity a,.ticket-status .type-data .pop-type,.ticket-status .type-data .pop-type a,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-size:.9rem}.ticket-header .ticket-title{font-size:1.6rem;vertical-align:sub}.ticket-header .pop-status,.ticket-header .ticket-title,.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .type-data .pop-type,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-header{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1.5rem 0 2rem;position:relative}.ticket-header .detail-status{display:inline-block;margin-left:.25rem;position:relative}.ticket-header .detail-status .icon-arrow-bottom{margin-left:.25rem}.ticket-header .detail-status-inner{color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.15rem .25rem}.ticket-header .pop-status{background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;position:absolute;top:1.25rem;width:150px;z-index:99;padding:0;text-transform:none}.ticket-header .pop-status a{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #444;color:#fff;display:block;padding:.5rem 1rem}.ticket-header .pop-status a:last-child{border:0}.ticket-header .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-header .pop-status a:hover.point{color:#fff}.ticket-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-header .pop-status a:hover{background:rgba(157,206,10,.2)}.ticket-data-container{margin-bottom:1rem}.ticket-data-container .icon{margin-left:.25rem}.ticket-status:last-child{margin:0}.ticket-status .level{display:inline-block;margin-right:.5rem;vertical-align:top}.filters h1,.filters h1 a{vertical-align:baseline}.ticket-status .level-name{color:#c2c2c2;float:right;text-transform:lowercase}.ticket-status .clickable:hover{background:#dcdcdc;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .type-data{background:#e8e8e8;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .type-data .pop-type{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .type-data .pop-type a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .type-data .pop-type a:last-child{border:0}.ticket-status .type-data .pop-type a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-status .severity-data{background:#e8e8e8;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .severity-data .pop-severity{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .severity-data .pop-severity a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .severity-data .pop-severity a:last-child{border:0}.ticket-status .severity-data .pop-severity a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-status .priority-data{background:#e8e8e8;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .priority-data .pop-priority{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .priority-data .pop-priority a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .priority-data .pop-priority a:last-child{border:0}.ticket-status .priority-data .pop-priority a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-detail-settings img,.ticket-detail-settings svg{max-height:1.25rem;max-width:1.25rem;width:100%}.ticket-watch-buttons{margin-bottom:1rem}.ticket-watch .ticket-watch-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.ticket-watch .ticket-watch-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ticket-watch .track-icon{position:relative;top:2px}.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{background:#b8b8b8;color:#fff;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:.25rem;text-align:center;text-transform:uppercase;-webkit-transition:background .25s;transition:background .25s}.ticket-watch .add-watcher path,.ticket-watch .ticket-watch-button path{fill:#fff}.ticket-watch .add-watcher:hover,.ticket-watch .ticket-watch-button:hover{background:#9dce0a}.ticket-watch .add-watcher.is-hover,.ticket-watch .ticket-watch-button.is-hover{background:red;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.ticket-watch .add-watcher.is-hover svg,.ticket-watch .ticket-watch-button.is-hover svg{fill:#ff8282}.ticket-watch .add-watcher.active,.ticket-watch .ticket-watch-button.active{background:#9dce0a}.ticket-watch .add-watcher.active:hover,.ticket-watch .ticket-watch-button.active:hover{background:#ff8282}.ticket-watch .add-watcher.active svg,.ticket-watch .ticket-watch-button.active svg{fill:#fff}.ticket-watch .ticket-watch-button{margin-right:.25rem}.wizard-create-project .create-step1 fieldset:first-child,.wizard-create-project .wizard-action a:first-child{margin-right:.5rem}.ticket-detail-settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-top:2rem}.ticket-detail-settings .button-delete,.ticket-detail-settings .item-block,.ticket-detail-settings .item-unblock,.ticket-detail-settings .promote-button,.ticket-detail-settings label{background:#b8b8b8;display:inline-block;margin-right:.5rem;padding:1rem;-webkit-transition:background .2s linear;transition:background .2s linear;-webkit-transition-delay:.1s;transition-delay:.1s}.ticket-detail-settings .button-delete:hover,.ticket-detail-settings .item-block:hover,.ticket-detail-settings .item-unblock:hover,.ticket-detail-settings .promote-button:hover,.ticket-detail-settings label:hover{background:#555}.ticket-detail-settings .button-delete.editable,.ticket-detail-settings .item-block.editable,.ticket-detail-settings .item-unblock.editable,.ticket-detail-settings .promote-button.editable,.ticket-detail-settings label.editable{cursor:pointer}.ticket-detail-settings .button-delete+input,.ticket-detail-settings .item-block,.ticket-detail-settings .item-block+input,.ticket-detail-settings .item-unblock,.ticket-detail-settings .item-unblock+input,.ticket-detail-settings .promote-button+input,.ticket-detail-settings label+input{display:none}.ticket-detail-settings .item-block.is-active,.ticket-detail-settings .item-unblock.is-active{display:inline-block}.ticket-detail-settings .item-unblock{background:#ff8282}.ticket-detail-settings .item-unblock:hover{background:red}.ticket-detail-settings .button-delete{background:#ff8282}.ticket-detail-settings .button-delete:hover{background:red}.ticket-detail-settings svg{fill:#fff;height:100%}.single-project .track-container .icon path,.single-project .track-container .list-itemtype-track-likers.active path,.single-project .track-container .list-itemtype-track-watchers.active path{fill:currentcolor}.wizard-create-project{background:url(../images/invitation_bg.jpg) center center no-repeat;bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910;background-size:cover;color:#fff;text-align:center}.wizard-create-project p{font-size:.9rem}.wizard-create-project .close{font-size:2rem;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.open.wizard-create-project{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.wizard-create-project{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.wizard-create-project fieldset{margin-bottom:1rem}.wizard-create-project .button-gray,.wizard-create-project .button-green{display:block;padding:12px;text-align:center}.wizard-create-project form{width:500px}.wizard-create-project .title{text-align:center;width:100%}.wizard-create-project h1,.wizard-create-project p{color:#fff}.wizard-create-project h1{line-height:1.5rem}.wizard-create-project p{opacity:.8}.wizard-create-project input,.wizard-create-project select,.wizard-create-project textarea{background:rgba(255,255,255,.7)}.wizard-create-project input::-webkit-input-placeholder,.wizard-create-project select::-webkit-input-placeholder,.wizard-create-project textarea::-webkit-input-placeholder{color:#444}.wizard-create-project input::-moz-placeholder,.wizard-create-project select::-moz-placeholder,.wizard-create-project textarea::-moz-placeholder{color:#444}.wizard-create-project input:-moz-placeholder,.wizard-create-project select:-moz-placeholder,.wizard-create-project textarea:-moz-placeholder{color:#444}.wizard-create-project input:-ms-input-placeholder,.wizard-create-project select:-ms-input-placeholder,.wizard-create-project textarea:-ms-input-placeholder{color:#444}.wizard-create-project .close{color:#fff}.wizard-create-project .close:hover{color:#ff8282}.wizard-create-project .wizard-step{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out;-webkit-animation-direction:alternate-reverse;animation-direction:alternate-reverse;display:none}.wizard-create-project .wizard-step.active{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out}.wizard-create-project .wizard-step.active.create-step1,.wizard-create-project .wizard-step.active.create-step2,.wizard-create-project .wizard-step.active.create-step3{display:block}.wizard-create-project .wizard-action div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .wizard-action a{color:#fff;display:inline-block;-webkit-flex-basis:40%;-ms-flex-preferred-size:40%;flex-basis:40%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 .template-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .create-step1 fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 input{display:none}.wizard-create-project .create-step1 input:checked+label{background:rgba(157,206,10,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label{background:rgba(245,245,245,.7);cursor:pointer;display:block;margin-bottom:1rem;padding:1rem;text-align:center;-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label:hover{background:rgba(114,161,20,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label .icon{font-size:3rem;color:#fff}.wizard-create-project .create-step1 h2{color:#fff;margin:.5rem 0 0;text-transform:uppercase}.wizard-create-project .create-step1 p{text-align:center}.wizard-create-project .progress-bar{bottom:0;height:.5rem;left:0;position:absolute;width:100%}.wizard-create-project .step1 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:25%}.wizard-create-project .step1 .progress-state span:nth-child(1){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .step2 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:75%}.wizard-create-project .step2 .progress-state span:nth-child(1),.wizard-create-project .step2 .progress-state span:nth-child(2){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .progress-state{position:absolute;width:100%}.wizard-create-project .progress-state span{color:rgba(255,255,255,.5);display:inline-block;margin-left:-100px;position:absolute;text-align:center;top:-2rem;-webkit-transition:all 1s ease-in;transition:all 1s ease-in;width:200px}.wizard-create-project .progress-state span:nth-child(1){left:25%}.wizard-create-project .progress-state span:nth-child(2){left:75%}.wizard-create-project .progress-bar-wrapper{background:rgba(255,255,255,.3);height:.5rem}.wizard-create-project .bar{background:rgba(157,206,10,.9);height:.5rem;left:0;position:absolute;top:0;width:0}.create-project{background:url(https://lh4.googleusercontent.com/-k7YewfrSQ_Q/VGdNZND0NBI/AAAAAAAAD1A/UDZBeSGR7iM/w1465-h824-no/Ultimate%2BMaterial%2BLollipop%2BCollection%2B-%2B480) center center no-repeat;background-size:cover;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;bottom:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.create-project .tagline{font-size:2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#fff;line-height:2rem;text-transform:uppercase}.introjs-tooltip p,.single-project .description,.single-project .looking-for-people p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project fieldset{margin-bottom:1rem}.create-project .create-project-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.create-project h1{color:#fff;text-align:center}.create-project .logo,.create-project .tagline{margin-bottom:1rem;text-align:center}.create-project form{margin-bottom:2rem}.create-project input{background:#fff}.create-project input::-webkit-input-placeholder{color:#BDBDBD}.create-project input::-moz-placeholder{color:#BDBDBD}.create-project input:-moz-placeholder{color:#BDBDBD}.create-project input:-ms-input-placeholder{color:#BDBDBD}.create-project .button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.create-project .button:hover{background:#8c9eff}.create-project a:hover{color:#fff}.filters h2 .icon-arrow-right{font-size:1rem}.filters-inner .loading .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32;max-height:1rem;max-width:1rem}.profile .timeline-wrapper .spin img,.user-profile .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.filters h1 .icon{margin:0}.filters h2 .icon-arrow-right,.issues-table .subject span,.single-project h1{vertical-align:middle}.filters h2{font-size:1.2rem;margin-top:1rem}.filters input{background:#444;color:#fff}.filters input::-webkit-input-placeholder{color:#b8b8b8}.filters input::-moz-placeholder{color:#b8b8b8}.filters input:-moz-placeholder{color:#b8b8b8}.filters input:-ms-input-placeholder{color:#b8b8b8}.filters .icon-search{color:#b8b8b8;position:absolute;right:.7rem;top:.7rem}.filters-inner{opacity:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}.filters-inner .loading{margin:0;padding:8px;text-align:center;width:100%}.filters-applied{margin-top:.5rem}.filters-step-cat .save-filters{color:#fff;display:block;text-align:center}.filters-step-cat .my-filter-name{background:#444;color:#f5f5f5;width:100%}.filters-step-cat .my-filter-name::-webkit-input-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name::-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-ms-input-placeholder{color:#b8b8b8}.filters-cats{margin-top:2rem}.filters-cats li{border-bottom:1px solid #b8b8b8;text-transform:uppercase}.filters-cats .custom-filters .title{color:#72a114}.filters-cats a{color:#444;display:block;padding:.5rem 0 .5rem .5rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.filters-cats .icon{color:#444;float:right;opacity:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-overlay{background:-webkit-radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background-color:#f5f5f5}.introjs-helperLayer{border:1px solid rgba(157,206,10,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(68,68,68,.2)}.introjs-bullets ul li a.active{background:#9dce0a}.introjs-button{background-color:#72a114;background-image:none;border:0;border-radius:0;color:#fff;margin-top:10px;padding:.3rem .8rem;text-shadow:none}.introjs-button:focus,.introjs-button:hover{background:#9dce0a;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .looking-for-people h3,.single-project .looking-for-people p,.single-project .track-container .list-itemtype-track{font-size:.9rem}.single-project .description,.single-project .title{font-size:1rem}.single-project .single-project-intro{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.single-project .project-logo{margin-right:1rem;width:6rem}.single-project .project-logo img{width:100%}.single-project .single-project-title-wrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.single-project .intro-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem}.single-project .intro-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project h1{color:#3f51b5;display:inline-block;line-height:1.2;margin-bottom:0}.single-project .like-watch-container{margin-left:auto}.single-project .track-buttons-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{color:#BDBDBD;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.single-project .track-container .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.single-project .track-container .list-itemtype-track-likers,.single-project .track-container .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .track-container .list-itemtype-track-likers .icon,.single-project .track-container .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.single-project .project-data,.single-project .title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#3f51b5}.single-project .track-container .icon svg{height:1rem;width:1rem}.single-project .description{margin:0}.single-project .project-data{display:flex}.single-project .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#EEE;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem}.single-project .single-project-tags{margin-bottom:1rem;margin-top:1rem}.single-project .timeline{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-shrink:3;-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;max-width:960px;width:0}.single-project .looking-for-people img{width:100%}.single-project .involved-data{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-organization,.single-project .involved-team{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-organization li,.single-project .involved-team li{-webkit-flex-basis:24%;-ms-flex-preferred-size:24%;flex-basis:24%;margin-right:.14rem}.single-project .involved-organization li:nth-child(4n),.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-organization a,.single-project .involved-team a{display:block}.single-project .involved-organization img,.single-project .involved-team img{border-radius:.2rem;width:100%}.issues-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table .pop-status,.issues-table .pop-status a,.issues-table .table-main{font-size:.9rem}.issues-table .title{font-size:1rem}.empty-issues .title{font-size:1.2rem;text-transform:uppercase}.empty-issues p,.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.issues-table .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8}.issues-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .avatar,.kanban-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.issues-table .row.is-blocked{background:#ffe8e8}.issues-table .row.is-blocked .blocked-text{color:red;margin-right:.5rem}.issues-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#555}.issues-table .table-main{border-bottom:1px solid #ebebeb}.issues-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-webkit-flex-basis:60%;-ms-flex-preferred-size:60%;flex-basis:60%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes{color:#555;-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes.inactive{color:#b8b8b8}.issues-table .votes.is-voted{color:#9dce0a}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field{-webkit-box-flex:0;-webkit-flex:0 0 160px;-ms-flex:0 0 160px;flex:0 0 160px;max-width:160px}.issues-table .issue-assignedto{cursor:pointer;position:relative}.issues-table .issue-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .issue-assignedto figcaption{max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.issues-table .issue-assignedto .icon{opacity:0;position:absolute;right:0;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .pop-status{background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99}.issues-table .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.search-filter,.search-result-table{border-top:1px solid #f5f5f5}.issues-table .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.issues-table .pop-status.fix{bottom:0;top:auto}@media (max-width:1280px){.issues-table .created-field,.issues-table .level-field{display:none}}.empty-issues{margin-top:4rem;text-align:center}.empty-issues img{margin-bottom:1rem}.empty-issues p,.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem}.kanban-table-body,.kanban-table-header .task-colum-name,.kanban-table-header .task-colum-name .icon{font-size:1rem}.kanban-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table .vfold.task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold .kanban-task,.kanban-table .vfold.task-colum-name .icon-bulk,.kanban-table .vfold.task-colum-name .icon-closed-eye,.kanban-table .vfold.task-colum-name .icon-open-eye,.kanban-table .vfold.task-colum-name .icon-plus,.kanban-table .vfold.task-colum-name .icon-vfold,.kanban-table .vfold.task-colum-name .icon-vunfold,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1;max-width:30px;min-height:2.5rem;min-width:30px;width:30px}.kanban-table .readonly{cursor:auto}.kanban-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.kanban-table-header .kanban-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.kanban-table-header .task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem .5rem .5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name span{max-width:65%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kanban-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.kanban-table-header .task-colum-name .icon.hfold,.kanban-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.kanban-table-header .icon-closed-eye,.kanban-table-header .icon-open-eye{display:inline-block}.kanban-table-header .icon-closed-eye svg,.kanban-table-header .icon-open-eye svg{fill:#b8b8b8;height:1.1rem;margin-top:.25rem;width:1.1rem}.kanban-table-header .icon-closed-eye:hover svg,.kanban-table-header .icon-open-eye:hover svg{fill:#72a114}.kanban-table-header .icon-open-eye .svg-eye-closed{display:none}.kanban-table-header .icon-closed-eye .svg-eye-closed,.kanban-table-header .icon-open-eye .svg-eye-open{display:block}.kanban-table-header .icon-closed-eye .svg-eye-open{display:none}.kanban-table-body,.kanban-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.kanban-table-body{display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;overflow-y:auto;widows:300px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#b8b8b8;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#050505}.kanban-table-body .task-column .kanban-wip-limit{background:red;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-inner{display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.search-filter{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:0;z-index:9}.search-filter a{background:#fff;color:#b8b8b8;display:inline-block;margin-right:1rem;padding:1rem 1.25rem}.search-filter .icon,.search-filter a:hover .icon{margin-right:.4rem}.search-filter .name,.search-filter a:hover .name{padding-left:5px}.search-filter a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.search-filter a.active{border-left:1px solid #f5f5f5;border-right:1px solid #f5f5f5;color:#444;position:relative;top:1px}.search-filter a.active .icon{color:#9dce0a}.search-in input{background:#444;color:#fff}.search-in input::-webkit-input-placeholder{color:#b8b8b8}.search-in input::-moz-placeholder{color:#b8b8b8}.search-in input:-moz-placeholder{color:#b8b8b8}.search-in input:-ms-input-placeholder{color:#b8b8b8}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{color:#b8b8b8}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #f5f5f5}.search-result-table .user-story-name .icon{font-size:1rem;color:#b8b8b8}.empty-search-results .title{font-size:1.2rem;text-transform:uppercase}.empty-search-results p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.search-result-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.search-result-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row .ref{-webkit-flex-basis:30px;-ms-flex-preferred-size:30px;flex-basis:30px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .status{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.search-result-table .user-story-name span{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-table .user-story-name .icon:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.search-result-table .points,.search-result-table .status{position:relative}.search-result-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.search-result-table .avatar img{width:35px}.search-result-table .avatar .avatar-caption{display:block;margin-left:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:80px}.empty-search-results{margin-top:4rem;text-align:center}.empty-search-results img{margin-bottom:1rem}.empty-search-results p{margin:0}.team-filters nav li{font-size:1.6rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.table-team .team-header,.team-filters nav li:last-child{border-bottom:0}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters nav a{display:block;padding:1rem 0 1rem 1rem}.team-filters nav a.active,.team-filters nav a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.team-filters nav .active,.team-filters nav a.active.icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.team-filters nav .icon{color:#050505;float:right;opacity:0}.table-team .leave-project,.table-team .popover,.table-team .popover a{font-size:.9rem}.table-team .attribute .points{font-size:1.6rem}.table-team .attribute,.table-team .attribute .points,.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.policy-table .policy-table-header,.table-team .avatar .name,.table-team .team-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.table-team .row{padding:.5rem}.table-team .username{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:6;-webkit-flex:6;-ms-flex:6;flex:6;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{color:#050505;font-size:1.8rem}.table-team .attribute .points{color:#444}.table-team .attribute .top{color:#9dce0a;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{color:#b8b8b8;display:block}.table-team .leave-project .icon{margin-right:.2rem}.table-team .leave-project:hover .icon{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .hero{width:100%}.table-team .hero .row{background:#f5f5f5;border-bottom:0;margin:1rem 0}.table-team .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.table-team .avatar img{-webkit-flex-basis:66px;-ms-flex-preferred-size:66px;flex-basis:66px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:66px}.table-team .avatar figcaption{margin-left:1rem;width:65%}.table-team .avatar figcaption span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.table-team .avatar .name,.table-team .avatar .position{display:block;width:100%}.table-team .avatar .position{color:#b8b8b8}.table-team .popover{background:#050505;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99}.table-team .popover a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#050505;bottom:-5px;content:'';height:15px;left:50%;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:15px}.policy-table .policy-table-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{border-bottom:2px solid #b8b8b8}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none,.policy-table .policy-table-project{padding:1rem}.policy-table .policy-table-project{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#72a114;-webkit-transition:background .3s linear;transition:background .3s linear}.policy-table label{background:#b8b8b8;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#9dce0a;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear}.user-change-password fieldset{margin-bottom:1rem;width:50%}.user-change-password fieldset:last-child{margin-top:2rem}.user-change-password label{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;display:block;margin-bottom:.5rem}.user-change-password .button-green{color:#fff;display:block;padding:12px;text-align:center}.user-profile .use-default-image{font-size:.75rem}.user-profile .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;border:0;-webkit-transform-origin:center center;transform-origin:center center}.user-profile{max-width:780px}.user-profile form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.user-profile fieldset{margin-bottom:1rem}.user-profile label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.user-profile .project-details-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.user-profile .project-details-image .image,.user-profile .submit-button,.wiki-nav li .loading{width:100%}.user-profile .change-image{display:block}.user-profile .image-container{position:relative;margin-bottom:.5rem}.user-profile .loading-overlay{display:none}.user-profile .loading-overlay.active{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.user-profile .use-default-image{display:block;margin-top:.25rem;text-align:center}.user-profile .use-default-image:hover{color:red}.user-profile .project-details-form-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.user-profile form{display:block}}.user-profile .delete-account{font-size:.9rem;display:block;margin-top:1rem}.wiki-nav li input{font-size:1rem}.attachment-list .attachment-settings .editable-settings,.attachment-list .attachment-settings .settings,.attachment-list .icon-delete,.wiki-nav li{font-size:1.2rem}.wiki-nav li{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.wiki-nav li:hover .icon{opacity:1;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li a{display:block;padding:1rem 0 1rem 1rem}.wiki-nav li a span{cursor:pointer}.wiki-nav li .icon{color:#050505;float:right;opacity:0;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li input{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background:#444;color:#f5f5f5}.attachment-gallery .single-attachment .attachment-name,.attachments-header .size-info{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.wiki-nav li input::-webkit-input-placeholder{color:#b8b8b8}.wiki-nav li input::-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-ms-input-placeholder{color:#b8b8b8}.wiki-nav li .loading{margin:0;padding:8px;text-align:center}.wiki-nav .add-button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.wiki-summary .wiki-user-modification,.wiki-summary div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.wiki-summary .username{font-size:1.2rem;color:#9dce0a;white-space:nowrap}.wiki-summary{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary div{display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:1rem}.wiki-summary .number{line-height:2rem;top:0}.wiki-summary .wiki-user-modification{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary figure{margin-right:.3rem;width:32px}.attachment-gallery{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.attachment-gallery .single-attachment{margin-bottom:.5rem;margin-right:.5rem;max-width:200px}.attachment-gallery .single-attachment:hover .icon-delete{opacity:1}.attachment-gallery .single-attachment .attachment-image{display:inline-block}.attachment-gallery .single-attachment img{height:150px;margin-bottom:.2rem;width:200px}.attachment-gallery .single-attachment img:hover{-webkit-filter:saturate(150%) hue-rotate(60deg);filter:saturate(150%) hue-rotate(60deg);-webkit-transition:all .3s cubic-bezier(.01,.7,1,1);transition:all .3s cubic-bezier(.01,.7,1,1)}.attachment-gallery .single-attachment.deprecated img{opacity:.5}.attachment-gallery .single-attachment.deprecated .attachment-name{color:#BDBDBD}.attachment-gallery .single-attachment .attachment-data{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.attachment-gallery .single-attachment .attachment-name{max-width:175px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block}.attachment-gallery .single-attachment .icon-delete{color:#ff5252;margin-left:auto;opacity:0;-webkit-transition:opacity .3s ease-in;transition:opacity .3s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.attachment-gallery .single-attachment .icon-delete:hover{color:#f44336}.attachment-gallery .single-attachment .loading-container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:150px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0 .5rem .5rem 0;width:200px}.attachment-gallery .single-attachment .loading-spinner{margin:0 auto;max-height:3rem;max-width:3rem}.attachment-list .single-attachment{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #EEE;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;position:relative}.attachment-list .single-attachment:hover .settings{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.attachment-list .single-attachment.deprecated,.attachment-list .single-attachment.deprecated .attachment-name a{color:#BDBDBD}.attachment-list .attachment-name{max-width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding-right:1rem}.attachment-list .attachment-comments,.attachment-list .editable-attachment-comment{-webkit-box-flex:2;-webkit-flex:2;-ms-flex:2;flex:2;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;margin-right:.5rem}.attachment-list .attachment-comments span,.attachment-list .editable-attachment-comment span{color:#757575}.attachment-list .attachment-size{-webkit-flex-basis:125px;-ms-flex-preferred-size:125px;flex-basis:125px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.attachment-list .attachment-settings{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:10%;-ms-flex-preferred-size:10%;flex-basis:10%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin-left:auto}.attachment-list .attachment-settings .editable-settings,.attachment-list .attachment-settings .settings{color:#BDBDBD}.attachment-list .attachment-settings .editable-settings:hover,.attachment-list .attachment-settings .settings:hover{color:#3f51b5}.attachment-list .attachment-settings .settings{opacity:0}.attachment-list .attachment-settings .editable-settings{opacity:1}.attachment-list .attachment-settings .icon-delete:hover{color:#f44336}.attachment-list .attachment-settings .icon-drag-v{cursor:move}.attachment-list .icon-delete{color:#BDBDBD}.attachment-list .icon-delete:hover{color:#f44336}.attachment-list .editable-attachment-deprecated{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:1rem}.attachment-list .editable-attachment-deprecated span{color:#BDBDBD}.attachment-list .editable-attachment-deprecated input{margin-right:.2rem;vertical-align:middle}.attachment-list .editable-attachment-deprecated input:checked+span{color:#424242}.attachment-list .percentage{background:rgba(63,81,181,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.attachments-header .size-info,.more-attachments,.single-attachment{font-size:.9rem}.attachments-header .attachments-title{font-size:1rem;color:#424242;padding:0 1rem}.attachments-empty,.attachments-header .attachments-title,.live-announcement-inner .title,.live-announcement-inner .warning a,.single-attachment .attachment-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.attachments{margin-bottom:2rem}.attachments-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#EEE;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.attachments-header .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.attachments-header label{cursor:pointer;margin-left:.25rem}.attachments-header label.add-attachment-button{background:#757575;border:0;display:inline-block;padding:.5rem;-webkit-transition:background .25s;transition:background .25s}.attachments-header label.add-attachment-button:hover{background:#8c9eff}.attachments-header label svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.attachments-header button{background:0 0;margin-right:.2rem}.attachments-header button.is-active svg,.attachments-header button:hover svg{fill:#8c9eff}.attachments-header button svg{fill:#BDBDBD;height:1.6rem;margin-bottom:-.2rem;width:1.6rem}.attachments-header .size-info{color:#757575;padding-left:1rem}.more-attachments span,.single-attachment .attachment-size{color:#BDBDBD}.attachments-header input{display:none}.attachments-empty{font-size:1.2rem;border:3px dashed #EEE;color:#BDBDBD;margin-top:.5rem;padding:1rem;text-align:center}.single-attachment.ui-sortable-helper{background:#fff;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.single-attachment.sortable-placeholder{background:#EEE;height:40px}.single-attachment .attachment-name{padding-right:1rem}.single-attachment .attachment-name .icon{margin-right:.25rem}.single-attachment .attachment-name svg{height:1.2rem;width:1.2rem}.more-attachments{border-bottom:1px solid #BDBDBD;display:block;padding:1rem 0 1rem 1rem}.live-announcement,.live-announcement-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.more-attachments .more-attachments-num{color:#3f51b5;margin-left:.5rem}.more-attachments:hover{background:#fff;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.attachment-preview img{max-height:80vh;max-width:80vw}.live-announcement-inner .title{font-size:1.6rem;color:#107a8a;margin-bottom:.5rem}.live-announcement{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#98e0eb;display:flex;height:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;-webkit-transition:width .5s,height .5s;transition:width .5s,height .5s;-webkit-transition-delay:.5s;transition-delay:.5s;width:0;z-index:99}.live-announcement .live-announcement-inner{opacity:0;-webkit-transition:opacity .5s;transition:opacity .5s;width:100%}.live-announcement.visible{height:146px;pointer-events:auto;-webkit-transition-delay:0s;transition-delay:0s;width:100%}.live-announcement.visible .live-announcement-inner{opacity:1;-webkit-transition:opacity .5s .5s;transition:opacity .5s .5s}.live-announcement-inner{display:flex;max-width:1200px}.live-announcement-inner .announcement-decoration{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin-right:1rem}.live-announcement-inner .text{padding:1.25rem 3rem 1.25rem 2rem;position:relative;width:100%}.live-announcement-inner .warning,.live-announcement-inner .warning a{color:#107a8a}.live-announcement-inner .close{height:2.5rem;position:absolute;right:0;top:1rem;width:2.5rem}.live-announcement-inner .close svg{fill:#18b7cf;-webkit-transition:fill .2s;transition:fill .2s}.live-announcement-inner .close svg:hover{fill:#107a8a}.discover-header .project-number{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#72a114}.discover-header{background:url(../images/discover.png) bottom left repeat-x #f5f5f5;margin-bottom:2.5rem;padding:1rem 1rem 2rem;text-align:center}.discover-header .discover-header-inner{max-width:1200px;min-width:768px;margin:0 auto}.discover-header .title{font-size:3rem;margin-bottom:0}.discover-header form{margin:0 30%;position:relative}@media (max-width:767px){.discover-header .discover-header-inner{width:90%;min-width:0}.discover-header form{margin:0 .5rem}}.discover-header input[type=text]{background:#fff;border:0;padding:1rem;width:100%}.discover-header input[type=text]:focus{outline-color:#9dce0a}.discover-header input[type=text]:-webkit-autofill{background:rgba(135,155,137,.5)}.discover-header .search-button{position:absolute;right:1rem;top:1rem}.discover-header .search-button:hover svg{fill:#72a114}.discover-header svg{fill:#b8b8b8;height:1.5rem;-webkit-transition:all .2;transition:all .2;width:1.5rem}.discover-search-subfilter .results{font-size:.9rem}.discover-results-header .title{font-size:1.6rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;text-transform:uppercase}.discover-results-header .discover-results-header-inner{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.discover-results-header svg{width:1.1rem;height:1.1rem;fill:#b8b8b8}.discover-results-header h2{display:inline-block}.filter-discover-search .discover-search-filter{margin-right:1rem}.filter-discover-search .discover-search-filter.active{color:#72a114}.discover-search-subfilter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:relative}.discover-search-subfilter:after,.discover-search-subfilter:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.discover-search-subfilter:after{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:8px;margin-left:-8px}.discover-search-subfilter:before{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.discover-search-subfilter.most-liked-subfilter::after,.discover-search-subfilter.most-liked-subfilter::before{left:85%}.discover-search-subfilter.most-active-subfilter::after,.discover-search-subfilter.most-active-subfilter::before{left:95%}.discover-search-subfilter.ng-enter{-webkit-animation:dropdownFade .2s;animation:dropdownFade .2s}.discover-search-subfilter .results{color:#ff8282;display:block;padding:.5rem 1rem;-webkit-transition:all .2s;transition:all .2s}.discover-search-subfilter .results:hover{color:red}.discover-search-subfilter .filter-list{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 0 0 auto}.discover-search-subfilter .filter-list a{display:block;padding:.5rem 1rem;-webkit-transition:all .2s;transition:all .2s}.featured-project,.featured-projects-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.discover-search-subfilter .filter-list a:hover{background:#b8b8b8;color:currentColor}.discover-search-subfilter .filter-list a.active{background:#9dce0a;color:#f5f5f5}.featured-project .project-card-description,.featured-project .statistic{font-size:.9rem}.featured-project .project-card-name a{font-size:1.2rem}.featured-project .project-card-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.featured-projects .title{font-size:1.6rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#444;text-align:center}.featured-projects{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.featured-projects{width:90%;min-width:0}}.featured-projects-inner{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.featured-project{background:#fff;border:1px solid #f5f5f5;margin:.5rem;display:flex;-webkit-flex-basis:23%;-ms-flex-preferred-size:23%;flex-basis:23%;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:23%}.featured-project .tags-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.3rem}.featured-project .project-tag{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.featured-project .project-card-inner{padding:1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.featured-project .project-card-description{color:#555}.featured-project .project-card-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:auto}.featured-project .project-card-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.featured-project .project-card-statistics .svg-eye-closed{display:none}.featured-project .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.featured-project .project-card-name a,.featured-project .statistic.active{color:#72a114}.featured-project .statistic.active svg{fill:#72a114}.featured-project .project-card-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.featured-project .project-card-logo{display:inline-block;-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:50px;height:50px;margin-right:.5rem}.featured-project .project-card-logo img{width:100%}.featured-project .project-card-name{line-height:.9}.featured-project .project-card-name a:hover{color:#9dce0a}.featured-project .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8;margin:0 .5rem}@media (max-width:767px){.featured-project{-webkit-flex-basis:45%;-ms-flex-preferred-size:45%;flex-basis:45%}}@media (max-width:480px){.featured-project{-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%}}.filter-highlighted li,.highlighted-project .project-description,.highlighted-project .statistic{font-size:.9rem}.highlighted-project .project-title{font-size:1.2rem}.highlighted .title{font-size:1.6rem}.highlighted .empty-highlighted-project span{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted-project .project-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.highlighted{margin:1rem auto 4rem;max-width:1200px;min-width:768px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}@media (max-width:767px){.highlighted{width:90%;min-width:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.highlighted tg-most-active{margin-top:4rem}}.highlighted tg-most-active,.highlighted tg-most-liked{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.highlighted tg-most-liked{margin-right:8%}@media (max-width:767px){.highlighted tg-most-liked{margin-right:0}}.highlighted .most-active,.highlighted .most-liked{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.highlighted .header{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.highlighted .header svg{width:1.5rem;height:1.5rem;fill:#b8b8b8;margin:.5rem}.highlighted .title-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.highlighted .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#444;display:inline-block;margin:0}.empty-discover-results .title,.home-project .project-card-description,.home-wrapper .title-bar,.projects-empty p,.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted .highlighted-projects-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.highlighted .loading-container{margin-top:calc(50% - 1rem)}.highlighted .loading-spinner{display:block;margin:2rem auto;max-height:3rem;max-width:3rem}.highlighted .view-more-projects{margin-top:auto;width:100%}.highlighted .empty-highlighted-project{border:2px dashed #f5f5f5;padding:2rem;text-align:center}.highlighted .empty-highlighted-project svg{width:2rem;height:2rem;display:block;fill:#b8b8b8;margin:1rem auto}.highlighted .empty-highlighted-project span{color:#555;display:block}.filter-highlighted{position:relative}.filter-highlighted .current-filter{padding:1rem}.filter-highlighted .current-filter span{margin-left:.2rem;position:relative;top:.2rem}.filter-highlighted .filter-list{background:#000;position:absolute;right:0;top:1.5rem}.filter-highlighted .filter-list.ng-enter{-webkit-animation:dropdownFade .2s ease-in;animation:dropdownFade .2s ease-in}.filter-highlighted .filter-list.ng-leave{-webkit-animation:dropdownFade .2s ease-in;animation:dropdownFade .2s ease-in;-webkit-animation-direction:reverse;animation-direction:reverse}.filter-highlighted li{color:#fff;cursor:pointer;min-width:8rem;padding:.25rem .5rem}.filter-highlighted li:hover{background:rgba(157,206,10,.4)}.highlighted-project{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:9rem;-ms-flex-preferred-size:9rem;flex-basis:9rem;min-height:9rem;padding:1.5rem 0}.highlighted-project:nth-last-child(-n+2){border-bottom:0}.highlighted-project .project-logo{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;height:auto;margin-right:1rem;width:3rem}.highlighted-project .project-logo img{width:100%}.highlighted-project .project-data-container{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.highlighted-project .single-project-header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.highlighted-project .project-title{display:inline-block;margin-bottom:.5rem}.highlighted-project .project-title a{color:#72a114}.highlighted-project .project-title a:hover{color:#9dce0a}.highlighted-project .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8;margin-left:.5rem}.highlighted-project .project-description{color:#555;margin-bottom:0}.highlighted-project .project-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.highlighted-project .project-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.highlighted-project .project-statistics .svg-eye-closed{display:none}.highlighted-project .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.highlighted-project .statistic.active{color:#72a114}.highlighted-project .statistic.active svg{fill:#72a114}.discover-results .statistic{font-size:.9rem}.discover-search .discover-header form{margin:0 8rem;position:relative}.discover-search .discover-header .search-button{left:1rem;right:auto}.discover-search .discover-header .searchbox input{padding-left:3.5rem;padding-right:23rem}.discover-search .searchbox-filters{position:absolute;right:1rem;top:.7rem;width:auto}.discover-search .searchbox-filters input{display:none}.discover-search .searchbox-filters label{border-radius:4px;color:#b8b8b8;cursor:pointer;display:inline-block;padding:.4rem .75rem;-webkit-transition:all .2s;transition:all .2s;-webkit-transition-delay:.2s;transition-delay:.2s}.discover-search .searchbox-filters label.active{background:#9dce0a;color:#fff}.discover-search .searchbox-filters label:hover{background:#f5f5f5;color:#555}.discover-results{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.discover-results{width:90%;min-width:0}}.discover-results .discover-results-inner .spin{margin-top:4rem}.discover-results .list-itemtype-project{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:1rem 0}.discover-results .list-itemtype-project:last-child{border-bottom:0}.discover-results .list-itemtype-project-left{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%}.discover-results .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.discover-results .list-itemtype-project-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;vertical-align:middle}.discover-results .look-for-people{margin-left:.5rem}.discover-results .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8}.discover-results .project-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.discover-results .project-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.discover-results .project-statistics .svg-eye-closed{display:none}.discover-results .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.discover-results .statistic.active{color:#72a114}.discover-results .statistic.active svg{fill:#72a114}.discover-results .more-results{display:block;margin:0 20rem;-webkit-transition:inherit;transition:inherit}.discover-results div[tg-loading] img{display:block;margin:0 auto}.empty-discover-results{margin:4rem auto 1rem;max-width:1200px;min-width:768px;text-align:center}@media (max-width:767px){.empty-discover-results{width:90%;min-width:0}}.empty-discover-results img{margin-bottom:1rem}.empty-discover-results .title{font-size:1.2rem;margin:0;text-transform:uppercase}.external-app-wrapper .app-card a,.external-app-wrapper .app-card p,.external-app-wrapper .user-card a{font-size:.75rem}.external-app-wrapper .cancel{font-size:.9rem}.external-app-wrapper .app-card h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:6rem;margin:0 auto;width:6rem}.external-app-wrapper h1{margin-bottom:0}.external-app-wrapper .app-card,.external-app-wrapper .user-card{line-height:1.4;margin-bottom:2rem;text-align:left}.external-app-wrapper .app-card .card-inner,.external-app-wrapper .user-card .card-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.external-app-wrapper .app-card a,.external-app-wrapper .button-green,.external-app-wrapper .user-card a{display:block}.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.external-app-wrapper .app-card h3,.external-app-wrapper .app-card p,.external-app-wrapper .user-card h3,.external-app-wrapper .user-card p{margin:0}.external-app-wrapper .app-card a,.external-app-wrapper .user-card .card-inner{margin-bottom:.5rem}.external-app-wrapper .app-card .app-image{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.external-app-wrapper .user-card{background:#fff8e4;border:1px solid #f1e8cd;padding:1rem}.external-app-wrapper .user-card .user-image{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .cancel{display:block;margin-top:.5rem;text-align:left}@media (max-width:480px){.external-app-wrapper{margin:0;min-width:100%;padding:2rem 1rem;text-align:center;width:100%}}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #f5f5f5;cursor:pointer;-webkit-transition:background .2s;transition:background .2s;-webkit-transition-delay:.2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(157,206,10,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single>a,.working-on .duty-single>a{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.empty-ticket .data,.home-project .project-card-inner{-webkit-box-orient:vertical;-webkit-box-direction:normal}.watching .duty-single>a.blocked,.working-on .duty-single>a.blocked{background:rgba(255,130,130,.2);color:red}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper,.home-wrapper .title-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-wrapper{display:flex}.home-wrapper .duty-summary{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .project-list{width:250px}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.6rem;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#EEE;display:flex;margin:0 0 .5rem;padding:.9rem 1rem}.home-project .project-card-description,.home-project .statistic,.projects-empty p{font-size:.9rem}.home-project{background:#fff;border:1px solid #f5f5f5;margin:.5rem .5rem 1rem;cursor:pointer;-webkit-transition:.2s;transition:.2s;-webkit-transition-delay:.1s;transition-delay:.1s}.home-project .tags-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.3rem}.home-project .project-tag{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.home-project .project-card-inner{padding:1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home-project .project-card-description{color:#555}.home-project .project-card-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:auto}.home-project .project-card-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.home-project .project-card-statistics .svg-eye-closed{display:none}.home-project .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.empty-ticket,.home-project .project-card-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-project .statistic.active{color:#72a114}.home-project .statistic.active svg{fill:#72a114}.home-project .project-card-header{display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.home-project .project-card-logo{display:inline-block;-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:50px;height:50px;margin-right:.5rem}.home-project .project-card-logo img{width:100%}.home-project .project-card-name{line-height:.9}.home-project .project-card-name a{font-size:1.2rem;color:#72a114}.home-project .project-card-name a:hover{color:#9dce0a}.home-project .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8;margin:0 .5rem}.home-project:hover{border:1px solid #9dce0a}.projects-empty{text-align:center}.projects-empty svg{height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty svg path{fill:#f5f5f5}.projects-empty .create-project-button{display:block;margin-bottom:.25rem}.projects-empty .import-project-button{display:block}.watching-empty,.working-on-empty{margin-bottom:4rem}.watching-empty p,.working-on-empty p{margin:2rem 9rem 1rem;text-align:center}.empty-ticket{display:flex}.empty-ticket .data,.navbar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.empty-ticket:not(:last-child){border-bottom:1px solid #f5f5f5;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#e8e8e8;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:40vw}.empty-ticket .line:last-child{margin:0;width:20vw}.navbar{display:flex;height:40px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:relative}.navbar::after{background-size:200%;bottom:0;content:'';height:100%;left:0;position:absolute;right:0;top:0;z-index:-1}.navbar .nav-left,.navbar .nav-right{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.navbar .nav-left>a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left>a.logo{background:rgba(0,0,0,.2);padding:.4rem .75rem}.navbar .nav-left>a svg{height:1.6rem;max-height:1.6rem;max-width:2rem;width:1.6rem}.navbar .nav-left>a path{fill:#fff}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar a{color:#fff;display:inline-block;-webkit-transition:all .2s linear;transition:all .2s linear}.navbar a svg path{fill:#131a5c}.navbar a:hover{background:rgba(0,0,0,.2);color:#8c9eff}.navbar a:hover svg path{fill:#fff}.navbar a.user-avatar{min-width:200px;padding:0 0 0 2rem;text-align:right}.navbar a.user-avatar span{padding-right:1rem}.navbar img{height:2.5rem;padding-left:.5rem;vertical-align:middle}.navbar svg{height:1.2rem;max-height:1.2rem;max-width:1.2rem;width:1.2rem}.navbar svg path{fill:#fff;-webkit-transition:all .2s;transition:all .2s}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;display:block}.navbar .navbar-dropdown a{padding:.8rem .5rem}.navbar .navbar-dropdown{border-radius:2px;display:none;left:calc(50% - 350px/2);min-width:350px;position:absolute;top:2.4rem;z-index:999}.navbar-dropdown{background:#212121;border:1px solid #000;padding:.3rem}.navbar-dropdown.dropdown-user{left:calc(50% - 200px/2);min-width:200px}.navbar-dropdown.dropdown-user ul{margin-bottom:0}.navbar-dropdown ul{margin:0 0 .5rem;padding:0}.navbar-dropdown ul:after,.navbar-dropdown ul:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:rgba(33,33,33,0);border-bottom-color:#212121}.navbar-dropdown ul:after{border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown a{color:#BDBDBD;display:block;padding:.8rem .5rem}.navbar-dropdown .create-options,.profile-filter{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.navbar-dropdown a:hover{background:rgba(255,255,255,.1);color:#8c9eff}.navbar-dropdown a.create-organization-btn,.navbar-dropdown a.create-project-btn,.navbar-dropdown a.see-more-projects-btn{color:#fff;text-align:center}.navbar-dropdown a.create-organization-btn:hover,.navbar-dropdown a.create-project-btn:hover,.navbar-dropdown a.see-more-projects-btn:hover{color:#fff}.navbar-dropdown a.see-more-projects-btn{margin-bottom:.3rem}.navbar-dropdown a.create-project-btn{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.navbar-dropdown a.import-project-button{padding-left:.75rem;padding-right:.75rem}.navbar-dropdown .create-options{display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #f5f5f5}.profile-filter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile,.profile-filter .searchbox{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.profile-filter .searchbox{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{color:grayer;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs,.profile-projects,.profile-timeline{border-top:1px solid #f5f5f5}.profile-filter .searchbox input:focus{border-bottom:1px solid #b8b8b8;outline:0;-webkit-transition:border-bottom .3s ease-in;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#b8b8b8;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#050505}.profile .timeline-wrapper .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile{display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{background:#fff;margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;-webkit-transition:all .3s cubic-bezier(.09,.43,.35,.95);transition:all .3s cubic-bezier(.09,.43,.35,.95)}.profile .timeline-wrapper>div.ng-hide{opacity:0;padding-top:.5vh}.profile .timeline-wrapper .spin{margin:10% auto;width:3rem}.profile .profile-sidebar{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.profile .profile-sidebar .button-gray{display:block;margin-bottom:2rem;padding-left:2rem;padding-right:2rem}.profile .empty-tab{padding:5vh;text-align:center}.profile .empty-tab svg{margin:2rem auto;max-width:160px;text-align:center}.profile .empty-tab p{font-size:.9rem}.profile-bar .profile-stats .stat-name{font-size:.9rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username{font-size:1.2rem}.profile-bar h2{font-size:1.6rem}.profile-bar .profile-stats .stat-number,.profile-bar h1{font-size:2rem}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar .profile-organizations h3,.profile-bar .profile-stats .stat-number,.profile-bar h1{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-bar .profile-image-wrapper{height:200px;margin-bottom:1rem;overflow:hidden;position:relative}.profile-bar .profile-image-wrapper.is-current-user:hover img{-webkit-filter:brightness(40%) saturate(150%) hue-rotate(60deg);filter:brightness(40%) saturate(150%) hue-rotate(60deg);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1);-webkit-transition-delay:.3s;transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;-webkit-transform:translateY(100%);transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);-webkit-transition:all .3s cubic-bezier(.01,.7,1,1);transition:all .3s cubic-bezier(.01,.7,1,1)}.profile-bar .button-green{display:block;margin-bottom:1rem}.profile-bar .profile-data{position:relative}.profile-bar .flag{position:absolute;right:0;top:0;width:12px}.profile-bar .flag path{fill:#b8b8b8;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar .flag:hover path{fill:red;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar h1{line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar h2{color:#555;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#b8b8b8;margin-bottom:1rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#b8b8b8}.profile-bar .profile-stats{border-bottom:1px solid #f5f5f5;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1.25rem;padding:1rem .5rem}.profile-bar .profile-stats .stat{padding:0 .2rem;text-align:center}.profile-bar .profile-stats .stat-number{display:block;line-height:1}.profile-bar .profile-stats .stat-name{display:block}.profile-bar .profile-organizations{border-bottom:1px solid #f5f5f5;border-top:1px solid #f5f5f5;margin-bottom:1rem;padding:1rem 0}.profile-bar .profile-organizations h3{margin-bottom:.5rem}.profile-bar .profile-organizations .profile-organizations-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.profile-bar .profile-organizations .organization{background:#b8b8b8;border-radius:5px;height:45px;margin-right:.2rem;width:45px}.profile-bar .profile-quote{background:url(../images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contact-single .profile-contact-data h1 span{font-size:.9rem}.profile-contact-single .profile-contact-data .extra-info{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-contact-single .profile-contact-data h1,.profile-contact-single .profile-contact-data h1 span{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.profile-contacts{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.profile-contact-filters{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.profile-contact-filters a{border-bottom:2px solid #fff;color:#b8b8b8;display:inline-block;padding:1rem 1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-contact-filters a.active,.profile-contact-filters a:hover{border-bottom:2px solid #b8b8b8;color:#72a114}.profile-contact-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.8rem 1rem}.profile-contact-single .profile-contact-picture{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:1rem;max-width:54px}.profile-contact-single .profile-contact-picture img{border-radius:.2rem;width:100%}.profile-contact-single .profile-contact-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-contact-single .profile-contact-data h1{font-size:1.2rem;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;line-height:1.6;margin-bottom:0;text-transform:none}.profile-contact-single .profile-contact-data h1 span{background:#f5f5f5;color:#555;margin-left:1rem;padding:.1rem .3rem}.profile-contact-single .profile-contact-data p{color:#555;margin-bottom:0}.profile-contact-single .profile-contact-data .extra-info{color:#555}.profile-contact-single .profile-contact-data .position{margin-right:.3rem}.profile-contact-single .profile-project-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-left:auto;width:100px}.profile-contact-single .profile-project-stats div{color:#b8b8b8;margin-right:.5rem}.profile-contact-single .profile-project-stats div .icon{margin-right:.2rem;vertical-align:center}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{color:#b8b8b8;display:inline-block;padding:1rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#444;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #f5f5f5;border-right:1px solid #f5f5f5;position:relative;top:1px;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .icon{margin-right:.4rem}.profile-sidebar h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin-bottom:.5rem;padding:.5rem}.profile-sidebar h4 .icon{color:#b8b8b8;margin-right:.3rem;vertical-align:text-bottom}.profile-sidebar p{font-size:.9rem;color:#b8b8b8}.profile-sidebar a{color:#72a114}.profile-sidebar .trans-button{margin-bottom:1rem}.profile-projects .list-itemtype-project{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:10rem}.profile-projects .list-itemtype-project .project-list-single-title-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.profile-projects .list-itemtype-project .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:200px}.project-list-wrapper .help-area{font-size:.9rem;color:#b8b8b8;width:200px}.project-list-wrapper .drag{font-size:1.2rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:2rem 0 1rem;padding:.9rem 1rem}.project-list-wrapper .project-list-title h1{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.project-list-wrapper .create-options a.create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .create-options a.import-project-button{padding:.53rem .8rem}.project-list-wrapper .create-options a.import-project-button:hover{background:#444}.project-list-wrapper .create-options a.import-project-button .icon-upload{margin:0}.project-list-wrapper .project-list-section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .placeholder{background-color:#fdfdfd;height:5rem}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:#fcfef8;cursor:move;-webkit-transition:background .3s;transition:background .3s}.master,body{background:#fff}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .list-itemtype-project .list-itemtype-project-data-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-list-wrapper .list-itemtype-project .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.project-list-wrapper .drag{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;color:#b8b8b8;opacity:0;-webkit-transition:opacity .2s;transition:opacity .2s}.profile-timeline .single-attachment span{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child,.profile-timeline .activity-member-view a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-timeline .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32}.profile-timeline .activity-item{border-bottom:1px solid #f5f5f5;padding:1rem .5rem 1rem 0;position:relative}.profile-timeline .activity-item p{margin-bottom:0}.profile-timeline .activity-item .username,.profile-timeline .activity-item a{color:#72a114}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{color:#555}.profile-timeline .activity-item a:hover{color:#9dce0a}.profile-timeline .activity-item blockquote{line-height:1.4rem;margin-bottom:0;margin-left:calc(35px + 1rem);margin-top:.5rem;overflow-x:auto;overflow-y:hidden;white-space:pre-line}.profile-timeline .activity-item img{max-height:640px;max-width:640px}.profile-timeline .activity-item .activity-info{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#b8b8b8;font-size:.75rem;position:absolute;right:.5rem;top:1.2rem}.profile-timeline .activity-item .profile-contact-picture,.profile-timeline .activity-item .profile-member-picture{border-radius:.1rem;-webkit-flex-basis:2rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;vertical-align:center;width:2rem}.profile-timeline .activity-item .profile-contact-picture img,.profile-timeline .activity-item .profile-member-picture img{width:100%}.profile-timeline .activity-member-view{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-timeline .activity-member-view p{color:#b8b8b8}a,body{color:#424242}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.profile-timeline .single-attachment .icon{margin-right:.3rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{max-height:3rem;max-width:3rem}.markItUpEditor{font-size:.9rem;line-height:1.5;font-family:monospace}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-CondLight.woff) format("woff"),url(../fonts/OpenSans-CondLight.ttf) format("truetype"),url(../fonts/OpenSans-CondLight.svgOpenSans-CondLight) format("svg")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.eot?#iefix) format("embedded-opentype"),url(../fonts/OpenSans-Light.woff) format("woff"),url(../fonts/OpenSans-Light.ttf) format("truetype"),url(../fonts/OpenSans-Light.svgOpenSans-Light) format("svg")}@font-face{font-family:opensans-regular;src:url(../fonts/opensans-regular.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-regular.woff) format("woff"),url(../fonts/opensans-regular.ttf) format("truetype"),url(../fonts/opensans-regular.svgopensans-regular) format("svg")}@font-face{font-family:opensans-semibold;src:url(../fonts/opensans-semibold.eot?#iefix) format("embedded-opentype"),url(../fonts/opensans-semibold.woff) format("woff"),url(../fonts/opensans-semibold.ttf) format("truetype"),url(../fonts/opensans-semibold.svgopensans-semibold) format("svg")}@font-face{font-family:taiga;src:url(../fonts/taiga.eot?#iefix) format("embedded-opentype"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype"),url(../fonts/taiga.svgtaiga) format("svg")}.menu-secondary{background:#fcfdff}.menu-tertiary{background-color:#1a237e}.extrabar{background:#fcfdff}h1,h2,h3,h4,h5,h6{color:#212121}a:hover{color:#3f51b5}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{background:#EEE;border-color:#3f51b5;color:#424242}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#a4a4a4}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#a4a4a4}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#a4a4a4}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#a4a4a4}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{border:1px solid #f44336}.checksley-error-list{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(244,67,54,.7);color:#fff}blockquote{border-left:5px solid #8c9eff}blockquote,blockquote p,cite{color:#757575}.summary{background:#424242;color:#fff}.kanban-table-header .task-colum-name .icon,.taskboard-table-header .task-colum-name .icon{color:#3f51b5}.navbar{background:rgba(233,30,99,.6)}.navbar::after{background:url(../images/menu-vert.png) top left}tg-project-menu{background-color:#0d113f;background-image:none}.main-nav svg path{fill:#fff}.taskboard-table-header .task-colum-name{background:#f2f4ff;border-top:3px solid #3f51b5}.taskboard-table-body .taskboard-tasks-box{background:#EEE}.kanban-table-header .task-colum-name{background:#f2f4ff;border-top:3px solid #3f51b5}.kanban-table-body .kanban-uses-box{background:#EEE} \ No newline at end of file diff --git a/dist/v-1454396495445/styles/theme-taiga.css b/dist/v-1454396495445/styles/theme-taiga.css new file mode 100644 index 0000000..32dfa38 --- /dev/null +++ b/dist/v-1454396495445/styles/theme-taiga.css @@ -0,0 +1,4 @@ +@charset "UTF-8";.introjs-arrow,blockquote::after,blockquote::before,q::after,q::before{content:''}.pika-table,table{border-collapse:collapse;border-spacing:0}.kanban-task-minimized .task-name,h1 .date,h1 span{text-overflow:ellipsis;white-space:nowrap}.lightbox textarea,.wizard-create-project textarea,textarea{resize:vertical}.change-entry .activity-fromto,.kanban-task-maximized .task-name,.profile-bar .not-full-name,.profile-bar h1{word-wrap:break-word}.codehilite .hll{background-color:#49483e}.codehilite .c{color:#75715e}.codehilite .err{color:#960050;background-color:#1e0010}.codehilite .k{color:#66d9ef}.codehilite .l{color:#ae81ff}.codehilite .n{color:#f8f8f2}.codehilite .o{color:#f92672}.codehilite .p{color:#f8f8f2}.codehilite .c1,.codehilite .cm,.codehilite .cp,.codehilite .cs{color:#75715e}.codehilite .ge{font-style:italic}.codehilite .gs{font-weight:700}.codehilite .kc,.codehilite .kd{color:#66d9ef}.codehilite .kn{color:#f92672}.codehilite .kp,.codehilite .kr,.codehilite .kt{color:#66d9ef}.codehilite .ld{color:#e6db74}.codehilite .m{color:#ae81ff}.codehilite .s{color:#e6db74}.codehilite .na{color:#a6e22e}.codehilite .nb{color:#f8f8f2}.codehilite .nc{color:#a6e22e}.codehilite .no{color:#66d9ef}.codehilite .nd{color:#a6e22e}.codehilite .ni{color:#f8f8f2}.codehilite .ne,.codehilite .nf{color:#a6e22e}.codehilite .nl,.codehilite .nn{color:#f8f8f2}.codehilite .nx{color:#a6e22e}.codehilite .py{color:#f8f8f2}.codehilite .nt{color:#f92672}.codehilite .nv{color:#f8f8f2}.codehilite .ow{color:#f92672}.codehilite .w{color:#f8f8f2}.codehilite .mf,.codehilite .mh,.codehilite .mi,.codehilite .mo{color:#ae81ff}.codehilite .s2,.codehilite .sb,.codehilite .sc,.codehilite .sd{color:#e6db74}.codehilite .se{color:#ae81ff}.codehilite .s1,.codehilite .sh,.codehilite .si,.codehilite .sr,.codehilite .ss,.codehilite .sx{color:#e6db74}.codehilite .bp,.codehilite .vc,.codehilite .vg,.codehilite .vi{color:#f8f8f2}.codehilite .il{color:#ae81ff}.codehilite .gu{color:#75715e}.codehilite .gd{color:#f92672}.codehilite .gi{color:#a6e22e}.mCustomScrollbar{-ms-touch-action:none;touch-action:none}.mCustomScrollbar.mCS_no_scrollbar{-ms-touch-action:auto;touch-action:auto}.mCustomScrollBox{position:relative;overflow:hidden;height:100%;max-width:100%;outline:0;direction:ltr}.mCSB_container{overflow:hidden;width:auto;height:auto}.mCSB_inside>.mCSB_container{margin-right:30px}.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container{margin-right:0;margin-left:30px}.mCS-dir-rtl>.mCSB_inside>.mCSB_container.mCS_no_scrollbar_y.mCS_y_hidden{margin-left:0}.mCSB_scrollTools{position:absolute;width:16px;height:auto;left:auto;top:0;right:0;bottom:0;opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_outside+.mCSB_scrollTools{right:-26px}.mCS-dir-rtl>.mCSB_inside>.mCSB_scrollTools,.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{right:auto;left:0}.mCS-dir-rtl>.mCSB_outside+.mCSB_scrollTools{left:-26px}.mCSB_scrollTools .mCSB_draggerContainer{position:absolute;top:0;left:0;bottom:0;right:0;height:auto}.mCSB_scrollTools a+.mCSB_draggerContainer{margin:20px 0}.mCSB_scrollTools .mCSB_draggerRail{width:2px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCSB_scrollTools .mCSB_dragger{cursor:pointer;width:100%;height:30px;z-index:1}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{position:relative;width:4px;height:100%;margin:0 auto;-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px;text-align:center}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:12px}.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:8px}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonUp{display:block;position:absolute;height:20px;width:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools .mCSB_buttonDown{bottom:0}.mCSB_horizontal.mCSB_inside>.mCSB_container{margin-right:0;margin-bottom:30px}.mCSB_horizontal.mCSB_outside>.mCSB_container{min-height:100%}.mCSB_horizontal>.mCSB_container.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal{width:auto;height:16px;top:auto;right:0;bottom:0;left:0}.mCustomScrollBox+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:-26px}.mCSB_scrollTools.mCSB_scrollTools_horizontal a+.mCSB_draggerContainer{margin:0 20px}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:2px;margin:7px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger{width:30px;height:100%;left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:4px;margin:6px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:12px;margin:2px auto}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:8px;margin:4px 0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft,.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{display:block;position:absolute;width:20px;height:100%;overflow:hidden;margin:0 auto;cursor:pointer}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonLeft{left:0}.mCSB_scrollTools.mCSB_scrollTools_horizontal .mCSB_buttonRight{right:0}.mCSB_container_wrapper{position:absolute;height:auto;width:auto;overflow:hidden;top:0;left:0;right:0;bottom:0;margin-right:30px;margin-bottom:30px}.mCSB_container_wrapper>.mCSB_container{padding-right:30px;padding-bottom:30px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:20px}.mCSB_vertical_horizontal>.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:20px}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden+.mCSB_scrollTools.mCSB_scrollTools_vertical{bottom:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{right:0}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:20px}.mCS-dir-rtl>.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden+.mCSB_scrollTools~.mCSB_scrollTools.mCSB_scrollTools_horizontal{left:0}.mCS-dir-rtl>.mCSB_inside>.mCSB_container_wrapper{margin-right:0;margin-left:30px}.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden>.mCSB_container{padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden>.mCSB_container{padding-bottom:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_y.mCS_y_hidden{margin-right:0;margin-left:0}.mCustomScrollBox.mCSB_vertical_horizontal.mCSB_inside>.mCSB_container_wrapper.mCS_no_scrollbar_x.mCS_x_hidden{margin-bottom:0}.mCSB_scrollTools,.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp,.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:opacity .2s ease-in-out,background-color .2s ease-in-out;transition:opacity .2s ease-in-out,background-color .2s ease-in-out}.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerRail,.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger_bar{-webkit-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-moz-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;-o-transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out;transition:width .2s ease-out .2s,height .2s ease-out .2s,margin-left .2s ease-out .2s,margin-right .2s ease-out .2s,margin-top .2s ease-out .2s,margin-bottom .2s ease-out .2s,opacity .2s ease-in-out,background-color .2s ease-in-out}.introjs-helperLayer,.introjs-overlay{-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out}.mCS-autoHide>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide>.mCustomScrollBox~.mCSB_scrollTools{opacity:0;filter:"alpha(opacity=0)";-ms-filter:"alpha(opacity=0)"}.mCS-autoHide:hover>.mCustomScrollBox>.mCSB_scrollTools,.mCS-autoHide:hover>.mCustomScrollBox~.mCSB_scrollTools,.mCustomScrollBox:hover>.mCSB_scrollTools,.mCustomScrollBox:hover~.mCSB_scrollTools,.mCustomScrollbar>.mCustomScrollBox>.mCSB_scrollTools.mCSB_scrollTools_onDrag,.mCustomScrollbar>.mCustomScrollBox~.mCSB_scrollTools.mCSB_scrollTools_onDrag{opacity:1;filter:"alpha(opacity=100)";-ms-filter:"alpha(opacity=100)"}.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.4);filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75);filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85);filter:"alpha(opacity=85)";-ms-filter:"alpha(opacity=85)"}.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9);filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCSB_scrollTools .mCSB_buttonDown,.mCSB_scrollTools .mCSB_buttonLeft,.mCSB_scrollTools .mCSB_buttonRight,.mCSB_scrollTools .mCSB_buttonUp{background-image:url(mCSB_buttons.png);background-repeat:no-repeat;opacity:.4;filter:"alpha(opacity=40)";-ms-filter:"alpha(opacity=40)"}.mCSB_scrollTools .mCSB_buttonUp{background-position:0 0}.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -20px}.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -40px}.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -56px}.mCSB_scrollTools .mCSB_buttonDown:hover,.mCSB_scrollTools .mCSB_buttonLeft:hover,.mCSB_scrollTools .mCSB_buttonRight:hover,.mCSB_scrollTools .mCSB_buttonUp:hover{opacity:.75;filter:"alpha(opacity=75)";-ms-filter:"alpha(opacity=75)"}.mCSB_scrollTools .mCSB_buttonDown:active,.mCSB_scrollTools .mCSB_buttonLeft:active,.mCSB_scrollTools .mCSB_buttonRight:active,.mCSB_scrollTools .mCSB_buttonUp:active{opacity:.9;filter:"alpha(opacity=90)";-ms-filter:"alpha(opacity=90)"}.mCS-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:rgba(0,0,0,.85)}.mCS-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:rgba(0,0,0,.9)}.mCS-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:4px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px auto}.mCS-light-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px 0}.mCS-light-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -20px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -40px}.mCS-light-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -56px}.mCS-dark-2.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-2.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-2.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px 0}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -20px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -40px}.mCS-dark-2.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools .mCSB_draggerRail{width:4px;background-color:#fff;background-color:rgba(255,255,255,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;background-color:#fff;background-color:rgba(255,255,255,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:4px;margin:6px 0}.mCS-dark-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:6px;margin:5px auto}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-light-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-light-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px 0}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -20px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -40px}.mCS-light-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -56px}.mCS-dark-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75);-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px 0}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -20px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -40px}.mCS-dark-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -56px}.mCS-light-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.1)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:2px}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%}.mCS-dark-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-thin.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:2px;margin:7px auto}.mCS-dark-thin.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-thin.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px 0}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -20px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -40px}.mCS-dark-thin.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -56px}.mCS-rounded.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger,.mCS-rounded.mCSB_scrollTools .mCSB_dragger{height:14px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:14px;margin:0 1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger{width:14px}.mCS-rounded-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:14px;margin:1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{width:16px;height:16px;margin:-1px 0}.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:4px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded .mCSB_dragger_bar,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_dragger .mCSB_dragger_bar{height:16px;width:16px;margin:0 -1px}.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded-dark.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-rounded.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:4px;margin:6px 0}.mCS-rounded.mCSB_scrollTools .mCSB_buttonUp{background-position:0 -72px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonDown{background-position:0 -92px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonLeft{background-position:0 -112px}.mCS-rounded.mCSB_scrollTools .mCSB_buttonRight{background-position:0 -128px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.15)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-80px -72px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-80px -92px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-80px -112px}.mCS-rounded-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-80px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools_vertical .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_vertical .mCSB_draggerRail{width:4px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{background-color:transparent;background-position:center}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAANElEQVQYV2NkIAAYiVbw//9/Y6DiM1ANJoyMjGdBbLgJQAX/kU0DKgDLkaQAvxW4HEvQFwCRcxIJK1XznAAAAABJRU5ErkJggg==);background-repeat:repeat-y;opacity:.3;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-rounded-dots-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-rounded-dots.mCSB_scrollTools_horizontal .mCSB_draggerRail{height:4px;margin:6px 0;background-repeat:repeat-x}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonUp{background-position:-16px -72px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonDown{background-position:-16px -92px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonLeft{background-position:-20px -112px}.mCS-rounded-dots.mCSB_scrollTools .mCSB_buttonRight{background-position:-20px -128px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_draggerRail{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAgAAAAICAYAAADED76LAAAALElEQVQYV2NkIAAYSVFgDFR8BqrBBEifBbGRTfiPZhpYjiQFBK3A6l6CvgAAE9kGCd1mvgEAAAAASUVORK5CYII=)}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-96px -72px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-96px -92px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-100px -112px}.mCS-rounded-dots-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-100px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-y;background-image:-moz-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,right top,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(left,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to right,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{background-repeat:repeat-x;background-image:-moz-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-webkit-gradient(linear,left top,left bottom,color-stop(0,rgba(255,255,255,.5)),color-stop(100%,rgba(255,255,255,0)));background-image:-webkit-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-o-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:-ms-linear-gradient(top,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%);background-image:linear-gradient(to bottom,rgba(255,255,255,.5) 0,rgba(255,255,255,0) 100%)}.mCS-3d-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-3d.mCSB_scrollTools_vertical .mCSB_dragger{height:70px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger{width:70px}.mCS-3d-dark.mCSB_scrollTools,.mCS-3d.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{-webkit-border-radius:16px;-moz-border-radius:16px;border-radius:16px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools .mCSB_draggerRail{width:8px;background-color:#000;background-color:rgba(0,0,0,.2);box-shadow:inset 1px 0 1px rgba(0,0,0,.5),inset -1px 0 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:8px}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:8px;margin:4px 0;box-shadow:inset 0 1px 1px rgba(0,0,0,.5),inset 0 -1px 1px rgba(255,255,255,.2)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{width:100%;height:8px;margin:4px auto}.mCS-3d.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1);box-shadow:inset 1px 0 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail{box-shadow:inset 0 1px 1px rgba(0,0,0,.1)}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools{opacity:1;filter:"alpha(opacity=30)";-ms-filter:"alpha(opacity=30)"}.mCS-3d-thick-dark.mCSB_scrollTools,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer,.mCS-3d-thick.mCSB_scrollTools,.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{-webkit-border-radius:7px;-moz-border-radius:7px;border-radius:7px}.mCSB_inside+.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCSB_inside+.mCS-3d-thick.mCSB_scrollTools_vertical{right:1px}.mCS-3d-thick-dark.mCSB_scrollTools_vertical,.mCS-3d-thick.mCSB_scrollTools_vertical{box-shadow:inset 1px 0 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal,.mCS-3d-thick.mCSB_scrollTools_horizontal{bottom:1px;box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.5)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;box-shadow:inset 1px 0 0 rgba(255,255,255,.4);width:12px;margin:2px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4);height:12px;width:auto}.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#555}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerContainer{background-color:#000;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-3d-thick.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-3d-thick-dark.mCSB_scrollTools{box-shadow:inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal{box-shadow:inset 0 1px 1px rgba(0,0,0,.1),inset 0 0 14px rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 1px 0 0 rgba(255,255,255,.4),inset -1px 0 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{box-shadow:inset 0 1px 0 rgba(255,255,255,.4),inset 0 -1px 0 rgba(0,0,0,.2)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#777}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerContainer{background-color:#fff;background-color:rgba(0,0,0,.05);box-shadow:inset 1px 1px 16px rgba(0,0,0,.1)}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-minimal.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-3d-thick-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{right:0;margin:12px 0}.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools+.mCSB_scrollTools.mCSB_scrollTools_horizontal,.mCustomScrollBox.mCS-minimal-dark+.mCSB_scrollTools.mCSB_scrollTools_horizontal{bottom:0;margin:0 12px}.mCS-dir-rtl>.mCSB_outside+.mCS-minimal-dark.mCSB_scrollTools_vertical,.mCS-dir-rtl>.mCSB_outside+.mCS-minimal.mCSB_scrollTools_vertical{left:0;right:auto}.mCS-minimal-dark.mCSB_scrollTools_vertical .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_vertical .mCSB_dragger{height:50px}.mCS-minimal-dark.mCSB_scrollTools_horizontal .mCSB_dragger,.mCS-minimal.mCSB_scrollTools_horizontal .mCSB_dragger{width:50px}.mCS-minimal.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.2);filter:"alpha(opacity=20)";-ms-filter:"alpha(opacity=20)"}.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-minimal-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.5);filter:"alpha(opacity=50)";-ms-filter:"alpha(opacity=50)"}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools .mCSB_draggerRail{width:6px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px}.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-light-3.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:6px;margin:5px 0}.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_vertical.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{width:12px}.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-dark-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_dragger.mCSB_dragger_onDrag_expanded+.mCSB_draggerRail,.mCS-light-3.mCSB_scrollTools_horizontal.mCSB_scrollTools_onDrag_expand .mCSB_draggerContainer:hover .mCSB_draggerRail{height:12px;margin:2px 0}.mCS-light-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-light-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-dark-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-dark-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-dark-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-dark-3.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools .mCSB_draggerRail{width:12px;background-color:#000;background-color:rgba(0,0,0,.2)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{width:6px;margin:3px 5px;position:absolute;height:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_dragger .mCSB_dragger_bar{height:6px;margin:5px 3px;position:absolute;width:auto;top:0;bottom:0;left:0;right:0}.mCS-inset-2-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-3.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools_horizontal .mCSB_draggerRail,.mCS-inset.mCSB_scrollTools_horizontal .mCSB_draggerRail{width:100%;height:12px;margin:2px 0}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset.mCSB_scrollTools .mCSB_buttonUp{background-position:-32px -72px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset.mCSB_scrollTools .mCSB_buttonDown{background-position:-32px -92px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset.mCSB_scrollTools .mCSB_buttonLeft{background-position:-40px -112px}.mCS-inset-2.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset.mCSB_scrollTools .mCSB_buttonRight{background-position:-40px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-2-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.1)}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonUp,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonUp{background-position:-112px -72px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonDown,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonDown{background-position:-112px -92px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonLeft,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonLeft{background-position:-120px -112px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_buttonRight,.mCS-inset-dark.mCSB_scrollTools .mCSB_buttonRight{background-position:-120px -128px}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail,.mCS-inset-2.mCSB_scrollTools .mCSB_draggerRail{background-color:transparent;border-width:1px;border-style:solid;border-color:#fff;border-color:rgba(255,255,255,.2);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.mCS-inset-2-dark.mCSB_scrollTools .mCSB_draggerRail{border-color:#000;border-color:rgba(0,0,0,.2)}.mCS-inset-3.mCSB_scrollTools .mCSB_draggerRail{background-color:#fff;background-color:rgba(255,255,255,.6)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_draggerRail{background-color:#000;background-color:rgba(0,0,0,.6)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.75)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.85)}.mCS-inset-3.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#000;background-color:rgba(0,0,0,.9)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.75)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:hover .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.85)}.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger.mCSB_dragger_onDrag .mCSB_dragger_bar,.mCS-inset-3-dark.mCSB_scrollTools .mCSB_dragger:active .mCSB_dragger_bar{background-color:#fff;background-color:rgba(255,255,255,.9)}.dropdown-menu{border:1px solid #ddd;background-color:#fff}.dropdown-menu li{border-top:1px solid #ddd;padding:2px 5px}.dropdown-menu li:first-child{border-top:none}.dropdown-menu .active,.dropdown-menu li:hover{background-color:#6eb7db;color:#fff}.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#fff}.dropdown-menu{list-style:none;padding:0;margin:0}.dropdown-menu a:hover{cursor:pointer}.markItUp .markItUpButton1 a{background-image:url(../images/markitup/h1.png)}.markItUp .markItUpButton2 a{background-image:url(../images/markitup/h2.png)}.markItUp .markItUpButton3 a{background-image:url(../images/markitup/h3.png)}.markItUp .markItUpButton4 a{background-image:url(../images/markitup/bold.png)}.markItUp .markItUpButton5 a{background-image:url(../images/markitup/italic.png)}.markItUp .markItUpButton6 a{background-image:url(../images/markitup/stroke.png)}.markdown .markItUpButton7 a{background-image:url(../images/markitup/list-bullet.png)}.markdown .markItUpButton8 a{background-image:url(../images/markitup/list-numeric.png)}.markdown .markItUpButton9 a{background-image:url(../images/markitup/picture.png)}.markdown .markItUpButton10 a{background-image:url(../images/markitup/link.png)}.markdown .markItUpButton11 a{background-image:url(../images/markitup/quotes.png)}.markdown .markItUpButton12 a{background-image:url(../images/markitup/code.png)}.markdown .preview-icon a{background-image:url(../images/markitup/preview.png)}.markdown .help a{background-image:url(../images/markitup/help.png)}.markItUp *{margin:0;padding:0;outline:0}.markItUp a:link,.markItUp a:visited{color:#000;text-decoration:none}.markItUpContainer{font:11px Verdana,Arial,Helvetica,sans-serif}.markItUpEditor{font:12px 'Courier New',Courier,monospace;padding:5px;height:320px;clear:both;overflow:auto}.markItUpPreviewFrame{overflow:auto;background-color:#FFF;width:99.9%;height:300px;margin:5px 0}.markItUpFooter{width:100%}.markItUpResizeHandle{overflow:hidden;width:22px;height:5px;margin-left:auto;margin-right:auto;background-image:url(../images/markitup/handle.png);cursor:n-resize}.markItUp .markItUpHeader ul{margin:0}.markItUpHeader ul li{list-style:none;position:relative;margin:3px}.markItUpHeader ul li:hover>ul{display:block}.markItUpHeader ul .markItUpDropMenu{background:url(../images/markitup/menu.png) 115% 50% no-repeat;margin-right:5px}.markItUpHeader ul .markItUpDropMenu li{margin-right:0}.markItUpHeader ul ul{display:none;position:absolute;top:18px;left:0;background:#FFF;border:1px solid #000}.markItUpHeader ul ul li{float:none;border-bottom:1px solid #000}.markItUpHeader ul ul .markItUpDropMenu{background:url(../images/markitup/submenu.png) 100% 50% no-repeat #FFF}.markItUpHeader ul .markItUpSeparator{margin:2px 10px 0;width:1px;height:16px;overflow:hidden;background-color:#CCC}.introjs-button,button{overflow:visible}.markItUpHeader ul ul .markItUpSeparator{width:auto;height:1px;margin:0}.markItUpHeader ul ul ul{position:absolute;top:-1px;left:150px}.markItUpHeader ul ul ul li{float:none}.markItUpHeader ul a{display:block;width:16px;height:16px;text-indent:-10000px;background-repeat:no-repeat;padding:3px;margin:0}.markItUpHeader ul ul a{display:block;text-indent:0;width:120px;padding:5px 5px 5px 25px;background-position:2px 50%}.markItUpHeader ul ul a:hover{color:#FFF;background-color:#000}/*! normalize.css v3.0.1 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}mark{background:#ff0;color:#000}sub,sup{line-height:0;position:relative}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}hr{-moz-box-sizing:content-box;box-sizing:content-box}pre,textarea{overflow:auto}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}optgroup{font-weight:700}/*! + * Pikaday + * Copyright © 2014 David Bushell | BSD & MIT license | http://dbushell.com/ + */.pika-single{display:block;position:relative;width:240px;padding:8px;color:#333;background:#fff;border:1px solid #ccc;border-bottom-color:#bbb;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif}.pika-single.is-hidden{display:none}.pika-single.is-bound{position:absolute;box-shadow:0 5px 15px -5px rgba(0,0,0,.5)}.pika-title{position:relative;text-align:center}.pika-label{display:inline-block;position:relative;z-index:9999;overflow:hidden;margin:0;padding:5px 3px;font-size:14px;line-height:20px;font-weight:700;background-color:#fff}.pika-title select{cursor:pointer;position:absolute;z-index:9998;margin:0;left:0;top:5px;filter:alpha(opacity=0);opacity:0}.pika-next,.pika-prev{display:block;cursor:pointer;position:relative;outline:0;border:0;padding:0;width:20px;height:30px;text-indent:20px;white-space:nowrap;overflow:hidden;background-color:transparent;background-position:center center;background-repeat:no-repeat;background-size:75% 75%;opacity:.5}.introjs-bullets ul,.introjs-button,.pika-select{display:inline-block}.pika-next:hover,.pika-prev:hover{opacity:1}.is-rtl .pika-next,.pika-prev{float:left;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAUklEQVR42u3VMQoAIBADQf8Pgj+OD9hG2CtONJB2ymQkKe0HbwAP0xucDiQWARITIDEBEnMgMQ8S8+AqBIl6kKgHiXqQqAeJepBo/z38J/U0uAHlaBkBl9I4GwAAAABJRU5ErkJggg==)}.is-rtl .pika-prev,.pika-next{float:right;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAeCAYAAAAsEj5rAAAAU0lEQVR42u3VOwoAMAgE0dwfAnNjU26bYkBCFGwfiL9VVWoO+BJ4Gf3gtsEKKoFBNTCoCAYVwaAiGNQGMUHMkjGbgjk2mIONuXo0nC8XnCf1JXgArVIZAQh5TKYAAAAASUVORK5CYII=)}.pika-next.is-disabled,.pika-prev.is-disabled{cursor:default;opacity:.2}.pika-table{width:100%;border:0}.pika-table td,.pika-table th{width:14.285714285714286%;padding:0}.pika-table th{color:#999;font-size:12px;line-height:25px;font-weight:700;text-align:center}.pika-button{cursor:pointer;display:block;outline:0;border:0;margin:0;width:100%;padding:5px;color:#666;font-size:12px;line-height:15px;text-align:right;background:#f5f5f5}.is-today .pika-button{color:#3af;font-weight:700}.is-selected .pika-button{color:#fff;font-weight:700;background:#3af;box-shadow:inset 0 1px 3px #178fe5;border-radius:3px}.is-disabled .pika-button{pointer-events:none;cursor:default;color:#999;opacity:.3}.pika-button:hover{color:#fff!important;background:#ff8000!important;box-shadow:none!important;border-radius:3px!important}.introjs-overlay{position:absolute;z-index:999999;opacity:0;transition:all .3s ease-out}.introjs-fixParent{z-index:auto!important;opacity:1!important;position:absolute!important;-webkit-transform:none!important;-moz-transform:none!important;-ms-transform:none!important;-o-transform:none!important;transform:none!important}.introjs-showElement,tr.introjs-showElement>td,tr.introjs-showElement>th{z-index:9999999!important}.introjs-disableInteraction{z-index:99999999!important;position:absolute}.introjs-relativePosition,tr.introjs-showElement>td,tr.introjs-showElement>th{position:relative}.introjs-helperLayer{position:absolute;z-index:9999998;background-color:#FFF;background-color:rgba(255,255,255,.9);border:1px solid #777;border-radius:4px;transition:all .3s ease-out}.introjs-tooltipReferenceLayer{position:absolute;visibility:hidden;z-index:10000000;background-color:transparent;-webkit-transition:all .3s ease-out;-moz-transition:all .3s ease-out;-ms-transition:all .3s ease-out;-o-transition:all .3s ease-out;transition:all .3s ease-out}.introjs-helperLayer *,.introjs-helperLayer :after,.introjs-helperLayer :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;-ms-box-sizing:content-box;-o-box-sizing:content-box;box-sizing:content-box}.introjs-helperNumberLayer{position:absolute;visibility:visible;top:-16px;left:-16px;z-index:9999999999!important;padding:2px;font-family:Arial,verdana,tahoma;font-size:13px;font-weight:700;color:#fff;text-align:center;text-shadow:1px 1px 1px rgba(0,0,0,.3);background:#ff3019;background:-webkit-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-webkit-gradient(linear,left top,left bottom,color-stop(0,#ff3019),color-stop(100%,#cf0404));background:-moz-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-ms-linear-gradient(top,#ff3019 0,#cf0404 100%);background:-o-linear-gradient(top,#ff3019 0,#cf0404 100%);background:linear-gradient(to bottom,#ff3019 0,#cf0404 100%);width:20px;height:20px;line-height:20px;border:3px solid #fff;border-radius:50%;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3019', endColorstr='#cf0404', GradientType=0);filter:progid:DXImageTransform.Microsoft.Shadow(direction=135, strength=2, color=ff0000);box-shadow:0 2px 5px rgba(0,0,0,.4)}.introjs-arrow{border:5px solid #fff;position:absolute}.introjs-arrow.top,.introjs-arrow.top-middle,.introjs-arrow.top-right{top:-10px;border-color:transparent transparent #fff}.introjs-arrow.top-right{right:10px}.introjs-arrow.top-middle{left:50%;margin-left:-5px}.introjs-arrow.left,.introjs-arrow.right{top:10px}.introjs-arrow.right,.introjs-arrow.right-bottom{right:-10px;border-color:transparent transparent transparent #fff}.introjs-arrow.right-bottom{bottom:10px}.introjs-arrow.bottom{bottom:-10px;border-color:#fff transparent transparent}.introjs-arrow.left,.introjs-arrow.left-bottom{left:-10px;border-color:transparent #fff transparent transparent}.introjs-arrow.left-bottom{bottom:10px}.introjs-tooltip{position:absolute;visibility:visible;padding:10px;background-color:#fff;min-width:200px;max-width:300px;border-radius:3px;-webkit-transition:opacity .1s ease-out;-moz-transition:opacity .1s ease-out;-ms-transition:opacity .1s ease-out;-o-transition:opacity .1s ease-out;transition:opacity .1s ease-out}.introjs-tooltipbuttons{text-align:right;white-space:nowrap}.introjs-button{position:relative;margin:10px 0 0;text-decoration:none;font:11px/normal sans-serif;white-space:nowrap;cursor:pointer;outline:0;-webkit-background-clip:padding;-moz-background-clip:padding;-o-background-clip:padding-box;-webkit-border-radius:.2em;-moz-border-radius:.2em;zoom:1}.introjs-progress,.loader-active,.taskboard,.taskboard-inner,body.loading-project,h1 .date,h1 span{overflow:hidden}.introjs-button:hover{border-color:#bcbcbc;text-decoration:none;box-shadow:0 1px 1px #e3e3e3}.introjs-button:active,.introjs-button:focus{background-image:-webkit-gradient(linear,0 0,0 100%,from(#ececec),to(#f4f4f4));background-image:-moz-linear-gradient(#ececec,#f4f4f4);background-image:-o-linear-gradient(#ececec,#f4f4f4);background-image:linear-gradient(#ececec,#f4f4f4)}.introjs-button::-moz-focus-inner{padding:0;border:0}.introjs-skipbutton{margin-right:5px;color:#7a7a7a}.introjs-prevbutton{-webkit-border-radius:.2em 0 0 .2em;-moz-border-radius:.2em 0 0 .2em;border-radius:.2em 0 0 .2em;border-right:none}.introjs-nextbutton{-webkit-border-radius:0 .2em .2em 0;-moz-border-radius:0 .2em .2em 0;border-radius:0 .2em .2em 0}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:#9a9a9a;border-color:#d4d4d4;box-shadow:none;cursor:default;background-color:#f4f4f4;background-image:none;text-decoration:none}.introjs-bullets{text-align:center}.introjs-bullets ul{clear:both;margin:15px auto 0;padding:0}.introjs-bullets ul li{list-style:none;float:left;margin:0 2px}.introjs-bullets ul li a{display:block;width:6px;height:6px;background:#ccc;border-radius:10px;-moz-border-radius:10px;-webkit-border-radius:10px;text-decoration:none}.introjs-bullets ul li a.active,.introjs-bullets ul li a:hover{background:#999}.introjs-progress{height:10px;margin:10px 0 5px;border-radius:4px;background-color:#ecf0f1}.introjs-progressbar{float:left;width:0;height:100%;font-size:10px;line-height:10px;text-align:center;background-color:#08c}.admin-membership header a,.header-with-actions .button,.kanban .kanban-settings,.save-wiki{float:right}.introjsFloatingElement{position:absolute;height:0;width:0;left:50%;top:50%}.master,fieldset{position:relative}body,html{width:100%;min-height:100%}*{box-sizing:border-box}a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video{border:0;font:inherit;font-size:100%;margin:0;padding:0;vertical-align:baseline}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}blockquote,q{quotes:none}body{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.3}.icon{font-family:taiga}html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body .master.ng-animate{-webkit-transition:0;transition:0}.drag-active{overflow-x:hidden}.master{height:100%;min-height:100%}.menu-secondary,.menu-tertiary,.wrapper{min-height:calc(100vh - 40px)}.centered{margin:1rem auto;max-width:1200px;min-width:960px;width:90%}.wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.menu-secondary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;min-width:0;padding:1rem;width:320px}.menu-secondary.filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;padding:0;-webkit-transition:all .2s linear;transition:all .2s linear;width:0}.menu-secondary.filters-bar.active{padding:2em 1em;-webkit-transition:all .2s linear;transition:all .2s linear;width:260px}.menu-secondary.filters-bar.active .filters-inner{opacity:1;-webkit-transition:all .4s ease-in;transition:all .4s ease-in}.menu-secondary .search-in{margin-top:.5rem}.menu-tertiary{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:250px}.main{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;min-width:0;padding:1rem 2rem}.hidden{display:none!important}.header-with-actions{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.header-with-actions .action-buttons{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.header-with-actions .button{color:#fff;margin-left:10px}.header-with-actions .button:hover{color:#fff}.header-with-actions h1{margin-bottom:0}h1 span,h2{font-size:1.6rem}h1{font-size:2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin-bottom:1rem;text-transform:uppercase}@font-face{font-family:OpenSans-CondLight;src:url(../fonts/OpenSans-CondLight.ttf) format("truetype")}@font-face{font-family:OpenSans-Light;src:url(../fonts/OpenSans-Light.ttf) format("truetype")}@font-face{font-family:OpenSans-Regular;src:url(../fonts/OpenSans-Regular.ttf) format("truetype")}@font-face{font-family:OpenSans-Semibold;src:url(../fonts/OpenSans-Semibold.ttf) format("truetype")}@font-face{font-family:taiga;font-style:normal;font-weight:400;src:url(../fonts/taiga.eot);src:url(../fonts/taiga.eot?) format("eot"),url(../fonts/taiga.woff) format("woff"),url(../fonts/taiga.ttf) format("truetype")}h1,h2,h3,h4,h5,h6{font-weight:400;line-height:1.5}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{font-weight:inherit}.wysiwyg dl dt,strong{font-weight:700}h1 span{margin-right:.5rem;vertical-align:bottom}h1 span.green,h1 span:last-child{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}h1 .project-name{display:inline-block;margin-bottom:0}h1 .project-name-short{display:inline-block;max-width:40%}h1 .green{color:#72a114}h1 .date{max-width:500px;color:#b8b8b8}h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;line-height:1.2;margin-bottom:1rem}p{line-height:1.5;margin:0 0 20px}p img{margin:0}em{font-style:italic}[class*=' icon-']::before,[class^=icon-]::before,[data-icon]::before{font-family:taiga!important;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;font-style:normal!important;font-variant:normal!important;font-weight:400!important;line-height:1;speak:none;text-transform:none!important}hr{border:solid #050505;border-width:1px 0 0;clear:both;height:0;margin:10px 0 30px}a,a:visited{text-decoration:none}a:hover,a:visited:hover{-webkit-transition:color .3s linear;transition:color .3s linear}[data-icon]::before{content:attr(data-icon)}.admin-contrib .help .alt-image,.admin-third-parties .help .alt-image,.wysiwyg dl dt{font-style:italic}.icon-bug::before{content:'a'}.icon-copy::before{content:'b'}.icon-minimize::before{content:'c'}.icon-maximize::before{content:'d'}.icon-comment::before{content:'e'}.icon-plus::before{content:'f'}.icon-attachments::before{content:'g'}.icon-edit::before{content:'h'}.icon-documents::before{content:'i'}.icon-delete::before{content:'j'}.icon-arrow-bottom::before{content:'k'}.icon-arrow-left::before{content:'l'}.icon-arrow-right::before{content:'m'}.icon-arrow-up::before{content:'n'}.icon-briefcase::before{content:'o'}.icon-caret-down::before{content:'p'}.icon-caret-up::before{content:'q'}.icon-check-square::before{content:'r'}.icon-notification-error::before{content:'s'}.icon-settings::before{content:'t'}.icon-document::before{content:'u'}.icon-warning::before{content:'v'}.icon-move::before{content:'w'}.icon-drag-v::before{content:'x'}.icon-filter::before{content:'y'}.icon-help::before{content:'z'}.icon-reload::before{content:'A'}.icon-writer::before{content:'B'}.icon-stats::before{content:'C'}.icon-floppy::before{content:'D'}.icon-warning-alt::before{content:'E'}.icon-video::before{content:'F'}.icon-bulk::before{content:'G'}.icon-vunfold::before{content:'H'}.icon-tasks::before{content:'I'}.icon-kanban::before{content:'J'}.icon-search::before{content:'K'}.icon-wiki::before{content:'L'}.icon-team::before{content:'M'}.icon-vfold::before{content:'N'}.icon-issues::before{content:'O'}.icon-iocaine::before{content:'P'}.icon-archive::before{content:'Q'}.icon-capslock::before{content:'R'}.icon-upload::before{content:'S'}.icon-github::before{content:'T'}.icon-timeline::before{content:'U'}.icon-scrum::before{content:'V'}.icon-project::before{content:'W'}.icon-heart::before{content:'X'}.icon-eye::before{content:'Y'}@-webkit-keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@keyframes loading{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0}100%{-webkit-filter:blur(0);filter:blur(0);opacity:1}}@-webkit-keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes rotate{50%{-webkit-filter:invert(1);filter:invert(1);-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes formSlide{0%{-webkit-filter:blur(5px);filter:blur(5px);opacity:0;-webkit-transform:translateY(10rem);transform:translateY(10rem)}50%{-webkit-filter:blur(0);filter:blur(0)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;flex:10}}@keyframes loadBar{0%,20%{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}10%{-webkit-box-flex:10;-webkit-flex:10;-ms-flex:10;flex:10}}@-webkit-keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes dropdownFade{0%{opacity:0;-webkit-transform:translateY(-.25rem);transform:translateY(-.25rem)}60%{opacity:1}100%{-webkit-transform:translateY(0);transform:translateY(0)}}@-webkit-keyframes blink{85%{opacity:1}100%{opacity:.6}}@keyframes blink{85%{opacity:1}100%{opacity:.6}}blockquote cite,sup{font-size:.9rem}.spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32;max-height:2rem;max-width:2rem}blockquote,blockquote p{line-height:1.25rem}blockquote{margin:0 0 20px;padding:.5rem 1.25rem}blockquote cite{display:block}blockquote cite::before{content:'\2014 \0020'}ol,ul{margin-bottom:20px}ul{list-style:none}ol{list-style:decimal}sup{vertical-align:super}.icon{vertical-align:middle}.clickable{cursor:pointer}.not-clickable{cursor:default}.draggable{cursor:move}svg{height:1rem;width:1rem}.pika-single{z-index:999999}.pika-single .pika-title{color:#444}.pika-single .is-selected .pika-button{background:#72a114;border-radius:0!important;box-shadow:inset 0 1px 3px #72a114}.pika-single .is-today .pika-button{color:#72a114}.pika-single .is-today.is-selected button{color:#fff}.pika-single .pika-button:hover{background:#9dce0a!important;border-radius:0!important;box-shadow:inset 0 1px 3px #9dce0a!important}fieldset{border:0;margin:0;padding:0;width:100%}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{border:1px solid;margin:0;padding:8px;width:100%}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{-webkit-transition:border .3s linear;transition:border .3s linear}button,button:active,button:focus{border:0;outline:0}textarea{min-height:10rem}.checksley-error-list{margin-bottom:0}.checksley-error-list li{padding:.2rem}.icon-capslock{bottom:.6rem;color:#555;display:none;position:absolute;right:1rem}.auth,.error-main{bottom:0;z-index:999;left:0}.admin-membership header:after{clear:both;content:'';display:table}.admin-membership .check input{height:40px;width:85px}.admin-roles p{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#b8b8b8}.auth .logo,.auth .tagline{color:#fff;text-align:center}.admin-attributes .admin-attributes-section{margin-bottom:2rem}.admin-attributes .admin-attributes-section .checksley-error-list{height:0;position:relative}.admin-attributes .admin-attributes-section .checksley-error-list li{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,0,0,.7);position:absolute;width:100%}.admin-roles header{position:relative}.admin-roles h1{margin-bottom:0}.project-values-title{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.8em 1rem;text-transform:uppercase}.project-values-title h2{margin:0}.auth .logo,.auth .tagline,.auth form{margin-bottom:1rem}.project-values-title h2 span{margin-left:.5rem;text-transform:none}.project-values-title a{display:inline-block}.auth{background:url(../images/bg.png) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:fixed;right:0;top:0}.invitation-main .avatar,.invitation-main .invitation-container,.kanban{-webkit-box-orient:vertical;-webkit-box-direction:normal}.auth .tagline{font-size:2rem;line-height:2rem;text-transform:uppercase}.auth .logo{font-size:3rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.auth .auth-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px}.auth .logo-svg{text-align:center;width:100%}.auth .logo-svg svg{height:8rem;width:8rem}.kanban,.taskboard{height:calc(100vh - 40px)}.auth fieldset{margin-bottom:.5rem}.auth .login-text,.auth .register-text{text-align:center}.auth .login-text a:hover,.auth .register-text a:hover{color:#9dce0a}.auth .button{color:#fff;display:block;text-align:center}.auth a:hover{color:#fff}.moustache{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:moustache;animation-name:moustache;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;fill:rgba(114,161,20,.9);stroke:#9dce0a;stroke-width:1px;-webkit-transform-origin:50% 50%;transform-origin:50% 50%;-webkit-transition:.3s;transition:.3s}.moustache:hover{fill:rgba(157,206,10,.9);-webkit-transition:.3s;transition:.3s}.list-itemtype-project .icon path,.list-itemtype-project .list-itemtype-track-likers.active path,.list-itemtype-project .list-itemtype-track-watchers.active path,.list-itemtype-ticket .icon path,.list-itemtype-ticket .list-itemtype-track-likers.active path,.list-itemtype-ticket .list-itemtype-track-watchers.active path,.list-itemtype-timeline .icon path,.list-itemtype-timeline .list-itemtype-track-likers.active path,.list-itemtype-timeline .list-itemtype-track-watchers.active path,.list-itemtype-user .icon path,.list-itemtype-user .list-itemtype-track-likers.active path,.list-itemtype-user .list-itemtype-track-watchers.active path{fill:currentcolor}@-webkit-keyframes moustache{0%,30%,70%,90%{-webkit-transform:rotate(0);transform:rotate(0)}10%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}@keyframes moustache{0%,30%,70%,90%{-webkit-transform:rotate(0);transform:rotate(0)}10%{-webkit-transform:rotate(-10deg);transform:rotate(-10deg)}80%{-webkit-transform:rotate(10deg);transform:rotate(10deg)}}.backlog-menu{background:#f5f5f5;color:#050505;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.backlog-menu .trans-button{color:#050505;display:inline-block;padding:.4rem 1.5rem}.backlog-menu .trans-button.active,.backlog-menu .trans-button:hover{background:#555;color:#f5f5f5}.backlog-menu .trans-button.active:hover{background:#a2a2a2}.backlog-menu .trans-button.move-to-sprint{display:none}.invitation-main,.invitation-main .invitation-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-menu .button-bulk{margin-left:.2rem}.invitation-main{background:url(../images/invitation_bg.jpg) center center no-repeat;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-size:cover;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;z-index:999}.invitation-main .invitation-form .forgot-pass{font-size:.9rem}.invitation-main .avatar .person-name,.invitation-main .invitation-text,.invitation-main .login-form .form-header,.invitation-main .register-form .form-header{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.invitation-main .invitation-container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-width:800px;min-width:420px}.invitation-main .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.invitation-main .avatar .person-name{color:#fff}.invitation-main .avatar img{margin-bottom:.5rem;width:50px}.invitation-main .invitation-text{color:#fff;text-align:center}.invitation-main .invitation-text .project-name{font-size:2rem;display:block;text-transform:uppercase}.invitation-main .invitation-form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%;width:100%}.invitation-main .invitation-form fieldset{margin-bottom:.5rem}.invitation-main .invitation-form input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.invitation-main .invitation-form .forgot-pass{color:#b8b8b8;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.invitation-main .invitation-form .forgot-pass:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.invitation-main .login-form .form-header,.invitation-main .register-form .form-header,.invitation-main .register-text{color:#fff}.invitation-main .login-form,.invitation-main .register-form{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:1rem 3rem;text-align:center}.invitation-main .register-form fieldset:last-child{margin-bottom:1rem}.invitation-main .register-text a{color:#72a114}.invitation-main .button-auth{display:block}.invitation-main .button-blackish:hover{background:#72a114}.invitation-main .login-form{border-right:1px solid rgba(255,255,255,.3)}.issues .filters-bar{-webkit-box-flex:0;-webkit-flex:0 0 auto;-ms-flex:0 0 auto;flex:0 0 auto;width:260px}.issues .filters-inner{opacity:1;padding:1rem}.kanban{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;max-height:calc(100vh - 40px);max-width:calc(100vw - 50px)}.kanban header{min-height:70px}.kanban .burndown-container{display:none}.error-main,.taskboard-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.error-main{background:url(../images/invitation_bg.jpg) center center no-repeat;background-size:cover;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;position:fixed;right:0;top:0}.basic-table,.taskboard-inner,.us-story-main-data .us-title{-webkit-box-orient:vertical;-webkit-box-direction:normal}.error-main .error-container{color:#fff;-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;text-align:center}.error-main .logo-svg{padding:0 32%;text-align:center;width:100%}.error-main h1{color:#fff;margin-bottom:3rem}.error-main a{color:#72a114}.error-main a:hover{color:#9dce0a}.taskboard .graphics-container,.taskboard .summary,.taskboard h1{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.taskboard .graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.taskboard .graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.taskboard-inner{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%}.us-story-main-data .us-title,.us-story-main-data header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.team h2{margin:1rem 0}.team h2 span:last-child{color:#72a114}.us-story-main-data .us-title .block-desc-container,.us-story-main-data .us-title .us-related-task{font-size:.9rem}.us-story-main-data .us-title,.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{font-size:1.2rem}.us-story-main-data .us-title .us-title-text{font-size:1.6rem}.blocked-warning .blocked,.blocked-warning .icon,.issue-nav a{font-size:2rem}.blocked-warning .blocked{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.us-story-main-data .us-title,.us-story-main-data .us-title .us-number,.us-story-main-data .us-title .us-title-text{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.us-story-main-data .us-title .block-description-title,.us-story-main-data .us-title.blocked .unblock{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.card-placeholder p,.wiki .wiki-title{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32}.us-story-main-data{margin-bottom:1rem}.us-story-main-data header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.5rem}.us-story-main-data .us-title{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;background:#f5f5f5;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:.5rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear}.us-story-main-data .us-title.blocked{background:red;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:middle}.us-story-main-data .us-title.blocked .us-title-text,.us-story-main-data .us-title.blocked input{margin-bottom:.5rem}.us-story-main-data .us-title.blocked .us-name,.us-story-main-data .us-title.blocked .us-number,.us-story-main-data .us-title.blocked .us-related-task{color:#fff}.us-story-main-data .us-title.blocked a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title.blocked a:hover{color:#ff8282}.us-story-main-data .us-title.blocked .unblock{color:#fff;float:right}.us-story-main-data .us-title.blocked .unblock:hover{color:#ff8282;-webkit-transition:color .3s linear;transition:color .3s linear}.us-story-main-data .us-title p{margin-bottom:0}.us-story-main-data .us-title .us-edit-name-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.us-story-main-data .us-title .edit-subject{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%}.us-story-main-data .us-title input{background:#fff;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.us-story-main-data .us-title .save-container{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.us-story-main-data .us-title .us-title-text{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-bottom:0;max-width:92%;width:100%}.duty-content .save-container .loading-spinner,.us-story-main-data .loading-spinner{max-height:1.5rem;max-width:1.5rem}.us-story-main-data .us-title .us-title-text:hover .icon-edit{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.us-story-main-data .us-title .us-number{color:#b8b8b8;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;line-height:2.2rem;margin-right:.5rem}.us-story-main-data .us-title .us-name{color:#555;display:inline-block;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;line-height:2.2rem;padding-right:1rem;width:100%}.us-story-main-data .us-title .icon-edit,.us-story-main-data .us-title .icon-floppy{color:#b8b8b8;margin-left:.5rem}.us-story-main-data .us-title .icon-edit{opacity:0}.us-story-main-data .us-title .us-related-task{color:#b8b8b8;margin-top:.5rem}.us-story-main-data .us-title .us-related-task a{border-left:1px solid #b8b8b8;padding:0 .2rem}.us-story-main-data .us-title .us-related-task a:hover{color:#72a114}.us-story-main-data .us-title .us-related-task a:first-child{border:0}.us-story-main-data .us-title .block-description-title{color:#fff;margin-right:.5rem}.us-story-main-data .us-title .block-description{color:#fff;display:inline-block;margin-right:5rem}.basic-table,.subheader{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.blocked-warning{margin-bottom:1rem}.blocked-warning .blocked{color:red;line-height:2.5rem;margin-bottom:.5rem}.blocked-warning .icon{vertical-align:middle}.blocked-warning .block-description{color:#444;margin:0}.duty-content .edit-description,.wiki-content{margin-bottom:2rem}.issue-nav{position:absolute;right:1rem;top:1rem}.subheader{display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}@media (max-width:1280px){.subheader{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}}.subheader .ticket-created-by{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-basis:250px;-ms-flex-preferred-size:250px;flex-basis:250px}@media (max-width:1280px){.subheader .ticket-created-by{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}}.subheader .tags-block{-webkit-box-flex:3;-webkit-flex:3;-ms-flex:3;flex:3}@media (max-width:1280px){.subheader .tags-block{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}}.duty-content{position:relative}.duty-content .in-progress{cursor:progress}.duty-content:hover .view-description .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content:hover .view-description .editable{background:#f5f5f5;cursor:pointer}.duty-content:hover .view-description .no-description{color:#444}.duty-content.wysiwyg{overflow:visible}.duty-content .no-description{color:#b8b8b8}.duty-content textarea{background:#fff;height:10rem}.duty-content .save-container{position:absolute;right:1rem;top:.2rem}.duty-content .save-container:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-content .edit{color:#444}.duty-content .view-description .edit{background:#f5f5f5;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .save{top:.4rem}.duty-content .edit-description .edit{position:absolute;right:2.5rem;top:.4rem;-webkit-transition:all .2s linear;transition:all .2s linear}.duty-content .edit-description .preview{padding-top:1.5rem}.comment-list{padding:1rem}.wiki .remove{font-size:.9rem;color:#b8b8b8}.wiki .wiki-title{font-size:1.6rem}.wiki .remove:hover span{color:#444;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove:hover .icon{color:red;-webkit-transition:color .2s linear;transition:color .2s linear}.wiki .remove .icon{color:#b8b8b8;margin-right:.2rem}.wiki-content{position:relative}.wiki-content .in-progress{cursor:progress}.wiki-content.editable:hover .wysiwyg{background:#f5f5f5;cursor:pointer}.wiki-content .view-wiki-content:hover .edit{opacity:1;top:-1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .view-wiki-content .edit{background:#f5f5f5;left:0;opacity:0;padding:.2rem .5rem;position:absolute;top:0;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .icon:hover{color:#444;opacity:.3;-webkit-transition:all .2s linear;transition:all .2s linear}.wiki-content .edit-wiki-content .preview-icon{position:absolute;right:3.5rem}.wiki-content .edit-wiki-content .action-container{position:absolute;right:1rem;top:.3rem}.wiki-content .edit-wiki-content .edit{position:absolute;right:3.5rem;top:.4rem}.wiki-content .preview{padding-top:1.8rem}.avatar img{border:2px solid #fff;border-radius:8%;width:100%}.basic-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.basic-table .row,.card-placeholder .placeholder-avatar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.basic-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #ebebeb;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding:.3rem 0;text-align:left;width:100%}.basic-table .row .width-1{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.basic-table .row .width-2{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2}.basic-table .row .width-3{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.basic-table .row .width-4{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:4;-webkit-flex-grow:4;-ms-flex-positive:4;flex-grow:4}.basic-table .row .width-5{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:5;-webkit-flex-grow:5;-ms-flex-positive:5;flex-grow:5}.basic-table .row .width-6{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6}.basic-table .row .width-7{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:7;-webkit-flex-grow:7;-ms-flex-positive:7;flex-grow:7}.basic-table .row .width-8{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.basic-table .row:last-child{border-bottom:0}.beta{left:0;position:absolute;top:0;z-index:9999}.button,.button-auth,.button-blackish,.button-bulk,.button-gray,.button-green,.button-red,.trans-button,a.button-gray,a.button-green{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:0 0;border:0;border-radius:3px;color:#fff;cursor:pointer;display:inline-block;padding:.4rem 2rem;text-align:center;text-transform:uppercase;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:middle}.trans-button{font-size:1rem}.button-auth:hover,.button-blackish:hover,.button-bulk:hover,.button-gray:hover,.button-green:hover,.button-red:hover,.button:hover,.trans-button:hover{color:#fff;-webkit-transition:all .2s linear;transition:all .2s linear}.button-auth:visited,.button-blackish:visited,.button-bulk:visited,.button-gray:visited,.button-green:visited,.button-red:visited,.button:visited,.trans-button:visited{color:#fff}.button.loading span,.loading.button-auth span,.loading.button-blackish span,.loading.button-bulk span,.loading.button-gray span,.loading.button-green span,.loading.button-red span,.loading.trans-button span{-webkit-animation:loading .5s linear;animation:loading .5s linear}.admin-project-export-result .spin img,.loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.button span,.button-auth span,.button-blackish span,.button-bulk span,.button-gray span,.button-green span,.button-red span,.trans-button span{color:#fff}.button .icon,.button-auth .icon,.button-blackish .icon,.button-bulk .icon,.button-gray .icon,.button-green .icon,.button-red .icon,.trans-button .icon{color:#fff;margin-right:.3rem}.trans-button .icon,.trans-button span{color:#050505;-webkit-transition:color .2s linear;transition:color .2s linear}.trans-button.active .icon,.trans-button.active span,.trans-button:hover .icon,.trans-button:hover span{color:#72a114}.trans-button:visited{color:#050505}.submit-button{width:100%}.button-green,a.button-green{background:#72a114}.button-green.active,.button-green:hover,a.button-green.active,a.button-green:hover{background:#9dce0a;color:#fff}.button-gray,a.button-gray{background:#555}.button-gray.active,.button-gray:hover,a.button-gray.active,a.button-gray:hover{background:#9dce0a;color:#fff}.button-blackish{background:#050505;color:#f5f5f5}.button-blackish:hover{background:#050505;color:#fff}.button-red{background:#ff8282}.button-red:hover{background:red;color:#fff}.button-red .icon{color:#fff}.button-block{background:#fff;color:red}.button-block:hover{background:#ff8282;color:#fff}.button-bulk{background:#72a114;padding:.35rem .5rem}.button-bulk .icon{margin-right:0}.button-bulk:hover{background:#9dce0a}.button-auth{background:#444}.button-auth .icon,.button-auth img{font-size:1.2rem;color:#fff;margin-right:.5rem}.button-auth:hover{background:#000}.card-placeholder{background:#f0f0f0;border:1px dashed #e1e1e1;cursor:default;padding:1rem}.card-placeholder .placeholder-avatar{display:flex}.card-placeholder .image{background:#e1e1e1;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:.5rem;width:48px}.card-placeholder .text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.card-placeholder .line{background:#e1e1e1;height:1rem;margin-bottom:1rem;width:80%}.card-placeholder .line:last-child{width:40%}.card-placeholder .title{text-transform:uppercase}.card-placeholder p{color:#555;margin:0}.check{background-color:#dcdcdc;border-radius:2px;cursor:pointer;height:1.5rem;overflow:hidden;position:relative;width:65px}.check input{cursor:pointer;height:500px;left:-10px;opacity:0;position:absolute;top:-10px;width:500px;z-index:999}.check input+div{background-color:#555;height:25px;-webkit-transition:all .2s linear;transition:all .2s linear;width:50%}.check input~.check-text{font-size:.9rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#fff;position:absolute;top:.2rem}.check input~.check-yes{opacity:0;right:.5rem}.check input~.check-no{left:.5rem;opacity:.6}.check input:checked+div{background-color:#9dce0a;margin-left:50%;-webkit-transition:all .2s linear;transition:all .2s linear}.check input:checked~.check-yes{opacity:.8;right:.25rem}.check input:checked~.check-no{left:.25rem;opacity:0}.check input:disabled{cursor:auto}.check input:disabled+div{background-color:#b8b8b8}.ticket-created-by{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}@media (max-width:1280px){.ticket-created-by{-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:.5rem}}.ticket-created-by .user-avatar{-webkit-flex-basis:2rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-left:.5rem}.ticket-created-by .user-avatar img{width:100%}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block;text-align:right}.ticket-estimation .points-per-role,.wysiwyg-help{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}@media (max-width:1280px){.ticket-created-by .user-avatar{margin-left:0;margin-right:.5rem;-webkit-box-ordinal-group:2;-webkit-order:1;-ms-flex-order:1;order:1}.ticket-created-by .created-by{-webkit-box-ordinal-group:3;-webkit-order:2;-ms-flex-order:2;order:2}.ticket-created-by .created-by .created-date,.ticket-created-by .created-by .created-title{text-align:left}}.ticket-created-by .created-by .created-title{color:#72a114}.ticket-created-by .created-by .created-date{margin-left:.5rem}@media (max-width:1280px){.ticket-created-by .created-by .created-date{margin-left:0}}.drag-drop-help,.help-button,.help-markdown{font-size:.75rem}.wysiwyg-help{background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:-.5rem;padding:.25rem .5rem}.drag-drop-help{color:#555}.help-button:hover span,.help-markdown:hover span{-webkit-transition:color .2s linear;transition:color .2s linear}.help-button:hover .icon,.help-markdown:hover .icon{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.help-button .icon,.help-markdown .icon{margin-right:.2rem}.ticket-estimation .popover,.ticket-estimation .popover a,.ticket-estimation .popover.fix,.ticket-estimation .popover.fix a{font-size:.9rem}.ticket-estimation .popover,.ticket-estimation .popover.fix,.ticket-estimation .ticket-role-points .points,.ticket-estimation .ticket-role-points .role{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-estimation .points-per-role{display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.empty-burndown,.loading-bar{-webkit-box-orient:horizontal}.ticket-estimation .ticket-role-points{background:rgba(184,184,184,.2);color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.1rem;min-height:2rem;padding:.5rem 1rem;position:relative;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .ticket-role-points.clickable.active,.ticket-estimation .ticket-role-points.clickable:hover{background:rgba(157,206,10,.9);color:#f5f5f5}.ticket-estimation .ticket-role-points.clickable.active .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable.active .points,.ticket-estimation .ticket-role-points.clickable.active .role,.ticket-estimation .ticket-role-points.clickable:hover .icon-arrow-bottom,.ticket-estimation .ticket-role-points.clickable:hover .points,.ticket-estimation .ticket-role-points.clickable:hover .role{color:#f5f5f5}.ticket-estimation .ticket-role-points:last-child{background:rgba(135,155,137,.5);border-bottom:0;color:#f5f5f5}.ticket-estimation .ticket-role-points:last-child .icon-arrow-bottom,.ticket-estimation .ticket-role-points:last-child .points,.ticket-estimation .ticket-role-points:last-child .role{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;color:#f5f5f5}.ticket-estimation .ticket-role-points .icon-arrow-bottom{color:#b8b8b8;margin-left:.25rem;vertical-align:middle}.ticket-estimation .ticket-role-points .points{color:#444}.ticket-estimation .popover{background:#050505;color:#fff;display:none;left:.5rem;list-style-type:none;margin:0;padding:10px;position:absolute;top:100%;width:200px;z-index:99}.ticket-estimation .popover a{border-bottom:1px solid #444;color:#fff;padding:10px 2px}.ticket-estimation .popover a:last-child{border:0}.ticket-estimation .popover a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover a:hover.point{color:#fff}.ticket-estimation .popover:after{background:#050505;content:'';height:10px;left:10px;position:absolute;top:-5px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:10px}.ticket-estimation .popover li{display:inline-block;width:23%}.ticket-estimation .popover a{display:block;text-align:center}.ticket-estimation .popover a.active,.ticket-estimation .popover a:hover{background:#9dce0a;color:#fff}.ticket-estimation .popover.fix{background:#050505;color:#fff;display:none;left:-160px;list-style-type:none;margin:0;padding:10px;position:absolute;top:100%;width:200px;z-index:99}.ticket-estimation .popover.fix a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-estimation .popover.fix a:last-child{border:0}.ticket-estimation .popover.fix a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-estimation .popover.fix a:hover.point{color:#fff}.ticket-estimation .popover.fix:after{background:#050505;content:'';height:10px;left:90%;position:absolute;top:-5px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:10px}.single-filter{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;cursor:pointer;display:block;margin-bottom:.5rem;opacity:.5;position:relative}.single-filter:after{clear:both;content:'';display:table}.single-filter.active,.single-filter.selected,.single-filter:hover{color:#444;opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.single-filter .name,.single-filter .number{padding:8px 10px}.single-filter .name{background:#dcdcdc;display:block;width:100%}.single-filter .number{background:#c2c2c2;position:absolute;right:0;top:0}.single-filter .icon-delete{color:#444;position:absolute;right:.5rem;top:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.single-filter .icon-delete:hover{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task .avatar a,.kanban-task .task-text,.kanban-task-maximized .task-archived p,.kanban-task-maximized .task-points,.kanban-task-minimized .task-archived{font-size:.9rem}.kanban-task-minimized .icon-drag-h{font-size:1rem}.kanban-task .icon-drag-h,.kanban-task .icon-edit{font-size:1.2rem}.kanban-task .task-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.kanban-task{background:#fff8e4;border:1px solid #f1e8cd;box-shadow:none;cursor:move;margin:.2rem;position:relative}.kanban-task:last-child{margin-bottom:0}.kanban-task:hover .icon-drag-h,.kanban-task:hover .icon-edit{color:#cfc29b;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.kanban-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.kanban-task.ui-sortable-placeholder{background:#444}.kanban-task.blocked{background:red;border:1px solid #c00;color:#fff}.kanban-task.blocked a,.kanban-task.blocked span{color:#fff}.kanban-task.card-placeholder{background:#f0f0f0;border:3px dashed #e1e1e1;cursor:default}.kanban-task .kanban-tagline{border-color:#f1e8cd;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.6rem}.kanban-task .kanban-tag{border-top:.3rem solid #f1e8cd;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.kanban-task .kanban-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.kanban-task .avatar-wrapper{-webkit-flex-basis:55px;-ms-flex-preferred-size:55px;flex-basis:55px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:55px}.kanban-task .avatar-wrapper img{width:100%}.kanban-task .avatar a{text-align:center}.kanban-task .avatar img{margin:0 auto}.kanban-task .avatar img:hover{border:2px solid #72a114;-webkit-transition:border .3s linear;transition:border .3s linear}.kanban-task .task-text{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 .5rem 0 .8rem}.kanban-task .task-assigned{color:#cfc29b;display:block}.kanban-task .task-num{color:#444;margin-right:.3rem}.kanban-task .loading{bottom:.5rem;position:absolute}.kanban-task .icon-drag-h,.kanban-task .icon-edit{color:#f1e8cd;opacity:0;position:absolute;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.kanban-task .icon-drag-h:hover,.kanban-task .icon-edit:hover{color:#e0cd91;-webkit-transition:color .3s linear;transition:color .3s linear}.kanban-task-maximized .task-archived{background:#e8e8e8;padding:.5rem;text-align:left;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived:hover{background:#e1e1e1;-webkit-transition:background .3s linear;transition:background .3s linear}.kanban-task-maximized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-maximized .task-archived span{color:#b8b8b8}.kanban-task-maximized .task-archived p{color:#b8b8b8;margin:0}.kanban-task-maximized .task-archived p:last-child{color:#555;margin:.5rem 0;text-align:center}.kanban-task-maximized .icon-edit,.kanban-task-maximized .loading{bottom:.2rem;right:.5rem}.kanban-task-maximized .icon-drag-h{font-size:2rem;bottom:.2rem;cursor:move;right:45%}.kanban-task-maximized .task-points{color:#e0cd91;margin:0}.kanban-task-maximized .task-points span{display:inline-block}.kanban-task-maximized .task-points span:first-child{padding-right:.2rem}.kanban-task-maximized .task-points .points-text{text-transform:lowercase}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{line-height:1.4;text-transform:none}.kanban-task-maximized .kanban-tag{border-top:.3rem solid}.kanban-task-minimized .kanban-task-inner{padding:0 .3rem}.kanban-task-minimized .task-archived{background:#e8e8e8;padding:.3rem;text-align:left}.kanban-task-minimized .task-archived .task-archived-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.kanban-task-minimized .task-archived span{color:#b8b8b8}.kanban-task-minimized .task-archived .task-name{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.kanban-task-minimized .task-archived p{color:#b8b8b8;margin:0}.kanban-task-minimized .task-archived p:last-child{display:none}.kanban-task-minimized .task-num{vertical-align:top}.kanban-task-minimized .task-name{display:inline-block;overflow:hidden;width:135px}.kanban-task-minimized .task-points{display:none}.kanban-task-minimized .icon-drag-h,.kanban-task-minimized .icon-edit{top:1.4rem}.kanban-task-minimized .icon-edit{bottom:.2rem;right:1rem}.kanban-task-minimized .icon-drag-h{cursor:move;right:.1rem;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.kanban-task-minimized .kanban-tag{border-top:.2rem solid}.level{background-color:#b8b8b8;border-radius:9px;height:18px;margin:0 auto;width:18px}.list-itemtype-project .list-itemtype-track,.list-itemtype-ticket .list-itemtype-track,.list-itemtype-timeline .list-itemtype-track,.list-itemtype-user .extra-info,.list-itemtype-user .list-itemtype-track{font-size:.9rem}.list-itemtype-ticket h2{font-size:1rem}.list-itemtype-project h2,.list-itemtype-user h2,.loader p{font-size:1.2rem}.list-itemtype-project p,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user .extra-info,.list-itemtype-user p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.list-itemtype-project h2,.list-itemtype-ticket h2,.list-itemtype-timeline h2,.list-itemtype-user h2{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.list-itemtype-project{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.list-itemtype-project .list-itemtype-track{color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-project .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-project .list-itemtype-track-likers,.list-itemtype-project .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-track-likers .icon,.list-itemtype-project .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-project .list-itemtype-track-likers.active,.list-itemtype-project .list-itemtype-track-watchers.active{color:#72a114}.list-itemtype-project .icon svg{height:1rem;width:1rem}.list-itemtype-project h2,.list-itemtype-project p{margin-bottom:0}.list-itemtype-project .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-project .list-itemtype-avatar img{width:100%}.list-itemtype-project .list-itemtype-project-data-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-project .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.5rem;width:3rem}.list-itemtype-project .list-itemtype-project-members,.list-itemtype-project .list-itemtype-project-tags{-webkit-align-self:flex-end;-ms-flex-item-align:end;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-project .list-itemtype-project-image img{width:100%}.list-itemtype-project .list-itemtype-project-members{align-self:flex-end;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-wrap:wrap-reverse;-ms-flex-wrap:wrap-reverse;flex-wrap:wrap-reverse;margin-top:1rem}.list-itemtype-project .list-itemtype-project-members img{border-radius:.1rem;margin-right:.3rem;width:2rem}.list-itemtype-project .list-itemtype-project-tags{align-self:flex-end;display:flex;-webkit-box-flex:3;-webkit-flex:3;-ms-flex:3;flex:3;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:.5rem}.list-itemtype-project .tag{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin:0 .25rem .25rem 0;padding:.5rem}.list-itemtype-ticket h2,.list-itemtype-ticket p,.list-itemtype-timeline p,.list-itemtype-user h2,.list-itemtype-user p{margin-bottom:0}.list-itemtype-ticket,.list-itemtype-timeline,.list-itemtype-user{border-bottom:1px solid #f5f5f5;padding:.5rem 0 .5rem .5rem}.list-itemtype-ticket{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track{color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-ticket .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-ticket .list-itemtype-track-likers,.list-itemtype-ticket .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-ticket .list-itemtype-track-likers .icon,.list-itemtype-ticket .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user,.list-itemtype-user .list-itemtype-track{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.list-itemtype-ticket .list-itemtype-track-likers.active,.list-itemtype-ticket .list-itemtype-track-watchers.active{color:#72a114}.list-itemtype-ticket .icon svg{height:1rem;width:1rem}.list-itemtype-ticket .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-ticket .list-itemtype-avatar img{width:100%}.list-itemtype-ticket .ticket-project,.list-itemtype-ticket .ticket-type{margin-right:.3rem}.list-itemtype-ticket .ticket-project{color:#b8b8b8}.list-itemtype-ticket .list-itemtype-ticket-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.list-itemtype-ticket .ticket-id{color:#b8b8b8;margin-right:.3rem}.list-itemtype-ticket .ticket-blocked{color:red;margin-left:.3rem}.list-itemtype-user{display:flex}.list-itemtype-user .list-itemtype-track{color:#b8b8b8;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-user .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-user .list-itemtype-track-likers,.list-itemtype-user .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-user .list-itemtype-track-likers .icon,.list-itemtype-user .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-user .list-itemtype-track-likers.active,.list-itemtype-user .list-itemtype-track-watchers.active{color:#72a114}.list-itemtype-user .icon svg{height:1rem;width:1rem}.list-itemtype-user .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.list-itemtype-user .list-itemtype-avatar img{width:100%}.list-itemtype-user .extra-info{margin-top:.25rem}.list-itemtype-timeline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track{color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.list-itemtype-timeline .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.list-itemtype-timeline .list-itemtype-track-likers,.list-itemtype-timeline .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.list-itemtype-timeline .list-itemtype-track-likers .icon,.list-itemtype-timeline .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.list-itemtype-timeline .list-itemtype-track-likers.active,.list-itemtype-timeline .list-itemtype-track-watchers.active{color:#72a114}.list-itemtype-timeline .icon svg{height:1rem;width:1rem}.list-itemtype-timeline .list-itemtype-avatar img,.loader{width:100%}.list-itemtype-timeline h2{margin-bottom:0}.admin-menu li,.empty-backlog .title,.empty-burndown .title,.sprints-empty .title,.taskboard-table-header .task-colum-name,.ticket-header .detail-status-inner,.ticket-header .ticket-title,.wysiwyg h1,.wysiwyg h2,.wysiwyg h3,tg-project-menu{text-transform:uppercase}.list-itemtype-timeline .list-itemtype-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:.75rem;min-width:3rem}.loader p{color:#555;text-align:center}.loader{background-color:#fff;bottom:0;display:none;height:100%;left:0;opacity:0;position:fixed;right:0;top:0;z-index:-100}.loader .container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:100%;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;width:100%}.loader.active{background-color:rgba(255,255,255,.95);display:block;opacity:1;z-index:99900}.loading-bar,.notification-light{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.loading-bar{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.loading-bar .item{-webkit-animation-duration:5s;animation-duration:5s;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite;-webkit-animation-name:loadBar;animation-name:loadBar;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;background:#555;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;height:5px}.loading-bar .item-0{-webkit-animation-delay:0s;animation-delay:0s;background:#bbe831}.loading-bar .item-1{-webkit-animation-delay:1s;animation-delay:1s;background:#237400}.loading-bar .item-2{-webkit-animation-delay:2s;animation-delay:2s;background:#e43050}.loading-bar .item-3{-webkit-animation-delay:3s;animation-delay:3s;background:#810061}.loading-bar .item-4{-webkit-animation-delay:4s;animation-delay:4s;background:#618000}.loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;-webkit-transform-origin:32 32;transform-origin:32 32}.markItUpHeader ul{background:#f5f5f5;padding:.3rem}.markItUpHeader ul li{display:inline-block;float:none}.markItUpHeader ul li a{opacity:.8}.markItUpHeader ul li a:hover{opacity:.3;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.markItUpHeader ul .preview-icon{position:absolute;right:2.5rem}.markItUpContainer{padding:0}.markdown{position:relative}.preview .actions{background:#f5f5f5;margin-top:.5rem;min-height:2rem;padding:.3rem}.notification-light p{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.notification-message-success .warning{font-size:1.2rem;color:#fff;line-height:1.2}.notification-message-error .warning{font-size:2rem;color:#fff;line-height:2.4rem}.notification-message-error .icon-notification-error{font-size:3rem;display:inline;vertical-align:sub}.notification-message-error .warning,.notification-message-success .warning{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.notification-message-success{background:rgba(157,206,10,.95);box-shadow:0 25px 10px -15px rgba(0,0,0,.05);opacity:1;right:-370px;top:2%;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;width:370px}.notification-message-success.active{-webkit-animation:animSlide 2s linear both;animation:animSlide 2s linear both;opacity:1}.notification-message-success p{margin:0}@-webkit-keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}@keyframes animSlide{0%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1)}0.52%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-34.485,0,0,1)}1.02%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-66.555,0,0,1)}2.28%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-141.457,0,0,1)}3.52%{-webkit-transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1);transform:matrix3d(1.281,0,0,0,0,1,0,0,0,0,1,0,-205.594,0,0,1)}4.1%{-webkit-transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1);transform:matrix3d(1.111,0,0,0,0,1,0,0,0,0,1,0,-232.117,0,0,1)}4.78%{-webkit-transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1);transform:matrix3d(1.034,0,0,0,0,1,0,0,0,0,1,0,-260.381,0,0,1)}6.03%{-webkit-transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1);transform:matrix3d(.947,0,0,0,0,1,0,0,0,0,1,0,-304.285,0,0,1)}8.11%{-webkit-transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1);transform:matrix3d(.986,0,0,0,0,1,0,0,0,0,1,0,-357.804,0,0,1)}11.03%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-399.29,0,0,1)}12.11%{-webkit-transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1);transform:matrix3d(1.001,0,0,0,0,1,0,0,0,0,1,0,-407.374,0,0,1)}16.04%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.343,0,0,1)}16.12%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-417.342,0,0,1)}20%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-413.214,0,0,1)}27.23%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-403.135,0,0,1)}38.34%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-399.585,0,0,1)}60.56%{-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400.01,0,0,1)}82.78%{opacity:1;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}100%{opacity:0;-webkit-transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1);transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,-400,0,0,1)}}.notification-message-error{background:rgba(255,0,0,.9);top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%);width:100%}.notification-message-error.active{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error.inactive{-webkit-transition:all .6s ease-in-out;transition:all .6s ease-in-out}.notification-message-error .text{display:inline-block;margin-left:.5rem;width:80%}.notification-light p,.notification-message-error .text p{margin:0}.notification-message-error .icon-delete{color:#fff;position:absolute;right:1rem;top:1rem}.notification-message{color:#fff;opacity:0;padding:1rem;position:fixed;z-index:99920}.notification-light{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(184,184,184,.95);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;opacity:0;padding:1rem;position:absolute;top:0;-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s;width:100%;z-index:99999}.paginator ul,.summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.notification-light.inactive{opacity:0;-webkit-transform:translateY(-100%);transform:translateY(-100%);-webkit-transition:all .6s;transition:all .6s}.notification-light.active{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:all .6s;transition:all .6s}.notification-light .warning{color:#fff;line-height:1.5rem}.notification-light .close{margin-right:1rem;width:2rem}.notification-light .close path{fill:#fff}.notification-message-light-error{background:rgba(255,0,0,.8)}.paginator{margin:2rem 0}.paginator ul{display:flex;margin-left:1rem}.paginator li{margin-right:.4rem}.paginator .active span,.paginator .dots,.paginator a{background:#b8b8b8;color:#fff;padding:.5rem 1rem;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator a:hover{background:#050505;color:#fff;-webkit-transition:all .3s linear;transition:all .3s linear}.paginator .active span{background:#9dce0a}.paginator .dots{background:0 0;color:#b8b8b8}.v-pagination-list{overflow:hidden}.v-pagination-next,.v-pagination-previous{background-color:#555;color:#f5f5f5;display:block;padding:.1rem 0;text-align:center;visibility:hidden;width:100%}.select-color,.select-color:after{background:#050505;position:absolute}.v-pagination-next:hover,.v-pagination-previous:hover{background-color:#050505;-webkit-transition:background .3s linear;transition:background .3s linear}.popover.pop-points-open.horizontal li{white-space:nowrap;width:100%}.private{display:inline-block;margin-left:.5rem;width:.5rem}.private svg{width:1rem;height:1rem}.private path{fill:#b8b8b8;-webkit-transition:fill .3s linear;transition:fill .3s linear}.select-color,.select-color a{font-size:.9rem}.select-color input{font-size:1rem}.select-color{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#fff;display:none;left:50px;list-style-type:none;margin:0;top:0;width:323px;z-index:99;border-radius:0 10px 10px 0;padding:15px}.select-color a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.select-color a:last-child{border:0}.select-color a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.select-color a:hover.point{color:#fff}.select-color:after{content:'';height:15px;left:-7px;top:13px;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:15px}.select-color li{float:left;margin:0 .5rem .5rem 0}.select-color li:nth-child(7n){margin-right:0}.select-color li:nth-last-child(-n+7){margin-bottom:0}.select-color .color{background-color:#b8b8b8;border-radius:2px;cursor:pointer;height:35px;width:35px}.select-color ul{float:left;margin-bottom:1rem}.select-color input{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background-color:#f5f5f5;width:243px}.select-color input::-webkit-input-placeholder{color:#555}.select-color input::-moz-placeholder{color:#555}.select-color input:-moz-placeholder{color:#555}.select-color input:-ms-input-placeholder{color:#555}.select-color .selected-color{background:#b8b8b8;border-radius:2px;cursor:pointer;float:right;height:40px;width:40px}.settings-nav{padding:0;width:250px}.settings-nav .active{background:#fff}.summary .description{font-size:.9rem}.empty-burndown .title{font-size:1.2rem}.empty-burndown,.empty-burndown .title,.summary .description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.empty-burndown a,.summary .number{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.summary{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-bottom:2rem;padding:1em}.summary .summary-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 .5rem}.summary .data .number{color:#9dce0a}.summary .number{font-size:2rem;line-height:.9;margin-right:.3rem}.summary .description{line-height:1}.summary .stats{cursor:pointer;height:2rem;margin-left:auto;width:2rem}.summary .stats path{opacity:1}.summary .stats:hover .color-line,.summary .stats:hover .graph{fill:#9dce0a;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats.active .graph,.summary .stats.active svg,.summary .stats:hover svg{fill:#72a114}.summary .stats.active .color-line,.summary .stats.active .white-line{display:none}.summary .stats svg{fill:#000;height:100%;max-height:2rem;max-width:2rem;-webkit-transition:all .2s;transition:all .2s;width:100%}.summary .stats .color-line,.summary .stats .graph{fill:#858585;-webkit-transition:fill .2s;transition:fill .2s}.summary .stats .white-line{fill:#444}.summary .stats .color-line,.summary .stats .white-line{display:block}.summary-progress-bar{background:#fff;height:30px;margin-bottom:0;margin-right:10px;padding:3px;position:relative;width:15%}.summary-progress-bar .current-progress{background:#9dce0a;height:24px}.summary-progress-bar .defined-points{background:#ff8282;height:24px;position:absolute;width:calc(100% - 6px)}.summary-progress-bar .project-points-progress{background:#fff;height:24px;position:absolute}.summary-progress-bar .closed-points-progress{background:#9dce0a;height:24px;position:absolute}.large-summary{-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.large-summary .large-summary-wrapper{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.large-summary .summary-progress-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.empty-burndown,.taskboard-task .taskboard-tagline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.large-summary .summary-progress-bar{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;min-width:200px}.empty-burndown,.upvote-btn{-webkit-align-content:center;-ms-flex-line-pack:center}.large-summary .summary-stats{margin-right:1rem}.large-summary .summary-stats:last-child{border:0;margin:0}.large-summary .summary-stats-divider{margin-right:2rem}.large-summary .icon{font-size:1.4rem;margin-right:.4rem}.large-summary .icon.icon-stats{color:#72a114;float:right;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.large-summary .icon.icon-stats.active{color:#9dce0a}.large-summary .icon.icon-stats.active:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.empty-burndown{align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(135,155,137,.15);display:flex;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:1rem;padding:2rem 6rem}.empty-burndown svg{-webkit-flex-basis:5rem;-ms-flex-preferred-size:5rem;flex-basis:5rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;width:5rem}.empty-burndown p{margin:0}.empty-burndown .empty-text{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.empty-burndown .title{color:#879b89;margin:0}.empty-burndown path{fill:#879b89}.empty-burndown a{-webkit-animation:blink 2s infinite;animation:blink 2s infinite}.graphics-container{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.wysiwyg,.wysiwyg .codehilite{overflow:auto}.graphics-container.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:300px}.graphics-container.shown{max-height:300px;-webkit-transition:none;transition:none}.tag,.tags-block .add-tag-text,.tags-block .tag{font-size:.9rem}.tags-block .icon-plus{font-size:1.2rem}.tag{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:#f5f5f5;border-radius:0 5px 5px 0;color:#444;display:inline-block;margin:0 .5rem .5rem 0;padding:.5rem;text-align:center}.tag .icon-delete{color:#b8b8b8;margin-left:1rem}.tag .icon-delete:hover{color:red}.ui-autocomplete{background:#fff;border:1px solid #b8b8b8;z-index:99910}.ui-autocomplete .ui-state-focus{background:#9dce0a}.ui-autocomplete li{cursor:pointer}.ui-helper-hidden-accessible{display:none}.tags-block .tags-container{display:inline-block}.tags-block input{margin-right:.25rem;padding:.4rem;width:14rem}.tags-block input+.icon-floppy{margin-left:.5rem}.tags-block .tag{margin:0 .5rem .5rem 0;padding:.5rem}.tags-block .add-tag{color:#b8b8b8}.tags-block .add-tag:hover{color:#9dce0a}.taskboard-task .task-assigned,.taskboard-task .taskboard-text,.taskboard-task .taskboard-user-avatar a{font-size:.9rem}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit,.taskboard-task .icon-iocaine{font-size:1.2rem}.taskboard-task .task-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.assigned-to-list .user-list-name,.ticket-watchers .user-list-name,.watch-options a{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.taskboard-task{background:#fff8e4;border:1px solid #f1e8cd;box-shadow:none;cursor:move;margin:.2rem;position:relative}.taskboard-task:hover .icon-drag-h,.taskboard-task:hover .icon-edit{color:#cfc29b;display:block;opacity:1;-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task.ui-sortable-helper{box-shadow:1px 1px 15px rgba(0,0,0,.4);-webkit-transition:box-shadow .3s linear;transition:box-shadow .3s linear}.taskboard-task.ui-sortable-placeholder{background:#444}.taskboard-task .blocked{background:red;border:1px solid #c00;color:#fff}.taskboard-task .blocked a,.taskboard-task .blocked span,.taskboard-task .blocked:hover .icon-drag-h,.taskboard-task .blocked:hover .icon-edit{color:#fff}.taskboard-task.card-placeholder{background:#f0f0f0;border:3px dashed #e1e1e1;cursor:default}.taskboard-task .taskboard-tagline{border-color:#f1e8cd;display:flex;height:.6rem}.taskboard-task .taskboard-tag{border-top:.3rem solid #f1e8cd;-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;height:.6rem;z-index:90}.taskboard-task .taskboard-task-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.taskboard-task .taskboard-user-avatar{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:55px}.taskboard-task .taskboard-user-avatar a{display:block;text-align:center}.taskboard-task .taskboard-user-avatar img{margin:0 auto}.taskboard-task .taskboard-user-avatar img:hover{border:2px solid #72a114;-webkit-transition:border .3s linear;transition:border .3s linear}.taskboard-task .iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.taskboard-task .icon-iocaine{background:#000;border-radius:5px;color:#fff;left:.2rem;padding:.1rem;position:absolute;top:1rem}.taskboard-task .task-assigned{color:#cfc29b;display:block}.taskboard-task .task-assigned:hover{color:#72a114}.taskboard-task .task-num{color:#444;margin-right:.5em}.taskboard-task .taskboard-text{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;padding:0 .5rem 0 1rem;word-wrap:break-word}.taskboard-task .icon{-webkit-transition:color .3s linear,opacity .3s linear;transition:color .3s linear,opacity .3s linear}.taskboard-task .loading{bottom:.5rem;position:absolute}.taskboard-task .icon-drag-h,.taskboard-task .icon-edit{bottom:.5rem;color:#f1e8cd;opacity:0;position:absolute}.taskboard-task .icon-drag-h:hover,.taskboard-task .icon-edit:hover{color:#cfc29b}.taskboard-task .icon-edit,.taskboard-task .loading{right:1rem}.taskboard-task .icon-drag-h{font-size:2rem;cursor:move;right:45%}.task-drag{box-shadow:1px 1px 15px 6px rgba(0,0,0,.1)}.track-buttons-container{font-size:.9rem;position:relative}.track-button{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;position:relative}.track-button .track-inner{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;background:#f5f5f5;border-radius:4px 0 0 4px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;margin-right:.1rem;min-width:140px}.track-button .track-button-counter,.watch-options a{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.track-button .track-inner:hover{background:#e8e8e8;-webkit-transition:background .3s;transition:background .3s}.track-button .track-inner span{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center}.track-button .track-inner .icon-arrow-up{margin-left:auto;padding:0 .5rem;-webkit-transform:rotate(180deg);transform:rotate(180deg)}.track-button:hover{color:#050505}.track-button.active .track-inner{background:rgba(157,206,10,.2)}.track-button.active .track-icon path{fill:#72a114}.track-button.watch-container{margin-right:1rem;position:relative}.track-button .track-icon{padding:.3rem .6rem .3rem .75rem}.track-button .track-icon svg{height:1.1rem;position:relative;top:2px;width:1.1rem}.track-button .track-icon path{fill:#444}.track-button .track-button-counter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;min-width:2rem}.like-button.active.is-hover .track-inner,.watch-button.active.is-hover .track-inner{background:red;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.like-button.active.is-hover path,.watch-button.active.is-hover path{fill:#ff8282}.watch-options{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) alternate;background:rgba(0,0,0,.9);border-radius:4px;margin:2.5rem 0 0;min-width:300px;padding:1rem;position:absolute;right:0;top:0;z-index:99}.watch-options.hidden{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) reverse}.watch-options li{margin:0}.assigned-to-list,.ticket-watchers{margin-top:1rem}.watch-options li:last-child a{border:0}.watch-options a{border-bottom:1px solid rgba(184,184,184,.3);color:#fff;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 0}.assigned-to-list .user-list-single,.upvote-btn{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.watch-options a.active{color:#9dce0a}.watch-options .watch-check{height:1.25rem;width:1.25rem}.watch-options .watch-check path{fill:#9dce0a}.upvote-btn{align-content:center;-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-right:.3rem}.upvote-btn .vote-inner{background:#f5f5f5;color:#b8b8b8;display:block;padding:1rem;text-align:center}.upvote-btn a:hover{background:#e8e8e8;color:#879b89;-webkit-transition:background .3s;transition:background .3s}.upvote-btn a:hover path{fill:#879b89}.upvote-btn a.active{background:rgba(157,206,10,.2);color:#72a114;-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.active path{fill:#72a114}.upvote-btn a.is-hover{background:red;color:#f5f5f5}.upvote-btn a.is-hover svg{-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .3s;transition:all .3s}.upvote-btn a.is-hover path{fill:#ff8282}.upvote-btn svg{height:1rem;width:1rem}.assigned-to-list .user-list-avatar img,.ticket-watchers .user-list-avatar img{width:100%}.upvote-btn span{display:block}.upvote-btn path{fill:#b8b8b8}.assigned-to-list .user-list-single{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #f5f5f5;display:flex;padding:.25rem 0;vertical-align:middle}.assigned-to-list .user-list-single:last-child{border:0}.assigned-to-list .user-list-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.assigned-to-list .user-list-name{color:#444;margin-left:.5rem}.assigned-to-list .user-list-single.selected,.assigned-to-list .user-list-single:hover{background:#f3fbe1;cursor:pointer}.assigned-to-list .user-list-single:hover{-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.assigned-to-list .user-list-single.is-active{background:#edfad4;cursor:pointer;margin-bottom:1rem;position:relative;-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.1s;transition-delay:.1s}.assigned-to-list .user-list-single.is-active .icon-delete{opacity:1;position:absolute;right:1rem;top:1.5rem;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .user-list-single{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:0 0;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.25rem 0;vertical-align:middle}.ticket-watchers .user-list-single:last-child{border:0}.ticket-watchers .user-list-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;margin-right:.25rem;max-width:3rem}.ticket-watchers .user-list-name{color:#444;margin-left:.5rem;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative}.ticket-watchers .user-list-single:hover .icon-delete{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.ticket-watchers .icon-delete{opacity:0;position:absolute;right:.5rem;top:0;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.ticket-watchers .icon-delete:hover{color:red;-webkit-transition:color .3s ease-in;transition:color .3s ease-in}.wysiwyg code,.wysiwyg pre{font-size:.9rem}.wysiwyg h2{font-size:1.2rem}.wysiwyg h1{font-size:2rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.wysiwyg h2,.wysiwyg h3{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.wysiwyg{line-height:1.4rem;margin-bottom:2rem;padding:1rem}.wysiwyg h1{line-height:2.5rem}.wysiwyg h2{margin-bottom:.5rem}.wysiwyg ol,.wysiwyg ul{list-style-position:outside;margin-left:1rem}.wysiwyg ul{list-style-type:disc}.wysiwyg dl dt{font-size:1em;margin-top:16px;padding:0}.wysiwyg dl dd{margin-bottom:16px;padding:0 16px}.wysiwyg p,.wysiwyg table{margin-bottom:1rem}.wysiwyg a{color:#72a114}.wysiwyg a:hover{color:#9dce0a}.wysiwyg code,.wysiwyg pre{background:#5e5e5e;color:#f5f5f5;direction:ltr;font-family:'courier new',monospace;margin-bottom:1rem;overflow:auto;unicode-bidi:embed;white-space:pre}.admin-functionalities .functionality .title,.admin-membership-table .avatar .name,.admin-membership-table .title,.custom-fields-table .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-membership-table .avatar figcaption span,.admin-submenu ul a span,.admin-submenu-roles .single-role,.admin-webhooks .webhook-url span,.custom-fields-table .custom-description{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.wysiwyg pre{line-height:1.4rem;padding:.5rem}.wysiwyg table{border:1px solid #b8b8b8}.wysiwyg table tbody tr:last-child{border-bottom:0}.wysiwyg tr{border-bottom:#b8b8b8 1px solid}.wysiwyg th{border-right:#b8b8b8 1px solid;padding:1rem 1rem 1rem .5rem}.wysiwyg th:last-child{border-right:0}.wysiwyg td{border-right:#b8b8b8 1px solid;padding:.5rem}.wysiwyg td:last-child{border-right:0}.wysiwyg img{max-width:100%}.wysiwyg textarea{background:#fff;max-height:none}.admin-common header h1{margin-bottom:0}.admin-common .admin-subtitle{color:#b8b8b8;margin-bottom:2rem}.admin-common .total{font-size:1.2rem;background-color:#f5f5f5;color:#444;padding:.3rem 1rem}.admin-common .total:hover .edit-value{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-field-options{margin-bottom:1rem;text-align:right}.custom-fields-table{margin-bottom:2em}.custom-fields-table .row{border-bottom:0;padding:.5rem 0}.custom-fields-table .table-header{border-bottom:3px solid #f5f5f5}.custom-fields-table .table-header .custom-description span,.custom-fields-table .table-header .custom-name span{padding-left:1.1rem}.custom-fields-table .table-body form:last-child .row{border:0}.custom-fields-table .table-body .row:hover{background:rgba(157,206,10,.05);cursor:move;-webkit-transition:background .2s linear;transition:background .2s linear}.custom-fields-table .table-body .row:hover .custom-options,.custom-fields-table .table-body .row:hover .icon-drag-v{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.custom-fields-table .table-body form.row:hover{background:0 0;cursor:default}.custom-fields-table .table-body .custom-description{color:#b8b8b8}.custom-fields-table .single-custom-field{border-bottom:1px solid #f5f5f5;color:#555}.custom-fields-table .icon-drag-v{color:#b8b8b8;opacity:0;padding:0 .1rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .icon-drag-v:hover{color:#555;cursor:move;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-description,.custom-fields-table .custom-name{color:#555;margin-right:.5rem}.custom-fields-table .custom-name{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.custom-fields-table .custom-description{max-width:100%;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.custom-fields-table .custom-field-type{-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.custom-fields-table .custom-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;opacity:0;text-align:center}.custom-fields-table .custom-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.custom-fields-table .custom-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.custom-fields-table .custom-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.custom-fields-table form .custom-options-wrapper{opacity:1}.admin-functionalities form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.admin-functionalities .functionality{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-bottom:.3rem;margin-right:.3rem;opacity:.5;padding:1rem;position:relative;-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:top;width:32%}.admin-functionalities .functionality.active{background-color:rgba(114,161,20,.3);opacity:1}.admin-functionalities .functionality .icon{font-size:3rem;-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;margin:0 auto;min-width:60px}.admin-functionalities .functionality .desc{text-align:center;width:100%}.admin-functionalities .functionality .activate-input{display:none}.admin-functionalities .functionality .activate-input+label{color:#fff;cursor:pointer;display:block;text-align:center}.admin-functionalities .functionality .title{display:block}.admin-functionalities .functionality select{margin-top:1rem}.admin-functionalities .videoconference-attributes select{margin-bottom:.5rem}.admin-functionalities .button-green{color:#fff;display:block;text-align:center}.admin-membership-table .row-admin label{font-size:.9rem}.admin-membership-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.admin-membership-table .avatar figcaption{margin-left:1rem;width:75%}.admin-membership-table .avatar figcaption span{width:100%}.admin-membership-table .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:35px}.admin-membership-table .avatar .email,.admin-membership-table .avatar .name{display:block;width:100%}.admin-membership-table .avatar .email{color:#b8b8b8}.admin-membership-table .header-role,.admin-membership-table .header-status{padding-left:.5rem}.admin-membership-table .row-role{padding-right:1rem}.admin-membership-table .row-status{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.admin-membership-table .active,.admin-membership-table .resend{padding:.4rem .5rem}.admin-membership-table .active{background-color:#f5f5f5}.admin-membership-table .resend{background-color:#72a114;color:#fff}.admin-membership-table .resend:hover{background-color:#9dce0a;color:#fff;-webkit-transition:background-color .3s linear;transition:background-color .3s linear}.admin-membership-table .delete{font-size:1.2rem;color:#b8b8b8}.admin-membership-table .delete:hover{color:red}.admin-membership-table .pending{color:#ff8282}.admin-membership-table .row-admin input{vertical-align:middle}.admin-membership-table .header-member,.admin-membership-table .header-role,.admin-membership-table .row-member,.admin-membership-table .row-role{-webkit-flex-basis:210px;-ms-flex-preferred-size:210px;flex-basis:210px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3;min-width:210px}.admin-membership-table .header-admin,.admin-membership-table .row-admin{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;min-width:70px}.admin-membership-table .header-status,.admin-membership-table .row-status{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.admin-menu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #dcdcdc}.admin-menu li:last-child{border-bottom:0}.admin-menu a{display:block;padding:1rem 0 1rem 1rem}.admin-project-export-result .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;-webkit-transform-origin:32 32;transform-origin:32 32}.project-details .loading-spinner,.ticket-assigned-to .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.admin-project-export-buttons{margin:2rem 0 1rem}.admin-project-export-result{margin-top:1rem}.admin-project-export-result .spin{margin:0 auto;width:2.5rem}.admin-project-export-result .spin img{width:100%}.admin-project-export-result h3{font-size:1.2rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin:.5rem;padding:.5rem;text-align:center}.admin-roles .general-category,.admin-roles .role-name,.project-details .looking-for-people,.project-details label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.admin-project-export-result p{color:#b8b8b8;margin:.5rem 0;text-align:center}.project-details .delete-project:hover,.project-details .use-default-image:hover{color:red}.project-details .delete-project,.project-details .private-or-public,.project-details .use-default-image{font-size:.75rem}.project-details .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;border:0;-webkit-transform-origin:center center;transform-origin:center center}.project-details form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-details fieldset{margin-bottom:1rem}.project-details label{display:block;margin-bottom:.2rem}.project-details .project-details-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.project-details .project-details-image .image{width:100%}.project-details .change-image{display:block}.project-details .image-container{position:relative;margin-bottom:.5rem}.project-details .loading-overlay{display:none}.project-details .loading-overlay.active{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.project-details .use-default-image{display:block;margin-top:.25rem;text-align:center}.project-details .project-details-form-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.project-details form{display:block}}.project-details .looking-for-people{border-bottom:1px solid #f5f5f5;border-top:1px solid #f5f5f5;padding:1rem 0}.project-details .looking-for-people-selector{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-details .looking-for-people-selector svg{width:1rem;height:1rem;fill:#b8b8b8;margin-left:.5rem}.project-details .looking-for-people-selector .check{margin-left:auto}.project-details .looking-for-people-reason{display:block;margin-top:1rem}.project-details .looking-for-people-reason.ng-hide-remove-active{-webkit-animation:dropdownFade .3s;animation:dropdownFade .3s}.project-details .looking-for-people-reason.ng-hide-add-active{-webkit-animation:dropdownFade .2s reverse;animation:dropdownFade .2s reverse;-webkit-animation-delay:.1s;animation-delay:.1s}.project-details .delete-project{display:block;margin-top:1rem;text-align:right}.project-details .private-or-public{color:#b8b8b8;margin-bottom:2rem}.project-details .private-or-public svg{width:1.1rem;height:1.1rem;fill:#b8b8b8;margin-right:.5rem;vertical-align:middle}.project-privacy-settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.project-privacy-settings .privacy-option{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-transition:.2 linear;transition:.2 linear}.project-privacy-settings .privacy-option:first-child{margin-right:.5rem}.project-privacy-settings input[type=radio],.project-privacy-settings input[type=text]{display:none}.project-privacy-settings label{background:#f5f5f5;color:#444;text-align:center;-webkit-transition:all .2s linear;transition:all .2s linear}.project-privacy-settings label:hover{background:rgba(157,206,10,.4);color:#444}.project-privacy-settings label:hover svg{fill:#444}.project-privacy-settings label svg{width:1.1rem;height:1.1rem;fill:#444;margin-left:.5rem;vertical-align:middle}.project-privacy-settings .privacy-project:checked+label{background:#9dce0a;color:#fff}.project-privacy-settings .privacy-project:checked+label svg{width:1.1rem;height:1.1rem;fill:#fff}.project-privacy-settings .privacy-project:checked~input[type=text]{display:block}.admin-roles .general-category{font-size:.9rem}.admin-roles .edit-value{font-size:1rem}.admin-roles .role-name{font-size:2rem;color:#444}.admin-roles .edit-value{color:#b8b8b8;cursor:pointer;margin-left:.5rem;opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-roles .edit-role{background-color:#f5f5f5;display:none;margin-bottom:1rem;padding:.3rem 1rem}.admin-roles .edit-role input{background-color:#fff;width:50%}.admin-roles .edit-role .icon-floppy{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .edit-role .icon-floppy:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.admin-roles .any-computable-role{background:red;color:#fff;margin-bottom:.5rem;padding:.5rem}.admin-roles .general-category{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;padding-bottom:2rem}.admin-roles .general-category .check{margin-left:.5rem}.admin-roles .general-category .check input{height:40px;width:85px}.admin-submenu-roles .single-role{max-width:175px;display:inline-block}.admin-submenu li{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.admin-contrib .help .alt-image,.admin-contrib .help code,.admin-contrib .select-input-text .help-copy,.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-response-body span,.admin-webhooks .history-single-response-header a{font-size:.9rem}.admin-submenu li:last-child{border-bottom:0}.admin-submenu ul a{color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1rem 0 1rem 1rem}.admin-submenu ul a:hover{background:#8fa291;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a.active{background:#a3b2a4;color:#fff;-webkit-transition:all .2s;transition:all .2s}.admin-submenu ul a span{display:block;max-width:85%}.admin-submenu input{margin:0 1rem;width:85%}.admin-submenu .button-gray{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0 1rem;padding:.5rem 0;text-align:center}.admin-submenu .button-gray:hover{background-color:#050505}.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header span:first-child,.admin-webhooks .table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body .response-container,.admin-webhooks .history-single-response-body textarea{font-family:'courier new',monospace}.admin-webhooks .webhooks-table .row{border-bottom:0;padding:.5rem 0}.admin-webhooks .webhooks-table .row:hover .webhook-options-wrapper{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-webhooks .table-header{border-bottom:1px solid #b8b8b8}.admin-webhooks .table-body .webhook-service{color:#555}.admin-webhooks .single-webhook-wrapper{border-bottom:1px solid #f5f5f5}.admin-webhooks .webhooks-options{margin-bottom:1rem;text-align:right}.admin-webhooks .webhook-service,.admin-webhooks .webhook-url{margin-right:.5rem}.admin-webhooks .webhook-service{-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.admin-webhooks .webhook-url{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:8;-webkit-flex-grow:8;-ms-flex-positive:8;flex-grow:8}.admin-webhooks .webhook-url span{max-width:65%;color:#b8b8b8;display:inline-block;vertical-align:middle}.admin-contrib .help code,.admin-third-parties .help code{direction:ltr;line-height:1.4rem;unicode-bidi:embed;white-space:pre}.admin-webhooks .webhook-url a{color:#72a114;margin-left:.5rem}.admin-webhooks .webhook-url a:hover{color:#9dce0a}.admin-webhooks .webhook-options{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;min-width:100px;text-align:center}.admin-webhooks .webhook-options a{color:#b8b8b8;margin-right:.5rem;-webkit-transition:color .2s linear;transition:color .2s linear;vertical-align:middle}.admin-webhooks .webhook-options a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .webhook-options-wrapper{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.admin-webhooks .webhook-url-inputs{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.admin-webhooks .webhook-url-inputs fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.3rem}.admin-webhooks .webhooks-history{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .webhooks-history.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-wrapper{border-bottom:1px solid #f5f5f5;margin-left:22%}.admin-webhooks .history-single{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem;-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single:hover{background:rgba(157,206,10,.1);-webkit-transition:background .2s linear;transition:background .2s linear}.admin-webhooks .history-single.history-single-open:hover{background:0 0}.admin-webhooks .history-single.history-single-open .icon-arrow-bottom{-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:-webkit-transform .3s linear;transition:-webkit-transform .3s linear;transition:transform .3s linear;transition:transform .3s linear,-webkit-transform .3s linear}.admin-webhooks .history-single .icon-arrow-bottom{-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .3s linear;transition:-webkit-transform .3s linear;transition:transform .3s linear;transition:transform .3s linear,-webkit-transform .3s linear}.admin-webhooks .history-response-icon{background:#555;border-radius:25%;display:inline-block;height:.8rem;margin-right:.5rem;width:.8rem}.admin-webhooks .history-response-icon.history-success{background:#9dce0a}.admin-webhooks .history-response-icon.history-error{background:red}.admin-webhooks .history-single-response{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.admin-webhooks .history-single-response.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.admin-webhooks .history-single-request-header,.admin-webhooks .history-single-response-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:1.5rem 0 .5rem}.admin-webhooks .history-single-request-header a,.admin-webhooks .history-single-request-header span:first-child,.admin-webhooks .history-single-response-header a,.admin-webhooks .history-single-response-header span:first-child{color:#b8b8b8}.admin-webhooks .history-single-request-header a:hover,.admin-webhooks .history-single-response-header a:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.admin-webhooks .history-single-request-header .icon,.admin-webhooks .history-single-response-header .icon{margin-right:.3rem;vertical-align:middle}.admin-webhooks .history-single-request-body .response-container,.admin-webhooks .history-single-response-body .response-container{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin-bottom:.5rem}.admin-webhooks .history-single-request-body span,.admin-webhooks .history-single-response-body span{color:#b8b8b8;-webkit-flex-basis:20%;-ms-flex-preferred-size:20%;flex-basis:20%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.admin-webhooks .history-single-request-body textarea,.admin-webhooks .history-single-response-body textarea{border:0;-webkit-box-flex:2;-webkit-flex-grow:2;-ms-flex-positive:2;flex-grow:2;min-height:7.5rem}.admin-webhooks .history-single-response-body textarea{min-height:10rem}.admin-contrib h2,.admin-contrib label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.admin-contrib .help h3,.admin-contrib .help ol span{font-family:opensans-semibold}.admin-contrib form{margin:1rem 0;max-width:700px;width:100%}.admin-contrib h2{font-size:1.2rem;margin-bottom:0}.admin-contrib fieldset{border-bottom:1px solid #f5f5f5;margin-bottom:1rem;padding-bottom:1rem}.admin-contrib .contrib-input{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.admin-contrib .contrib-test{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:7.5rem;-ms-flex-preferred-size:7.5rem;flex-basis:7.5rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-left:.5rem;text-align:center}.admin-contrib label{display:block;margin-bottom:.25rem}.admin-contrib .contrib-form-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .submit-button{display:block;text-align:center}.admin-contrib .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-contrib .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-contrib .select-input-text .help-copy{opacity:0}.admin-contrib .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-contrib .check-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-top:1rem}.admin-contrib .check-item:last-child{border-bottom:0}.admin-contrib .help{margin-top:2rem}.admin-contrib .help h3{margin-bottom:1rem}.admin-contrib .help ol{padding:0 0 0 2rem}.admin-contrib .help .img{margin-bottom:1rem}.admin-contrib .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-contrib .help .code-info{padding-left:1rem}.admin-contrib .help .code-info li{margin-bottom:.5rem}.admin-contrib .help .code-info span{font-family:opensans-semibold}.default-values fieldset{margin-bottom:1rem}.default-values fieldset:last-child{margin-top:1.5rem}.default-values label,.default-values select{display:inline-block;width:49.7%}.default-values a{color:#fff;display:block;text-align:center}.project-csv .csv-regenerate-field a{font-size:.9rem;min-width:110px}.project-csv{margin-bottom:2.5rem}.project-csv .project-values-title{margin-bottom:1rem}.project-csv .csv-regenerate-field{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.project-csv .csv-regenerate-field .icon{margin-right:.3rem}.project-csv .field-with-options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:1rem;width:100%}.project-csv .field-with-options input{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-csv .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.project-csv .button{padding:.5rem 1rem}.project-csv .button span{margin:0}.project-values-row .icon,.project-values-settings a{font-size:1.2rem}.admin-third-parties .help .alt-image,.admin-third-parties .help code,.admin-third-parties .select-input-text .help-copy,.backlog-table-body .doom-line span,.backlog-table-body .pop-points,.backlog-table-body .pop-points a,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open a,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-body .pop-role,.backlog-table-body .pop-role a,.backlog-table-body .pop-status,.backlog-table-body .pop-status a,.backlog-table-body .row,.backlog-table-body .tags-block .tag,.backlog-table-header .pop-points,.backlog-table-header .pop-points a,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open a,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom a,.backlog-table-header .pop-role,.backlog-table-header .pop-role a,.backlog-table-header .pop-status,.backlog-table-header .pop-status a,.backlog-table-header .row,.login-form-container .forgot-pass,.register-form-container .register-text{font-size:.9rem}.project-values-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.project-values-row div{margin-left:1rem;position:relative}.project-values-row .icon{color:#b8b8b8;opacity:0}.project-values-row .icon:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.project-values-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #f5f5f5}.project-values-body form:last-child .project-values-row{border:0}.project-values-body .project-values-row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-header .points,.login-form-container .remember-me+label{cursor:pointer}.project-values-body .project-values-row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.project-values-name{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.project-values-value{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.project-values-isclosed,.project-values-settings{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;text-align:right}.project-values-settings a{color:#555;margin-right:.5rem}.project-values-settings a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.project-values-settings a:hover .icon-delete{color:red}.admin-third-parties input,.admin-third-parties label,.admin-third-parties textarea{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.admin-third-parties .help h3,.admin-third-parties .help ol span{font-family:opensans-semibold}.admin-third-parties form{margin:1rem 0;max-width:700px;width:100%}.admin-third-parties fieldset{margin-bottom:1rem}.admin-third-parties label{display:block;margin-bottom:.2rem}.admin-third-parties textarea{height:10rem}.admin-third-parties .submit-button{color:#fff;display:block;text-align:center}.cancel-account p,.change-email-form p,.change-password-text{color:#444;text-align:center}.admin-third-parties .select-input-text .field-with-option{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.admin-third-parties .select-input-text .option-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border:1px solid #b8b8b8;border-left:0;border-radius:0 5px 5px 0;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0 1rem}.admin-third-parties .select-input-text .help-copy{opacity:0}.admin-third-parties .select-input-text .help-copy.visible{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.admin-third-parties .help{margin-top:2rem}.cancel-account form,.change-email-form form{margin-top:1rem}.admin-third-parties .help h3{margin-bottom:1rem}.admin-third-parties .help ol{padding:0 0 0 2rem}.admin-third-parties .help .img{margin-bottom:1rem}.admin-third-parties .help code{background:#f5f5f5;display:block;font-family:'courier new',monospace;margin-bottom:1rem;padding:.5rem;width:100%}.admin-third-parties .help .code-info li,.cancel-account p{margin-bottom:.5rem}.admin-third-parties .help .code-info{padding-left:1rem}.admin-third-parties .help .code-info span{font-family:opensans-semibold}.cancel-account fieldset{text-align:center}.change-email-form fieldset{text-align:center}.change-email-form p{margin-bottom:.5rem}.change-password-form-container .token-change-password{position:relative}.change-password-form-container input:focus+.get-token{opacity:0;-webkit-transition:opacity .5s linear;transition:opacity .5s linear}.change-password-form-container .get-token{font-size:.9rem;color:#b8b8b8;opacity:1;position:absolute;right:1rem;top:.5rem;-webkit-transition:all .3s linear;transition:all .3s linear}.change-password-form-container .get-token:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.forgot-form-container{text-align:center}.login-form-container .login-password{position:relative}.login-form-container input:focus+.forgot-pass{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.login-form-container .forgot-pass{color:#555;opacity:1;position:absolute;right:1rem;top:.6rem;-webkit-transition:all .3s linear;transition:all .3s linear}.login-form-container .forgot-pass:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.login-form-container .remember-me{vertical-align:top}.register-form-container{display:block}.register-form-container .register-text-top{display:block;margin-bottom:1rem;text-align:center}.backlog-table-header .backlog-table-title{font-size:1rem}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a,.empty-backlog .title{font-size:1.2rem}.backlog-table-body .doom-line span{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.backlog-table-body .pop-points,.backlog-table-body .pop-points-open,.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-body .pop-role,.backlog-table-body .pop-status,.backlog-table-body .user-story-name a,.backlog-table-header .pop-points,.backlog-table-header .pop-points-open,.backlog-table-header .pop-points-open.pop-bottom,.backlog-table-header .pop-role,.backlog-table-header .pop-status,.empty-backlog{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.backlog-table-body,.backlog-table-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.backlog-table-body.show-tags .tags-block,.backlog-table-header.show-tags .tags-block{display:block}.backlog-table-body .row,.backlog-table-header .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;text-align:left;width:100%}.backlog-table-body .backlog-table-subtitle:hover,.backlog-table-body .backlog-table-title:hover,.backlog-table-body .row:hover,.backlog-table-header .backlog-table-subtitle:hover,.backlog-table-header .backlog-table-title:hover,.backlog-table-header .row:hover{background:0 0}.backlog-table-body .backlog-table-subtitle .input,.backlog-table-body .backlog-table-title .input,.backlog-table-body .row .input,.backlog-table-header .backlog-table-subtitle .input,.backlog-table-header .backlog-table-title .input,.backlog-table-header .row .input{-webkit-flex-basis:25px;-ms-flex-preferred-size:25px;flex-basis:25px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .votes,.backlog-table-body .backlog-table-title .votes,.backlog-table-body .row .votes,.backlog-table-header .backlog-table-subtitle .votes,.backlog-table-header .backlog-table-title .votes,.backlog-table-header .row .votes{color:#555;-webkit-flex-basis:65px;-ms-flex-preferred-size:65px;flex-basis:65px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center}.backlog-table-body .backlog-table-subtitle .votes.inactive,.backlog-table-body .backlog-table-title .votes.inactive,.backlog-table-body .row .votes.inactive,.backlog-table-header .backlog-table-subtitle .votes.inactive,.backlog-table-header .backlog-table-title .votes.inactive,.backlog-table-header .row .votes.inactive{color:#b8b8b8}.backlog-table-body .backlog-table-subtitle .votes.is-voted,.backlog-table-body .backlog-table-title .votes.is-voted,.backlog-table-body .row .votes.is-voted,.backlog-table-header .backlog-table-subtitle .votes.is-voted,.backlog-table-header .backlog-table-title .votes.is-voted,.backlog-table-header .row .votes.is-voted{color:#9dce0a}.backlog-table-body .backlog-table-subtitle .user-stories,.backlog-table-body .backlog-table-title .user-stories,.backlog-table-body .row .user-stories,.backlog-table-header .backlog-table-subtitle .user-stories,.backlog-table-header .backlog-table-title .user-stories,.backlog-table-header .row .user-stories{overflow:hidden;width:100%}.backlog-table-body .backlog-table-subtitle .status,.backlog-table-body .backlog-table-title .status,.backlog-table-body .row .status,.backlog-table-header .backlog-table-subtitle .status,.backlog-table-header .backlog-table-title .status,.backlog-table-header .row .status{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.backlog-table-body .backlog-table-subtitle .points,.backlog-table-body .backlog-table-title .points,.backlog-table-body .row .points,.backlog-table-header .backlog-table-subtitle .points,.backlog-table-header .backlog-table-title .points,.backlog-table-header .row .points{-webkit-flex-basis:125px;-ms-flex-preferred-size:125px;flex-basis:125px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.backlog-table-body .points,.backlog-table-body .status,.backlog-table-header .points,.backlog-table-header .status{position:relative;text-align:right}.backlog-table-body .points .popover a,.backlog-table-body .status .popover a,.backlog-table-header .points .popover a,.backlog-table-header .status .popover a{text-align:left;width:100%}.backlog-table-body .points .popover .point,.backlog-table-body .status .popover .point,.backlog-table-header .points .popover .point,.backlog-table-header .status .popover .point,.empty-backlog,.sprints .loading,.sprints .sprint-table .sprint-empty{text-align:center}.backlog-table-body .points .icon,.backlog-table-body .status .icon,.backlog-table-header .points .icon,.backlog-table-header .status .icon{color:#b8b8b8;margin-left:.2rem}.backlog-table-body .pop-status,.backlog-table-header .pop-status{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-status a,.backlog-table-header .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-status a:last-child,.backlog-table-header .pop-status a:last-child{border:0}.backlog-table-body .pop-status a:hover,.backlog-table-header .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-status a:hover.point,.backlog-table-header .pop-status a:hover.point{color:#fff}.backlog-table-body .pop-status:after,.backlog-table-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-status.fix,.backlog-table-header .pop-status.fix{bottom:0;top:auto}.backlog-table-body .pop-role,.backlog-table-header .pop-role{background:#050505;color:#fff;display:none;left:65%;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-role a,.backlog-table-header .pop-role a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-role a:last-child,.backlog-table-header .pop-role a:last-child{border:0}.backlog-table-body .pop-role a:hover,.backlog-table-header .pop-role a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-role a:hover.point,.backlog-table-header .pop-role a:hover.point{color:#fff}.backlog-table-body .pop-role:after,.backlog-table-header .pop-role:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-role a.active,.backlog-table-header .pop-role a.active{background:#9dce0a;color:#fff}.backlog-table-body .pop-points,.backlog-table-header .pop-points{background:#050505;bottom:10px;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px 3rem 10px 10px;position:absolute;width:150px;z-index:99}.backlog-table-body .pop-points a,.backlog-table-header .pop-points a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points a:last-child,.backlog-table-header .pop-points a:last-child{border:0}.backlog-table-body .pop-points a:hover,.backlog-table-header .pop-points a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points a:hover.point,.backlog-table-header .pop-points a:hover.point{color:#fff}.backlog-table-body .pop-points:after,.backlog-table-header .pop-points:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open,.backlog-table-header .pop-points-open{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:0;width:200px;z-index:99}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{border-bottom:1px solid #444;color:#fff;padding:10px 2px}.backlog-table-body .pop-points-open a:last-child,.backlog-table-header .pop-points-open a:last-child{border:0}.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open a:hover.point,.backlog-table-header .pop-points-open a:hover.point{color:#fff}.backlog-table-body .pop-points-open:after,.backlog-table-header .pop-points-open:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open.pop-bottom,.backlog-table-header .pop-points-open.pop-bottom{background:#050505;bottom:0;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;top:auto;width:200px;z-index:99}.backlog-table-body .pop-points-open.pop-bottom a,.backlog-table-header .pop-points-open.pop-bottom a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.backlog-table-body .pop-points-open.pop-bottom a:last-child,.backlog-table-header .pop-points-open.pop-bottom a:last-child{border:0}.backlog-table-body .pop-points-open.pop-bottom a:hover,.backlog-table-header .pop-points-open.pop-bottom a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.backlog-table-body .pop-points-open.pop-bottom a:hover.point,.backlog-table-header .pop-points-open.pop-bottom a:hover.point{color:#fff}.backlog-table-body .pop-points-open.pop-bottom:after,.backlog-table-header .pop-points-open.pop-bottom:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.backlog-table-body .pop-points-open li,.backlog-table-header .pop-points-open li{display:inline-block;width:23%}.backlog-table-body .pop-points-open a,.backlog-table-header .pop-points-open a{display:block;text-align:center}.backlog-table-body .user-story-name,.sprints .sprint-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.backlog-table-body .pop-points-open a.active,.backlog-table-body .pop-points-open a:hover,.backlog-table-header .pop-points-open a.active,.backlog-table-header .pop-points-open a:hover{background:#9dce0a;color:#fff}.backlog-table-header .backlog-table-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:2px solid #b8b8b8;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;padding-right:30px}.backlog-table-header .header-points span{color:#b8b8b8}.backlog-table-body .row{border-bottom:1px solid #ebebeb;cursor:move;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap;position:relative}.backlog-table-body .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.backlog-table-body .row:hover .icon-drag-v,.backlog-table-body .row:hover .us-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .row:last-child{border-bottom:0}.backlog-table-body .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .row .points .not-clickable:hover{color:#000;cursor:text}.backlog-table-body .sortable-placeholder{background:#f5f5f5;height:40px;width:100%}.backlog-table-body .is-checked,.backlog-table-body .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body input:checked{color:#9dce0a;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.backlog-table-body .user-story-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.backlog-table-body .user-story-name a{display:inline-block;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.backlog-table-body .user-story-name span{line-height:1.5}.backlog-table-body .tags-block{display:none;margin-bottom:.3rem}.backlog-table-body .tags-block .tag{margin-right:.5rem;padding:.2rem .5rem}.backlog-table-body .blocked{background:#ff8282;border-bottom:1px solid #fff;color:#fff}.backlog-table-body .blocked:hover{background:red;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.backlog-table-body .blocked a{color:#fff!important}.backlog-table-body .blocked .icon,.backlog-table-body .blocked .icon:hover,.backlog-table-body .blocked a:hover{color:#fff}.backlog-table-body .doom-line{background:red;margin:.2rem 0;padding:.6rem 0;position:relative;width:100%}.backlog-table-body .doom-line span{color:#fff;position:absolute;right:.5rem;top:-3px}.backlog-table-body .icon-drag-v,.backlog-table-body .us-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;width:30px}.backlog-table-body .icon-drag-v:hover,.backlog-table-body .us-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.backlog-table-body .us-settings{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 0 0 2rem;opacity:0}.backlog-table-body .icon-drag-v{cursor:move;opacity:0;padding:.1rem .5rem 0 0}.backlog-table-body .readonly{cursor:auto;padding-right:45px}.empty-backlog{padding:2rem}.empty-backlog img{margin-bottom:1rem}.empty-backlog .title{margin-bottom:.5rem}.empty-backlog a{color:#72a114}.burndown{margin-bottom:2rem;width:100%}.sprints .sprint .description{font-size:.75rem}.sprints .filter-closed-sprints,.sprints .sprint-table .column-us,.sprints .us-item-row .user-story-name{font-size:.9rem}.sprints .sprint .number,.sprints .sprint .sprint-date,.sprints .sprint-name a,.sprints-empty .title{font-size:1.2rem}.sprints .sprint .sprint-date,.sprints .sprint-name a{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.sprints .sprint-table .sprint-empty,.sprints-empty{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.sprints .sprint-header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints h1{margin:0}.sprints .add-sprint{background:#72a114;padding:.25rem .25rem 0;-webkit-transition:background .2s;transition:background .2s}.sprints .add-sprint:hover{background:#9dce0a}.sprints .add-sprint svg{height:1.4rem;max-height:1.4rem;max-width:1.5rem;width:1.5rem}.sprints .add-sprint path{fill:#f5f5f5}.sprints .filter-closed-sprints{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding-bottom:1rem;vertical-align:middle}.sprints .filter-closed-sprints .icon-archive{margin-right:.3rem}.sprints .loading-spinner{border:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-bottom:1rem;max-height:2rem;max-width:2rem;-webkit-transform-origin:center center;transform-origin:center center}.sprints .sprint-name a{max-width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block;margin-right:3px}.sprints .sprint{margin-bottom:2rem;overflow:hidden}.sprints .sprint header{position:relative}.sprints .sprint:hover .icon-edit{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.sprints .sprint .icon{display:inline-block}.sprints .sprint .icon-arrow-up{-webkit-transform:rotate(90deg);transform:rotate(90deg);-webkit-transition:all .2s linear;transition:all .2s linear;vertical-align:baseline}.sprints .sprint .icon-arrow-up.active{-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.sprints .sprint .icon-arrow-up:hover{color:#9dce0a;-webkit-transition:color .2s linear;transition:color .2s linear}.sprints .sprint .icon-edit{color:#b8b8b8;opacity:0;position:absolute;right:0;top:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in;vertical-align:baseline}.sprints .sprint .icon-edit:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.sprints .sprint .description{line-height:.6rem;margin-top:5px}.sprints .sprint .sprint-summary{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.sprints .sprint .sprint-date{color:#b8b8b8;-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1}.sprints .sprint .sprint-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.sprints .sprint ul{margin:0}.sprints .sprint li{display:inline-block}.sprints .sprint li:first-child{margin-right:3px}.sprints .sprint-progress-bar{background:#b8b8b8;border-radius:2px;height:8px;margin-bottom:1rem;margin-top:.5rem;position:relative;width:100%}.sprints .sprint-progress-bar .current-progress{background:#72a114;border-radius:2px;height:8px;left:0;position:absolute;top:0;width:calc(30% - 4px)}.sprints .sprint-table .sprint-empty{background:#e6e6e6;border:2px dashed #d2d2d2;color:#555;padding:1rem}.sprints .sprint-table .row{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5em 0;text-align:left;width:100%}.sprints .sprint-table .row:hover{background:#d7d7d7;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .row.readonly,.taskboard-table .taskboard-task.readonly{cursor:auto}.sprints .sprint-table .row:last-child{border-bottom:0}.sprints .sprint-table .row.sortable-placeholder{background:#d7d7d7;height:40px}.sprints .sprint-table .row.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);opacity:.9;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.sprints .sprint-table .column-us{-webkit-flex-flow:3;-ms-flex-flow:3;flex-flow:3;padding:0 4px}.sprints .sprint-table .us-name{max-width:230px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.sprints .sprint-table .us-name.closed{color:#c5c5c5}.sprints .sprint-table .us-name.blocked{color:red}.sprints .sprint-table .column-points{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 4px;text-align:right}.sprints .sprint-table .column-points.closed{color:#c5c5c5}.sprints .sprint-table .column-points.blocked{color:red}.sprints .button-gray{display:block;margin-top:1rem;text-align:center}.sprint-closed .sprint-table,.sprints .us-item-row .icon-drag-v,.sprints .us-item-row .popover,.sprints .us-item-row .status,.sprints .us-item-row .tags-block,.sprints .us-item-row .us-settings,.sprints .us-item-row input,.taskboard-table-body .column-fold .taskboard-task .icon,.taskboard-table-body .column-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .column-fold .taskboard-task .taskboard-text,.taskboard-table-body .row-fold .taskboard-task .icon,.taskboard-table-body .row-fold .taskboard-task .taskboard-tagline,.taskboard-table-body .row-fold .taskboard-task .taskboard-text{display:none}.sprints .us-item-row .user-story-name{line-height:1rem;margin-top:5px}.sprint-closed .description,.sprint-closed .number{color:#b8b8b8}.sprint-closed .sprint-progress-bar .current-progress{background:#9f9f9f}.sprint-closed .button-gray{background:#b8b8b8}.sprints-empty{text-align:center}.sprints-empty img{margin:1rem 0;width:50%}.sprints-empty .title{margin-bottom:.5rem}.sprints-empty a{color:#72a114}.taskboard-userstory-box .points-value{font-size:.9rem}.taskboard-table-header .task-colum-name,.taskboard-table-header .task-colum-name .icon{font-size:1rem}.taskboard-table-body .column-fold .taskboard-task,.taskboard-table-body .row-fold .taskboard-task{background:0 0;border:0;margin:0;min-height:0}.category-config,.ticket-assigned-to{border-bottom:1px solid #b8b8b8}.category-config:first-child,.ticket-assigned-to{border-top:1px solid #b8b8b8}.taskboard-table-body .column-fold .taskboard-task .taskboard-task-inner,.taskboard-table-body .row-fold .taskboard-task .taskboard-task-inner{padding:.2rem}.taskboard-table-body .column-fold .taskboard-task .avatar,.taskboard-table-body .row-fold .taskboard-task .avatar{height:35px;width:35px}.taskboard-table-body .column-fold .taskboard-task.ui-sortable-helper,.taskboard-table-body .row-fold .taskboard-task.ui-sortable-helper{box-shadow:none}.taskboard-table-body .column-fold .task-column,.taskboard-table-body .row-fold .task-column,.taskboard-table-body .task-column.column-fold,.taskboard-table-body .task-column.row-fold{-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap}.taskboard-table-body .column-fold .avatar-task-link,.taskboard-table-body .row-fold .avatar-task-link{display:block}.taskboard-table-body .column-fold .avatar-assigned-to,.taskboard-table-body .row-fold .avatar-assigned-to{display:none}.taskboard-table,.taskboard-table-header .taskboard-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;overflow:hidden}.taskboard-table{display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;width:100%}.taskboard-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.taskboard-table-header .taskboard-table-inner{display:flex;position:absolute}.taskboard-table-header .task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem 1rem;position:relative;width:300px}.taskboard-table-header .task-colum-name:last-child{margin-right:0}.taskboard-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-header .task-colum-name .icon:hover{color:#72a114}.taskboard-table-header .task-colum-name .icon.hfold,.taskboard-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.taskboard-table-header .task-colum-name.column-fold{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.3rem 0}.taskboard-table-header .task-colum-name.column-fold span{display:none}.taskboard-table-header .task-colum-name.column-fold .hfold,.taskboard-table-header .task-colum-name.column-fold .hunfold{margin:0}.taskboard-table-body{height:100%;overflow:auto;width:100%}.taskboard-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;width:300px}.taskboard-table-body .task-column:last-child{margin-right:0}.taskboard-table-body .column-fold .taskboard-task{max-width:40px;width:40px}.taskboard-table-body .task-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;min-height:10rem;width:100%}.taskboard-table-body .avatar-task-link,.taskboard-table-body .task-row.row-fold .icon-bulk,.taskboard-table-body .task-row.row-fold .icon-plus,.taskboard-table-body .task-row.row-fold .points-value{display:none}.taskboard-table-body .task-row:hover .new-task{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.taskboard-table-body .task-row.blocked .taskboard-userstory-box{background:rgba(255,0,0,.6)}.taskboard-table-body .task-row.blocked .points-value,.taskboard-table-body .task-row.blocked .points-value:hover,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a,.taskboard-table-body .task-row.blocked .taskboard-userstory-box a:hover{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.taskboard-table-body .task-row.blocked .taskboard-tasks-box{background:rgba(255,0,0,.1)}.taskboard-table-body .task-row.row-fold{min-height:0}.taskboard-table-body .task-row.row-fold .us-title{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.taskboard-table-body .taskboard-userstory-box{padding:.5rem .5rem .5rem 1.5rem}.taskboard-table-body .taskboard-userstory-box .icon{color:#b8b8b8;position:absolute;right:.5rem;top:.7rem;-webkit-transition:color .2s linear;transition:color .2s linear}.taskboard-table-body .taskboard-userstory-box .icon:hover{color:#72a114}.taskboard-table-body .taskboard-userstory-box .icon.icon-plus{right:2rem}.taskboard-table-body .taskboard-userstory-box .icon.icon-vfold,.taskboard-table-body .taskboard-userstory-box .icon.icon-vunfold{left:0;right:inherit}.taskboard-table-body .avatar-assigned-to{display:block}.taskboard-userstory-box{position:relative}.taskboard-userstory-box .tag-list{display:none;margin-bottom:1rem}.taskboard-userstory-box .us-title{font-size:1.2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;margin-bottom:0;margin-right:3rem}.taskboard-userstory-box .points-value{color:#b8b8b8}.taskboard-userstory-box .points-value span{margin-right:.1rem}.points-list a{color:#72a114;margin-left:.5rem}.points-list a:hover span{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.points-list span{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.ticket-assigned-to{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:1rem;padding:1rem 0;position:relative}.ticket-assigned-to:hover .assigned-to .icon-delete{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.ticket-assigned-to .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;-webkit-transform-origin:32 32;transform-origin:32 32;margin:1rem auto;max-height:2rem;max-width:2rem}.filters-inner .loading .loading-spinner,.lightbox-generic-loading .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.ticket-assigned-to .user-avatar{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;position:relative}.ticket-assigned-to .user-avatar img{width:100%}.ticket-assigned-to .user-avatar.is-iocaine img{-webkit-filter:hue-rotate(150deg) saturate(200%);filter:hue-rotate(150deg) saturate(200%)}.ticket-assigned-to .user-avatar .iocaine-symbol{left:-.5rem;position:absolute;top:-.75rem;z-index:9}.ticket-assigned-to .user-avatar .iocaine-symbol svg{background:#444;border-radius:.25rem;fill:#fff;min-height:1.75rem;min-width:1.75rem;padding:.25rem}.ticket-assigned-to .assigned-to{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.ticket-assigned-to .assigned-to .assigned-title{font-size:.9rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#555;display:block;margin:.2rem 0 .25rem}.ticket-assigned-to .assigned-to .assigned-to-options{display:inline-block}.category-config .category-item,.category-config .resume{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.ticket-assigned-to .assigned-to .icon-delete{color:#b8b8b8;opacity:0;position:absolute;right:0;top:2rem}.ticket-assigned-to .assigned-to .icon-delete:hover{color:red}.ticket-assigned-to .assign-to-me,.ticket-assigned-to .user-assigned{cursor:default}.ticket-assigned-to .assign-to-me:hover,.ticket-assigned-to .user-assigned:hover{color:currentColor}.ticket-assigned-to .assign-to-me.editable,.ticket-assigned-to .user-assigned.editable{color:#72a114}.ticket-assigned-to .assign-to-me.editable:hover,.ticket-assigned-to .user-assigned.editable:hover{cursor:pointer}.ticket-assigned-to .assign-to-me .icon,.ticket-assigned-to .user-assigned .icon{vertical-align:middle}.ticket-assigned-to .assign-to-me>span,.ticket-assigned-to .user-assigned>span{max-width:80%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.category-config .resume{-webkit-box-align:space-between;-webkit-align-items:space-between;-ms-flex-align:space-between;align-items:space-between;cursor:pointer;display:flex;padding:1rem;position:relative}.category-config .resume-title{width:280px}.category-config .count{color:#b8b8b8;float:left;padding-right:5px}.category-config .summary-role{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;width:280px}.category-config .summary-role .role-summary-single{background:#b8b8b8;display:inline-block;height:20px;margin-right:.1rem;width:15px}.category-config .summary-role .role-summary-single.active{background:#72a114}.category-config .summary-role .role-summary-single.inactive{background:#555}.category-config .icon{font-size:2rem;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;text-align:right}.category-config .category-items{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden;background-color:#f5f5f5;width:100%}.category-config .category-items.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:400px}.category-config .category-items .items-container{padding:1rem}.category-config .category-item{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem .5rem .5rem 2rem}.colors-table .row,.duty-custom-fields .custom-fields-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.category-config .category-item:last-child{border-bottom:0}.category-config .check input{height:40px;width:85px}.colors-table .table-header{font-size:1rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:3px solid #f5f5f5}.colors-table .icon,.colors-table .icon-check-square{font-size:1.2rem}.colors-table .table-header:hover{background:0 0}.colors-table .table-header .row{padding-left:50px}.colors-table form:last-child .row{border:0}.colors-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:1rem}.colors-table .row:hover{background:#f6fceb;cursor:move;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.colors-table .row.edition .current-color,.duty-custom-fields form label{cursor:pointer}.colors-table .row:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.colors-table .row:hover .options-column{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.colors-table .row:last-child{border:0}.colors-table .row.edition,.colors-table .row.new-value{padding-left:50px}.colors-table .row.hidden{display:none}.colors-table .row .color-column{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:100px;position:relative}.colors-table .row .is-archived-column,.colors-table .row .is-closed-column,.colors-table .row .options-column,.colors-table .row .status-wip-limit{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.colors-table .row .status-name{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px;position:relative}.colors-table .row .status-name span{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.duty-custom-fields .custom-field-value.js-value-view-mode,.lightbox-generic-ask .subtitle{white-space:pre-line}.colors-table .row .status-slug{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:6;-webkit-flex-grow:6;-ms-flex-positive:6;flex-grow:6;padding:0 10px}.colors-table .row .options-column{max-width:100px;opacity:0;text-align:right}.colors-table .row .is-archived-column{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row .is-closed-column{max-width:130px;text-align:center}.colors-table .row .status-wip-limit{max-width:130px;padding:0 0 0 10px;text-align:center}.colors-table .row-edit .options-column{opacity:1}.colors-table .current-color{background-color:#b8b8b8;border-radius:2px;height:40px;width:40px}.activity-single .activity-user img,.duty-custom-fields form input{width:100%}.colors-table .icon{color:#b8b8b8;margin-right:1rem;opacity:0}.colors-table .icon.icon-check-square,.duty-custom-fields .custom-field-single:hover .custom-field-options{opacity:1}.colors-table .icon:hover{color:#72a114;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.colors-table .icon-delete:hover{color:red}.colors-table .icon-check-square{color:#72a114}.duty-custom-fields .custom-field-data .custom-field-description{font-size:.9rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom{font-size:1.2rem;cursor:pointer;-webkit-transform:rotate(-90deg);transform:rotate(-90deg);-webkit-transition:-webkit-transform .2s linear;transition:-webkit-transform .2s linear;transition:transform .2s linear;transition:transform .2s linear,-webkit-transform .2s linear}.duty-custom-fields .custom-field-data .custom-field-description,.duty-custom-fields .custom-field-value{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.duty-custom-fields .custom-fields-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.duty-custom-fields{margin-bottom:2rem}.duty-custom-fields .custom-fields-header .icon-arrow-bottom.open{-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:-webkit-transform .2s linear;transition:-webkit-transform .2s linear;transition:transform .2s linear;transition:transform .2s linear,-webkit-transform .2s linear}.duty-custom-fields .custom-fields-body{max-height:0;-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;overflow:hidden}.duty-custom-fields .custom-fields-body.open{-webkit-transition:max-height .5s ease-in;transition:max-height .5s ease-in;max-height:1000px}.duty-custom-fields .custom-field-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;padding:1rem}.duty-custom-fields .custom-field-single.editable .custom-field-options{margin-top:.5rem}.duty-custom-fields .custom-field-single .custom-field-options{opacity:0;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.duty-custom-fields .custom-field-single .custom-field-options a{color:#b8b8b8}.duty-custom-fields .custom-field-single .custom-field-options a:hover{color:#72a114}.duty-custom-fields .custom-field-data{-webkit-box-flex:0;-webkit-flex:0;-ms-flex:0;flex:0;-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px}.duty-custom-fields .custom-field-data .custom-field-name{display:block}.duty-custom-fields .custom-field-data .custom-field-description{color:#888;display:block;line-height:.9rem}.duty-custom-fields .custom-field-options{margin:0}.duty-custom-fields .custom-field-value{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:0 1rem 0 2rem}.blocked .external-reference{color:#fff}.blocked .external-reference a{color:#fff;-webkit-transition:color .3s linear;transition:color .3s linear}.blocked .external-reference a:hover{color:#ff8282}.external-reference{font-size:.9rem;color:#b8b8b8;margin-top:.5rem}.external-reference a{border-left:1px solid #b8b8b8;padding:0 .2rem;-webkit-transition:color .3s linear;transition:color .3s linear}.external-reference a:hover{color:#72a114}.external-reference a:first-child{border:0}.activity-single .comment-restore,.activity-single .date,.activity-single .deleted-comment,.activity-single.deleted-comment,.change-entry .activity-fromto,.more-activity,.more-comments,.show-more-comments{font-size:.9rem}.activity-single .deleted-comment .comment-body p,.activity-single.deleted-comment .comment-body p{font-size:1rem}.history-tabs{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.change-entry .activity-changed{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.history{margin-bottom:1rem}.changes-title{display:block;padding:.5rem}.changes-title:hover .icon{color:#72a114;-webkit-transform:rotate(180deg);transform:rotate(180deg);-webkit-transition:all .2s linear;transition:all .2s linear}.changes-title .icon{color:#444;float:right;-webkit-transform:rotate(0);transform:rotate(0);-webkit-transition:all .2s linear;transition:all .2s linear}.main-nav a:hover .helper::after,.related-tasks-body .pop-status:after{-webkit-transform:rotate(45deg);content:''}.change-entry{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem}.change-entry:last-child{border-bottom:0}.change-entry .activity-changed,.change-entry .activity-fromto{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.history-tabs{border-bottom:3px solid #b8b8b8;margin-bottom:0;padding:.5rem 0}.history-tabs li{font-size:1.2rem;display:inline-block}.history-tabs li:first-child{border-right:1px solid #b8b8b8}.history-tabs a{color:#b8b8b8;padding:0 2rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs a.active{color:#444}.history-tabs a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.history-tabs .icon{margin-right:.5rem}.add-comment .in-progress{cursor:progress}.add-comment:after{clear:both;content:'';display:table}.add-comment.active .button-green{display:block;margin-top:.5rem}.add-comment.active textarea{height:6rem;-webkit-transition:height .3s ease-in;transition:height .3s ease-in}.add-comment.active .help-markdown{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.add-comment.active .preview-icon{opacity:1;position:absolute;right:1rem}.add-comment .help-markdown,.add-comment .preview-icon,.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave.ng-leave-active:last-child{opacity:0}.add-comment textarea{background:#fff;height:5rem;min-height:41px}.add-comment .save-comment{color:#fff;float:right}.add-comment .button-green{display:none}.more-comments,.show-more-comments{color:#b8b8b8;display:block;border-bottom:1px solid #b8b8b8}.add-comment .edit,.add-comment .preview-icon{position:absolute;right:1rem}.show-more-comments{border-top:1px solid #b8b8b8;padding:1rem 0 1rem 1rem}.show-more-comments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.more-comments{padding:1rem}.more-comments .prev-comments-num{color:#72a114;margin-left:.5rem}.comment-list.activeanimation .comment-single.ng-enter:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{-webkit-transition:all .3s ease-in;transition:all .3s ease-in}.comment-list.activeanimation .comment-single.ng-enter.ng-enter-active:last-child,.comment-list.activeanimation .comment-single.ng-leave:last-child{opacity:1}.activity-single{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:2rem 0;position:relative}.activity-single:hover .comment-delete,.activity-single:hover .comment-restore{opacity:1;-webkit-transition:opacity .2s linear;transition:opacity .2s linear}.activity-single:first-child{margin-top:0}.activity-single:last-child{border-bottom:0}.activity-single .deleted-comment,.activity-single.deleted-comment{color:#b8b8b8;padding:.5rem}.activity-single .deleted-comment a,.activity-single.deleted-comment a{color:#b8b8b8;margin-left:.3rem}.activity-single .deleted-comment a:hover,.activity-single.deleted-comment a:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .deleted-comment img,.activity-single.deleted-comment img{-webkit-filter:grayscale(100%);filter:grayscale(100%);opacity:.5}.activity-single .deleted-comment .comment-body,.activity-single.deleted-comment .comment-body{display:none;margin:.2rem 0 .5rem}.activity-single .activity-username,.activity-single .username{margin-bottom:.5rem;color:#72a114}.activity-single .comment-restore{color:#b8b8b8;position:absolute;right:0;top:.4rem}.activity-single .comment-restore .icon{vertical-align:baseline}.activity-single .comment-restore:hover{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single .activity-user{-webkit-flex-basis:60px;-ms-flex-preferred-size:60px;flex-basis:60px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.activity-single .activity-content{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:calc(100% - 80px)}.activity-single .changes{background:#f5f5f5}.activity-single .changes .change-entry{display:none}.activity-single .changes .change-entry.active{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.activity-single .date{color:#b8b8b8;margin-left:1rem}.activity-single .wysiwyg{margin-bottom:0}.activity-single .comment-delete{color:red;opacity:0;position:absolute;right:0;top:2rem;-webkit-transition:all .2s linear;transition:all .2s linear}.activity-single .comment-delete:hover{color:#ff8282;-webkit-transition:color .2s linear;transition:color .2s linear}.activity-single.activity .change-entry{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.more-activity{border-bottom:1px solid #b8b8b8;color:#b8b8b8;display:block;padding:1rem}.more-activity .prev-activity-num{color:#72a114;margin-left:.5rem}.lightbox{background:rgba(255,255,255,.98);bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910}.lightbox-generic-form label{font-size:.75rem}.lightbox-add-member .help-text,.lightbox-delete-account .newsletter input+label,.lightbox-sprint-add-edit .delete-sprint,.lightbox-sprint-add-edit .last-sprint-name{font-size:.9rem}.lightbox-select-user .more-watchers{font-size:1rem}.lightbox-add-member .add-member-wrapper .icon-delete,.lightbox-add-member .icon,.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress{font-size:1.2rem}.lightbox h2{font-size:1.6rem}.lightbox .close,.lightbox-add-member .icon-delete{font-size:2rem}.lightbox-ask-choice .subtitle,.lightbox-delete-account .subtitle,.lightbox-delete-project .subtitle,.lightbox-generic-ask .subtitle,.lightbox-generic-loading .progress-bar-wrapper .progress,.lightbox-select-user .more-watchers{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.lightbox h2,.lightbox-delete-account .newsletter input+label{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.lightbox .close{color:#555;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.lightbox-add-member .add-member-wrapper fieldset,.lightbox-generic-form fieldset{position:relative}.lightbox-add-member .checksley-error-list,.lightbox-generic-form .attachment-delete{right:.5rem}.lightbox .close:hover{color:#72a114}.open.lightbox{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.lightbox{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.lightbox .title{text-align:center}.lightbox fieldset{margin-bottom:1rem}.lightbox .button-gray,.lightbox .button-green{display:block;padding:12px;text-align:center}.lightbox-generic-loading .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32}.lightbox-generic-form form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-form textarea{min-height:4.5rem;resize:vertical}.lightbox-generic-form label{background:#f5f5f5;border:1px solid #b8b8b8;color:#444;cursor:pointer;display:block;padding:7px 30px;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.lightbox-generic-form label:hover span{color:#fff}.lightbox-generic-form label span{color:#444;vertical-align:middle}.lightbox-generic-form .settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.lightbox-generic-form .settings fieldset{margin-right:.5rem}.lightbox-generic-form .settings fieldset:hover{color:#fff;-webkit-transition:all .2s ease-in;transition:all .2s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.lightbox-generic-form .settings fieldset:last-child{margin:0}.lightbox-add-member .button,.lightbox-add-member .extra-text{margin-top:1rem}.lightbox-generic-form .settings .iocaine:hover,.lightbox-generic-form .settings .requirement:hover{background:#9dce0a;border:1px solid #72a114}.lightbox-generic-form .settings .blocked:hover{background:#ff8282;border:1px solid red}.lightbox-generic-form .settings .client-requirement input:checked+label,.lightbox-generic-form .settings .iocaine-flag input:checked+label,.lightbox-generic-form .settings .team-requirement input:checked+label{background:#72a114;border:1px solid #72a114;color:#fff}.lightbox-generic-form .settings .blocking-flag label{-webkit-align-self:stretch;-ms-flex-item-align:stretch;align-self:stretch;display:block}.lightbox-generic-form .settings .blocking-flag input:checked+label{background:red;border:1px solid red;color:#fff}.lightbox-generic-form .settings input{display:none}.lightbox-generic-form .attachments{margin-bottom:0}.lightbox-generic-form .attachment-body{max-height:7.5rem;overflow-y:auto}.lightbox-generic-form .attachment-delete svg{fill:#b8b8b8;height:1.25rem;width:1.25rem}.lightbox-generic-form .attachment-delete:hover svg{fill:red}.lightbox-generic-bulk form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-generic-bulk textarea{max-height:12rem;min-height:15rem}.lightbox-search form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;max-width:600px}.lightbox-search fieldset{margin-bottom:1rem}.lightbox-add-member .add-member-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem}.lightbox-add-member .add-member-wrapper:last-child,.lightbox-add-member fieldset{margin-bottom:0}.lightbox-add-member .add-member-wrapper fieldset:first-child{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.lightbox-add-member .add-member-wrapper fieldset:last-child{-webkit-flex-basis:200px;-ms-flex-preferred-size:200px;flex-basis:200px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.lightbox-add-member select{width:80%}.lightbox-add-member .icon{margin-left:.5rem}.lightbox-add-member .icon-delete:hover{color:red}.lightbox-add-member .help-text{padding:.5rem 1rem}.lightbox-add-member .checksley-error-list li{display:none}.lightbox-add-member .checksley-error-list li:first-child{display:block}.lightbox-sprint-add-edit form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:600px}.lightbox-sprint-add-edit .last-sprint-name{color:#555;opacity:1;position:absolute;right:1rem;top:.7rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .last-sprint-name.disappear{opacity:0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.lightbox-sprint-add-edit .dates{margin-bottom:1rem}.lightbox-sprint-add-edit .dates div{float:left;margin-right:1%;position:relative;width:49%}.lightbox-sprint-add-edit .dates div:last-child{margin:0;width:50%}.lightbox-ask-choice .options a:first-child,.lightbox-generic-ask .options a:first-child{margin-right:.5rem}.lightbox-sprint-add-edit .delete-sprint{color:#444;display:block;margin-top:1rem;text-align:right}.lightbox-sprint-add-edit .delete-sprint a{color:#b8b8b8;margin-left:.5rem;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-sprint-add-edit .delete-sprint a:hover{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.lightbox-generic-ask form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-flex-flow:0;-ms-flex-flow:0;flex-flow:0;max-width:420px}.lightbox-generic-ask .message,.lightbox-generic-ask .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-generic-ask .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-generic-ask .options a{padding:8px 0;text-align:center;width:100%}.lightbox-ask-choice{text-align:center}.lightbox-ask-choice form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.lightbox-ask-choice .question,.lightbox-ask-choice .subtitle{display:block;line-height:1.5rem;text-align:center}.lightbox-ask-choice .replacement,.lightbox-ask-choice .replacement span{display:block}.lightbox-ask-choice .choices{margin-bottom:2rem}.lightbox-ask-choice .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-ask-choice .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-account form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-account .question,.lightbox-delete-account .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-account .newsletter{margin:1rem 0;text-align:center}.lightbox-delete-account .newsletter input,.lightbox-delete-account .options a:first-child,.lightbox-delete-project .options a:first-child{margin-right:.5rem}.lightbox-delete-account .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-delete-account .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-delete-project form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-delete-project .question,.lightbox-delete-project .subtitle{display:block;line-height:2rem;text-align:center}.lightbox-delete-project .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-delete-project .options a{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:8px 0;text-align:center}.lightbox-generic-error section,.lightbox-generic-loading section,.lightbox-generic-success section{-webkit-flex-basis:500px;-ms-flex-preferred-size:500px;flex-basis:500px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:500px}.lightbox-generic-error h2,.lightbox-generic-loading h2,.lightbox-generic-success h2{line-height:2rem}.lightbox-generic-error p,.lightbox-generic-loading p,.lightbox-generic-success p{text-align:center}.lightbox-generic-loading .spin{margin:1rem auto;width:5rem}.lightbox-generic-loading .spin img{max-height:100%;max-width:100%;width:100%}.lightbox-generic-loading .progress-bar-wrapper{background:#e8e8e8;height:30px;margin-bottom:1rem;padding:3px;position:relative}.lightbox-generic-loading .progress-bar-wrapper .bar{background:#9dce0a;height:24px;position:absolute;-webkit-transition:width .1s linear;transition:width .1s linear}.lightbox-generic-loading .progress-bar-wrapper .progress{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#e8e8e8;bottom:35px;color:#555;padding:.3rem;position:absolute;-webkit-transition:left .1s linear;transition:left .1s linear}.lightbox-create-issue form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-create-issue .fieldset-row{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.lightbox-create-issue .fieldset-row fieldset{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-right:.5rem;width:30%}.lightbox-create-issue .fieldset-row fieldset:last-child{margin:0}.lightbox-block textarea,.lightbox-create-issue textarea{margin-bottom:1rem;max-height:12rem;min-height:8rem}.lightbox-block .form{-webkit-flex-basis:420px;-ms-flex-preferred-size:420px;flex-basis:420px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:420px}.lightbox-select-user .form{-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:600px}.lightbox-select-user .user-list-single.selected,.lightbox-select-user .user-list-single:hover{background:#f3fbe1;cursor:pointer}.lightbox-select-user .user-list-single:hover{-webkit-transition:background .3s linear;transition:background .3s linear;-webkit-transition-delay:.2s;transition-delay:.2s}.lightbox-select-user .more-watchers{padding:.5rem;text-align:center}.lb-create-edit-userstory .points-per-role{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin:0}.featured-project .project-card-inner,.highlighted .highlighted-projects-container,.highlighted .most-active,.highlighted .most-liked,.kanban-table,.wiki-summary .wiki-user-modification{-webkit-box-orient:vertical;-webkit-box-direction:normal}.lb-create-edit-userstory .ticket-role-points{margin:.1rem;min-width:20%}.lb-create-edit-userstory .ticket-role-points:first-child{margin-left:0}.lb-create-edit-userstory .ticket-role-points:nth-child(4n+4){margin-right:0}.lb-create-edit-userstory .ticket-role-points:last-child{margin:.1rem 0;min-width:100%}.main-nav a:hover .helper{font-size:.9rem}.main-nav .item{font-size:1.2rem}tg-project-menu{background-position:0 -300px;display:inline-block;min-height:95%;min-width:50px;padding:1rem 0;position:relative;z-index:9}.main-nav a,.main-nav span{display:block}tg-project-menu .menu.menu-fixed{position:fixed;top:1rem}.main-nav{list-style:none;padding:0;position:relative;text-align:center}.related-tasks-body .row,.related-tasks-body .status{text-align:left;position:relative}.main-nav a{color:#fff;padding:.75rem .8rem;position:relative}.main-nav a:hover{background:rgba(0,0,0,.2);color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.main-nav a:hover .helper{-webkit-animation:slideLeft .2s ease-in-out both;animation:slideLeft .2s ease-in-out both;background:-webkit-linear-gradient(left,#000 0,rgba(0,0,0,.8) 100%);background:linear-gradient(to right,#000 0,rgba(0,0,0,.8) 100%);color:#fff;display:block;left:50px;opacity:1;padding:.4rem 1rem;position:absolute;top:calc(50% - 1rem);-webkit-transition:all .2s;transition:all .2s;white-space:nowrap;z-index:99}.main-nav a:hover .helper::after{background:#050505;height:12px;left:calc(-12px/2);position:absolute;top:calc(50% - 12px/2);transform:rotate(45deg);width:12px;z-index:98}.main-nav svg{height:1.5rem;width:1.5rem}.main-nav svg path{opacity:1}.main-nav .helper{display:none}.main-nav .icon{font-size:1.5rem;line-height:2.2rem}.main-nav .active{background:rgba(0,0,0,.2);color:#9dce0a}.main-nav .active svg path{fill:#9dce0a;opacity:1}@-webkit-keyframes slideLeft{0%{opacity:0}100%{opacity:1}}@keyframes slideLeft{0%{opacity:0}100%{opacity:1}}.related-tasks-body .pop-status,.related-tasks-body .pop-status a,.related-tasks-body .row{font-size:.9rem}.related-tasks-body .task-name input,.related-tasks-header .related-tasks-title{font-size:1rem}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine,.related-tasks-body .task-settings a{font-size:1.2rem}.related-tasks-body .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.related-tasks-header .related-tasks-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-left:1rem}.related-tasks{margin-bottom:2rem;position:relative}.related-tasks-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.related-tasks-header .add-button{background:#444;border:0;display:inline-block;padding:.5rem;-webkit-transition:background .25s;transition:background .25s}.related-tasks-header .add-button.is-active,.related-tasks-header .add-button:hover{background:#9dce0a}.related-tasks-header .add-button svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.related-tasks-body{width:100%}.related-tasks-body .row{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.5rem 0 .5rem .5rem;width:100%}.related-tasks-body .row:hover{background:0 0}.related-tasks-body .row:hover .task-settings{opacity:1;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .row:last-child{border:0}.related-tasks-body .row .tasks{overflow:hidden;width:100%}.related-tasks-body .row .status{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100px}.related-tasks-body .row .assigned-to{cursor:pointer;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.related-tasks-body .related-task-create-form{padding:0}.related-tasks-body .related-task-create-form.active{padding:.5rem 0 .5rem .5rem}.related-tasks-body .status:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.related-tasks-body .status .not-clickable:hover{color:#444}.related-tasks-body .status .popover a{text-align:left;width:100%}.related-tasks-body .status .popover .point{text-align:center}.related-tasks-body .status .icon{color:#b8b8b8;margin-left:.2rem;opacity:0}.related-tasks-body .pop-status{background:#050505;color:#fff;display:none;left:40%;list-style-type:none;margin:0;padding:10px 1rem 10px 10px;position:absolute;top:0;width:200px;z-index:99}.related-tasks-body .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.related-tasks-body .avatar,.related-tasks-body .task-name{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.related-tasks-body .pop-status a:last-child{border:0}.related-tasks-body .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.related-tasks-body .blocked .icon,.related-tasks-body .blocked .icon:hover,.related-tasks-body .blocked a,.related-tasks-body .blocked a:hover,.related-tasks-body .blocked:hover .icon,.related-tasks-body .blocked:hover .icon:hover,.related-tasks-body .blocked:hover a,.related-tasks-body .blocked:hover a:hover,.related-tasks-body .pop-status a:hover.point{color:#fff}.related-tasks-body .pop-status:after{background:#050505;height:15px;position:absolute;transform:rotate(45deg);width:0}.related-tasks-body .pop-status.fix{bottom:0;top:auto}.related-tasks-body .task-name{display:flex;position:relative}.related-tasks-body .task-name a{display:inline-block;max-width:90%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-name input{margin-right:1rem;padding:3px;width:85%}.related-tasks-body .task-name.loading{margin:0;padding:8px;text-align:center;width:100%}.related-tasks-body .task-name.loading span{-webkit-animation:loading .5s linear,spin 1s linear infinite;animation:loading .5s linear,spin 1s linear infinite}.related-tasks-body .blocked,.related-tasks-body .blocked:hover{background:#ff8282;color:#fff}.related-tasks-body .icon-iocaine{display:none}.related-tasks-body .iocaine,.related-tasks-body .iocaine:hover{background:rgba(157,206,10,.3)}.related-tasks-body .iocaine .icon-iocaine,.related-tasks-body .iocaine:hover .icon-iocaine{display:inline-block;margin-right:.5rem;vertical-align:top}.related-tasks-body .task-settings{margin:0 0 0 2rem;opacity:0;position:absolute;right:0;top:0;width:10%}.related-tasks-body .task-settings a{color:#b8b8b8;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .task-settings a:hover{color:#444;-webkit-transition:all .2s ease-in;transition:all .2s ease-in}.related-tasks-body .assigned-to{position:relative;text-align:left}.related-tasks-body .task-assignedto{position:relative}.related-tasks-body .task-assignedto.editable{cursor:pointer}.related-tasks-body .task-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .task-assignedto figcaption{max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.related-tasks-body .task-assignedto .icon{opacity:0;position:absolute;right:.5rem;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.related-tasks-body .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex}.related-tasks-body .avatar img{-webkit-flex-basis:35px;-ms-flex-preferred-size:35px;flex-basis:35px;height:35px;width:35px}.related-tasks-body .avatar figcaption{margin-left:.5rem}.ticket-data-container,.ticket-header .detail-status,.ticket-header .pop-status,.ticket-header .pop-status a,.ticket-status .priority-data .pop-priority,.ticket-status .priority-data .pop-priority a,.ticket-status .severity-data .pop-severity,.ticket-status .severity-data .pop-severity a,.ticket-status .type-data .pop-type,.ticket-status .type-data .pop-type a,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-size:.9rem}.ticket-header .ticket-title{font-size:1.6rem;vertical-align:sub}.ticket-header .pop-status,.ticket-header .ticket-title,.ticket-status .priority-data .pop-priority,.ticket-status .severity-data .pop-severity,.ticket-status .type-data .pop-type,.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.ticket-header{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:1.5rem 0 2rem;position:relative}.ticket-header .detail-status{display:inline-block;margin-left:.25rem;position:relative}.ticket-header .detail-status .icon-arrow-bottom{margin-left:.25rem}.ticket-header .detail-status-inner{color:#fff;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;padding:.15rem .25rem}.ticket-header .pop-status{background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;position:absolute;top:1.25rem;width:150px;z-index:99;padding:0;text-transform:none}.ticket-header .pop-status a{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;border-bottom:1px solid #444;color:#fff;display:block;padding:.5rem 1rem}.ticket-header .pop-status a:last-child{border:0}.ticket-header .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-header .pop-status a:hover.point{color:#fff}.ticket-header .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-header .pop-status a:hover{background:rgba(157,206,10,.2)}.ticket-data-container{margin-bottom:1rem}.ticket-data-container .icon{margin-left:.25rem}.ticket-status:last-child{margin:0}.ticket-status .level{display:inline-block;margin-right:.5rem;vertical-align:top}.filters h1,.filters h1 a{vertical-align:baseline}.ticket-status .level-name{color:#c2c2c2;float:right;text-transform:lowercase}.ticket-status .clickable:hover{background:#dcdcdc;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .type-data{background:#e8e8e8;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .type-data .pop-type{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .type-data .pop-type a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .type-data .pop-type a:last-child{border:0}.ticket-status .type-data .pop-type a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .type-data .pop-type a:hover.point{color:#fff}.ticket-status .type-data .pop-type:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-status .severity-data{background:#e8e8e8;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .severity-data .pop-severity{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .severity-data .pop-severity a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .severity-data .pop-severity a:last-child{border:0}.ticket-status .severity-data .pop-severity a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .severity-data .pop-severity a:hover.point{color:#fff}.ticket-status .severity-data .pop-severity:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-status .priority-data{background:#e8e8e8;margin-bottom:.5rem;padding:.5rem 1rem .5rem .5rem;position:relative;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.ticket-status .priority-data .pop-priority{background:#050505;color:#fff;display:none;left:30px;list-style-type:none;margin:0;padding:10px;position:absolute;width:150px;z-index:99}.ticket-status .priority-data .pop-priority a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.ticket-status .priority-data .pop-priority a:last-child{border:0}.ticket-status .priority-data .pop-priority a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.ticket-status .priority-data .pop-priority a:hover.point{color:#fff}.ticket-status .priority-data .pop-priority:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.ticket-detail-settings img,.ticket-detail-settings svg{max-height:1.25rem;max-width:1.25rem;width:100%}.ticket-watch-buttons{margin-bottom:1rem}.ticket-watch .ticket-watch-title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;margin-bottom:.5rem}.ticket-watch .ticket-watch-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ticket-watch .track-icon{position:relative;top:2px}.ticket-watch .add-watcher,.ticket-watch .ticket-watch-button{background:#b8b8b8;color:#fff;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;padding:.25rem;text-align:center;text-transform:uppercase;-webkit-transition:background .25s;transition:background .25s}.ticket-watch .add-watcher path,.ticket-watch .ticket-watch-button path{fill:#fff}.ticket-watch .add-watcher:hover,.ticket-watch .ticket-watch-button:hover{background:#9dce0a}.ticket-watch .add-watcher.is-hover,.ticket-watch .ticket-watch-button.is-hover{background:red;color:#f5f5f5;-webkit-transition:background .3s;transition:background .3s}.ticket-watch .add-watcher.is-hover svg,.ticket-watch .ticket-watch-button.is-hover svg{fill:#ff8282}.ticket-watch .add-watcher.active,.ticket-watch .ticket-watch-button.active{background:#9dce0a}.ticket-watch .add-watcher.active:hover,.ticket-watch .ticket-watch-button.active:hover{background:#ff8282}.ticket-watch .add-watcher.active svg,.ticket-watch .ticket-watch-button.active svg{fill:#fff}.ticket-watch .ticket-watch-button{margin-right:.25rem}.wizard-create-project .create-step1 fieldset:first-child,.wizard-create-project .wizard-action a:first-child{margin-right:.5rem}.ticket-detail-settings{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin-top:2rem}.ticket-detail-settings .button-delete,.ticket-detail-settings .item-block,.ticket-detail-settings .item-unblock,.ticket-detail-settings .promote-button,.ticket-detail-settings label{background:#b8b8b8;display:inline-block;margin-right:.5rem;padding:1rem;-webkit-transition:background .2s linear;transition:background .2s linear;-webkit-transition-delay:.1s;transition-delay:.1s}.ticket-detail-settings .button-delete:hover,.ticket-detail-settings .item-block:hover,.ticket-detail-settings .item-unblock:hover,.ticket-detail-settings .promote-button:hover,.ticket-detail-settings label:hover{background:#555}.ticket-detail-settings .button-delete.editable,.ticket-detail-settings .item-block.editable,.ticket-detail-settings .item-unblock.editable,.ticket-detail-settings .promote-button.editable,.ticket-detail-settings label.editable{cursor:pointer}.ticket-detail-settings .button-delete+input,.ticket-detail-settings .item-block,.ticket-detail-settings .item-block+input,.ticket-detail-settings .item-unblock,.ticket-detail-settings .item-unblock+input,.ticket-detail-settings .promote-button+input,.ticket-detail-settings label+input{display:none}.ticket-detail-settings .item-block.is-active,.ticket-detail-settings .item-unblock.is-active{display:inline-block}.ticket-detail-settings .item-unblock{background:#ff8282}.ticket-detail-settings .item-unblock:hover{background:red}.ticket-detail-settings .button-delete{background:#ff8282}.ticket-detail-settings .button-delete:hover{background:red}.ticket-detail-settings svg{fill:#fff;height:100%}.single-project .track-container .icon path,.single-project .track-container .list-itemtype-track-likers.active path,.single-project .track-container .list-itemtype-track-watchers.active path{fill:currentcolor}.wizard-create-project{background:url(../images/invitation_bg.jpg) center center no-repeat;bottom:0;display:none;left:0;opacity:0;position:fixed;right:0;top:0;z-index:99910;background-size:cover;color:#fff;text-align:center}.wizard-create-project p{font-size:.9rem}.wizard-create-project .close{font-size:2rem;position:absolute;right:2rem;top:1rem;-webkit-transition:color .2s;transition:color .2s}.open.wizard-create-project{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:1;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.close.wizard-create-project{opacity:0;-webkit-transition:opacity .3s ease;transition:opacity .3s ease}.wizard-create-project fieldset{margin-bottom:1rem}.wizard-create-project .button-gray,.wizard-create-project .button-green{display:block;padding:12px;text-align:center}.wizard-create-project form{width:500px}.wizard-create-project .title{text-align:center;width:100%}.wizard-create-project h1,.wizard-create-project p{color:#fff}.wizard-create-project h1{line-height:1.5rem}.wizard-create-project p{opacity:.8}.wizard-create-project input,.wizard-create-project select,.wizard-create-project textarea{background:rgba(255,255,255,.7)}.wizard-create-project input::-webkit-input-placeholder,.wizard-create-project select::-webkit-input-placeholder,.wizard-create-project textarea::-webkit-input-placeholder{color:#444}.wizard-create-project input::-moz-placeholder,.wizard-create-project select::-moz-placeholder,.wizard-create-project textarea::-moz-placeholder{color:#444}.wizard-create-project input:-moz-placeholder,.wizard-create-project select:-moz-placeholder,.wizard-create-project textarea:-moz-placeholder{color:#444}.wizard-create-project input:-ms-input-placeholder,.wizard-create-project select:-ms-input-placeholder,.wizard-create-project textarea:-ms-input-placeholder{color:#444}.wizard-create-project .close{color:#fff}.wizard-create-project .close:hover{color:#ff8282}.wizard-create-project .wizard-step{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out;-webkit-animation-direction:alternate-reverse;animation-direction:alternate-reverse;display:none}.wizard-create-project .wizard-step.active{-webkit-animation:formSlide .4s ease-in-out;animation:formSlide .4s ease-in-out}.wizard-create-project .wizard-step.active.create-step1,.wizard-create-project .wizard-step.active.create-step2,.wizard-create-project .wizard-step.active.create-step3{display:block}.wizard-create-project .wizard-action div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .wizard-action a{color:#fff;display:inline-block;-webkit-flex-basis:40%;-ms-flex-preferred-size:40%;flex-basis:40%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 .template-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.wizard-create-project .create-step1 fieldset{-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.wizard-create-project .create-step1 input{display:none}.wizard-create-project .create-step1 input:checked+label{background:rgba(157,206,10,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label{background:rgba(245,245,245,.7);cursor:pointer;display:block;margin-bottom:1rem;padding:1rem;text-align:center;-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label:hover{background:rgba(114,161,20,.7);-webkit-transition:background .3s ease-in;transition:background .3s ease-in}.wizard-create-project .create-step1 input+label .icon{font-size:3rem;color:#fff}.wizard-create-project .create-step1 h2{color:#fff;margin:.5rem 0 0;text-transform:uppercase}.wizard-create-project .create-step1 p{text-align:center}.wizard-create-project .progress-bar{bottom:0;height:.5rem;left:0;position:absolute;width:100%}.wizard-create-project .step1 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:25%}.wizard-create-project .step1 .progress-state span:nth-child(1){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .step2 .bar{-webkit-transition:width .6s ease-in-out;transition:width .6s ease-in-out;width:75%}.wizard-create-project .step2 .progress-state span:nth-child(1),.wizard-create-project .step2 .progress-state span:nth-child(2){color:#fff;-webkit-transition:color .3s ease-in-out;transition:color .3s ease-in-out;-webkit-transition-delay:.6s;transition-delay:.6s}.wizard-create-project .progress-state{position:absolute;width:100%}.wizard-create-project .progress-state span{color:rgba(255,255,255,.5);display:inline-block;margin-left:-100px;position:absolute;text-align:center;top:-2rem;-webkit-transition:all 1s ease-in;transition:all 1s ease-in;width:200px}.wizard-create-project .progress-state span:nth-child(1){left:25%}.wizard-create-project .progress-state span:nth-child(2){left:75%}.wizard-create-project .progress-bar-wrapper{background:rgba(255,255,255,.3);height:.5rem}.wizard-create-project .bar{background:rgba(157,206,10,.9);height:.5rem;left:0;position:absolute;top:0;width:0}.create-project{background:url(../images/bg.png) center center no-repeat;background-size:cover;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;bottom:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;left:0;position:fixed;right:0;top:0;z-index:999}.create-project .tagline{font-size:2rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;color:#fff;line-height:2rem;text-transform:uppercase}.introjs-tooltip p,.single-project .description,.single-project .looking-for-people p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.create-project fieldset{margin-bottom:1rem}.create-project .create-project-container{-webkit-flex-basis:400px;-ms-flex-preferred-size:400px;flex-basis:400px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.create-project h1{color:#fff;text-align:center}.create-project .logo,.create-project .tagline{margin-bottom:1rem;text-align:center}.create-project form{margin-bottom:2rem}.create-project input{background:#fff}.create-project input::-webkit-input-placeholder{color:#b8b8b8}.create-project input::-moz-placeholder{color:#b8b8b8}.create-project input:-moz-placeholder{color:#b8b8b8}.create-project input:-ms-input-placeholder{color:#b8b8b8}.create-project .button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.create-project .button:hover{background:#9dce0a}.create-project a:hover{color:#fff}.filters h2 .icon-arrow-right{font-size:1rem}.filters-inner .loading .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32;max-height:1rem;max-width:1rem}.profile .timeline-wrapper .spin img,.user-profile .loading-spinner{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate}.filters h1 .icon{margin:0}.filters h2 .icon-arrow-right,.issues-table .subject span,.single-project h1{vertical-align:middle}.filters h2{font-size:1.2rem;margin-top:1rem}.filters input{background:#444;color:#fff}.filters input::-webkit-input-placeholder{color:#b8b8b8}.filters input::-moz-placeholder{color:#b8b8b8}.filters input:-moz-placeholder{color:#b8b8b8}.filters input:-ms-input-placeholder{color:#b8b8b8}.filters .icon-search{color:#b8b8b8;position:absolute;right:.7rem;top:.7rem}.filters-inner{opacity:0;-webkit-transition:all .1s ease-in;transition:all .1s ease-in}.filters-inner .loading{margin:0;padding:8px;text-align:center;width:100%}.filters-applied{margin-top:.5rem}.filters-step-cat .save-filters{color:#fff;display:block;text-align:center}.filters-step-cat .my-filter-name{background:#444;color:#f5f5f5;width:100%}.filters-step-cat .my-filter-name::-webkit-input-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name::-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-moz-placeholder{color:#b8b8b8}.filters-step-cat .my-filter-name:-ms-input-placeholder{color:#b8b8b8}.filters-cats{margin-top:2rem}.filters-cats li{border-bottom:1px solid #b8b8b8;text-transform:uppercase}.filters-cats .custom-filters .title{color:#72a114}.filters-cats a{color:#444;display:block;padding:.5rem 0 .5rem .5rem;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover{color:#72a114;-webkit-transition:color .2s ease-in;transition:color .2s ease-in}.filters-cats a:hover .icon{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.filters-cats .icon{color:#444;float:right;opacity:0;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.introjs-tooltip h3{font-size:1.2rem;margin-bottom:.5rem}.introjs-tooltip p{line-height:1.4;margin-bottom:0}.introjs-overlay{background:-webkit-radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background:radial-gradient(center,ellipse cover,rgba(255,255,255,.2) 0,rgba(245,245,245,.2) 100%);background-color:#f5f5f5}.introjs-helperLayer{border:1px solid rgba(157,206,10,.8)}.introjs-helperLayer,.introjs-tooltip{box-shadow:0 1px 8px rgba(68,68,68,.2)}.introjs-bullets ul li a.active{background:#9dce0a}.introjs-button{background-color:#72a114;background-image:none;border:0;border-radius:0;color:#fff;margin-top:10px;padding:.3rem .8rem;text-shadow:none}.introjs-button:focus,.introjs-button:hover{background:#9dce0a;color:#fff}.introjs-button.introjs-disabled{background:#f5f5f5;background-color:none;color:#fff}.lightbox-generic-notion section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:600px;-ms-flex-preferred-size:600px;flex-basis:600px}.single-project .looking-for-people h3,.single-project .looking-for-people p,.single-project .track-container .list-itemtype-track{font-size:.9rem}.single-project .description,.single-project .title{font-size:1rem}.single-project .single-project-intro{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.single-project .project-logo{margin-right:1rem;width:6rem}.single-project .project-logo img{width:100%}.single-project .single-project-title-wrapper{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.single-project .intro-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem}.single-project .intro-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project h1{color:#72a114;display:inline-block;line-height:1.2;margin-bottom:0}.single-project .like-watch-container{margin-left:auto}.single-project .track-buttons-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .like-button{margin-right:.75rem}.single-project .track-container .list-itemtype-track{color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.single-project .track-container .list-itemtype-track .list-itemtype-track-likers{margin-right:.5rem}.single-project .track-container .list-itemtype-track-likers,.single-project .track-container .list-itemtype-track-watchers{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.single-project .track-container .list-itemtype-track-likers .icon,.single-project .track-container .list-itemtype-track-watchers .icon{display:block;margin-right:.2rem;width:16px}.single-project .project-data,.single-project .title{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.single-project .track-container .list-itemtype-track-likers.active,.single-project .track-container .list-itemtype-track-watchers.active{color:#72a114}.single-project .track-container .icon svg{height:1rem;width:1rem}.single-project .description{margin:0}.single-project .project-data{display:flex}.single-project .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:.5rem;padding:.5rem 1rem}.single-project .single-project-tags{margin-bottom:1rem;margin-top:1rem}.single-project .timeline{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-shrink:3;-ms-flex-negative:3;flex-shrink:3;margin-right:1rem;max-width:960px;width:0}.single-project .looking-for-people img{width:100%}.single-project .involved-data{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;width:220px}.single-project .involved-organization,.single-project .involved-team{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-bottom:1rem}.single-project .involved-organization li,.single-project .involved-team li{-webkit-flex-basis:24%;-ms-flex-preferred-size:24%;flex-basis:24%;margin-right:.14rem}.single-project .involved-organization li:nth-child(4n),.single-project .involved-team li:nth-child(4n){margin-right:0}.single-project .involved-organization a,.single-project .involved-team a{display:block}.single-project .involved-organization img,.single-project .involved-team img{border-radius:.2rem;width:100%}.issues-options{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background-color:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end;margin-bottom:2rem}.issues-options .button-bulk{margin-left:.2rem}.issues-table .pop-status,.issues-table .pop-status a,.issues-table .table-main{font-size:.9rem}.issues-table .title{font-size:1rem}.empty-issues .title{font-size:1.2rem;text-transform:uppercase}.empty-issues p,.issues-table .pop-status{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.issues-table .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8}.issues-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:2rem}.issues-table.empty{display:none}.issues-table .row:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .row .icon{display:inline}.issues-table .avatar,.kanban-table{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.issues-table .row.is-blocked{background:#ffe8e8}.issues-table .row.is-blocked .blocked-text{color:red;margin-right:.5rem}.issues-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.issues-table .title:hover{background:0 0}.issues-table .title div{cursor:pointer}.issues-table .title .votes{color:#555}.issues-table .table-main{border-bottom:1px solid #ebebeb}.issues-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex}.issues-table .avatar img{width:35px}.issues-table .avatar figcaption{-webkit-flex-basis:60%;-ms-flex-preferred-size:60%;flex-basis:60%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;margin-left:.5rem}.issues-table .level-field{-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes{color:#555;-webkit-flex-basis:75px;-ms-flex-preferred-size:75px;flex-basis:75px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;text-align:center;width:75px}.issues-table .votes.inactive{color:#b8b8b8}.issues-table .votes.is-voted{color:#9dce0a}.issues-table .subject{overflow:hidden;padding-right:1rem;width:100%}.issues-table .subject a{max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block}.issues-table .subject span:first-child{margin-right:.5rem}.issues-table .assigned-field,.issues-table .created-field,.issues-table .issue-field{-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding:0 1rem;position:relative;text-align:left}.issues-table .assigned-field{-webkit-box-flex:0;-webkit-flex:0 0 160px;-ms-flex:0 0 160px;flex:0 0 160px;max-width:160px}.issues-table .issue-assignedto{cursor:pointer;position:relative}.issues-table .issue-assignedto:hover .icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .issue-assignedto figcaption{max-width:60%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.issues-table .issue-assignedto .icon{opacity:0;position:absolute;right:0;top:.5rem;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.issues-table .pop-status{background:#050505;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;top:20px;width:200px;z-index:99}.issues-table .pop-status a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.issues-table .pop-status a:last-child{border:0}.search-filter,.search-result-table{border-top:1px solid #f5f5f5}.issues-table .pop-status a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.issues-table .pop-status a:hover.point{color:#fff}.issues-table .pop-status:after{background:#050505;content:'';height:15px;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:0}.issues-table .pop-status.fix{bottom:0;top:auto}@media (max-width:1280px){.issues-table .created-field,.issues-table .level-field{display:none}}.empty-issues{margin-top:4rem;text-align:center}.empty-issues img{margin-bottom:1rem}.empty-issues p,.kanban-table .vfold.task-colum-name .hunfold{margin:0}.kanban-table-body .task-column .kanban-column-intro{font-size:.9rem}.kanban-table-body,.kanban-table-header .task-colum-name,.kanban-table-header .task-colum-name .icon{font-size:1rem}.kanban-table{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;height:100%;overflow:hidden;width:100%}.kanban-table .vfold.task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;cursor:pointer;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;opacity:.8;padding:.5rem 0;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.kanban-table .vfold .kanban-column-intro,.kanban-table .vfold .kanban-task,.kanban-table .vfold.task-colum-name .icon-bulk,.kanban-table .vfold.task-colum-name .icon-closed-eye,.kanban-table .vfold.task-colum-name .icon-open-eye,.kanban-table .vfold.task-colum-name .icon-plus,.kanban-table .vfold.task-colum-name .icon-vfold,.kanban-table .vfold.task-colum-name .icon-vunfold,.kanban-table .vfold.task-colum-name span{display:none}.kanban-table .vfold.task-colum-name,.kanban-table .vfold.task-column{-webkit-flex-flow:1;-ms-flex-flow:1;flex-flow:1;max-width:30px;min-height:2.5rem;min-width:30px;width:30px}.kanban-table .readonly{cursor:auto}.kanban-table-header{margin-bottom:.5rem;min-height:40px;position:relative;width:100%}.kanban-table-header .kanban-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;position:absolute}.kanban-table-header .task-colum-name{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:0 10px 0 0;max-width:300px;padding:.5rem .5rem .5rem 1rem;position:relative;text-transform:uppercase}.kanban-table-header .task-colum-name:last-child{margin-right:0}.kanban-table-header .task-colum-name span{max-width:65%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.kanban-table-header .task-colum-name .icon{margin-right:.3rem;-webkit-transition:color .2s linear;transition:color .2s linear}.kanban-table-header .task-colum-name .icon.hfold,.kanban-table-header .task-colum-name .icon.hunfold{display:inline-block;-webkit-transform:rotate(90deg);transform:rotate(90deg)}.kanban-table-header .icon-closed-eye,.kanban-table-header .icon-open-eye{display:inline-block}.kanban-table-header .icon-closed-eye svg,.kanban-table-header .icon-open-eye svg{fill:#b8b8b8;height:1.1rem;margin-top:.25rem;width:1.1rem}.kanban-table-header .icon-closed-eye:hover svg,.kanban-table-header .icon-open-eye:hover svg{fill:#72a114}.kanban-table-header .icon-open-eye .svg-eye-closed{display:none}.kanban-table-header .icon-closed-eye .svg-eye-closed,.kanban-table-header .icon-open-eye .svg-eye-open{display:block}.kanban-table-header .icon-closed-eye .svg-eye-open{display:none}.kanban-table-body,.kanban-table-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.kanban-table-body{display:flex;height:100%;overflow:hidden;overflow-x:auto;width:100%}.kanban-table-body .task-column{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin:0 10px 0 0;max-width:300px;overflow-y:auto;widows:300px}.kanban-table-body .task-column:last-child{margin-right:0}.kanban-table-body .task-column .kanban-column-intro{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#b8b8b8;margin:1rem 2rem}.kanban-table-body .task-column .kanban-column-intro.active{color:#050505}.kanban-table-body .task-column .kanban-wip-limit{background:red;border-radius:2px;height:4px;margin:.5rem 0;padding:0}.kanban-table-inner{display:flex;-webkit-flex-wrap:nowrap;-ms-flex-wrap:nowrap;flex-wrap:nowrap}.search-filter{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:0;z-index:9}.search-filter a{background:#fff;color:#b8b8b8;display:inline-block;margin-right:1rem;padding:1rem 1.25rem}.search-filter .icon,.search-filter a:hover .icon{margin-right:.4rem}.search-filter .name,.search-filter a:hover .name{padding-left:5px}.search-filter a:hover{-webkit-transition:color .3s linear;transition:color .3s linear}.search-filter a.active{border-left:1px solid #f5f5f5;border-right:1px solid #f5f5f5;color:#444;position:relative;top:1px}.search-filter a.active .icon{color:#9dce0a}.search-in input{background:#444;color:#fff}.search-in input::-webkit-input-placeholder{color:#b8b8b8}.search-in input::-moz-placeholder{color:#b8b8b8}.search-in input:-moz-placeholder{color:#b8b8b8}.search-in input:-ms-input-placeholder{color:#b8b8b8}.search-in .icon-search-wrapper{position:absolute;right:.7rem;top:.7rem}.search-in .icon-search{color:#b8b8b8}.search-in .loading-spinner{margin-top:.1rem}.search-result-table .table-main{font-size:.9rem;border-bottom:1px solid #f5f5f5}.search-result-table .user-story-name .icon{font-size:1rem;color:#b8b8b8}.empty-search-results .title{font-size:1.2rem;text-transform:uppercase}.empty-search-results p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.search-result-table-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.search-result-table .row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem}.search-result-table .row .ref{-webkit-flex-basis:30px;-ms-flex-preferred-size:30px;flex-basis:30px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;padding:0 1rem}.search-result-table .row .user-stories{-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-flex:10;-webkit-flex-grow:10;-ms-flex-positive:10;flex-grow:10;-webkit-flex-shrink:1;-ms-flex-negative:1;flex-shrink:1}.search-result-table .row .points,.search-result-table .row .status{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem;text-align:center}.search-result-table .row .assigned-to{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;padding:0 1rem}.search-result-table .row-selected{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.search-result-table .user-story-name input{vertical-align:top}.search-result-table .user-story-name span{display:inline-block;max-width:70%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.search-result-table .user-story-name .icon:hover{color:#444;-webkit-transition:color .3s linear;transition:color .3s linear}.search-result-table .points,.search-result-table .status{position:relative}.search-result-table .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.search-result-table .avatar img{width:35px}.search-result-table .avatar .avatar-caption{display:block;margin-left:.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:80px}.empty-search-results{margin-top:4rem;text-align:center}.empty-search-results img{margin-bottom:1rem}.empty-search-results p{margin:0}.team-filters nav li{font-size:1.6rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.table-team .team-header,.team-filters nav li:last-child{border-bottom:0}.team-filters .search-in{margin-bottom:1rem;position:relative}.team-filters nav a{display:block;padding:1rem 0 1rem 1rem}.team-filters nav a.active,.team-filters nav a:hover{color:#72a114;-webkit-transition:color .3s linear;transition:color .3s linear}.team-filters nav .active,.team-filters nav a.active.icon{opacity:1;-webkit-transition:opacity .3s linear;transition:opacity .3s linear}.team-filters nav .icon{color:#050505;float:right;opacity:0}.table-team .leave-project,.table-team .popover,.table-team .popover a{font-size:.9rem}.table-team .attribute .points{font-size:1.6rem}.table-team .attribute,.table-team .attribute .points,.table-team .avatar .position,.table-team .popover{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.policy-table .policy-table-header,.table-team .avatar .name,.table-team .team-header{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.table-team .row{padding:.5rem}.table-team .username{-webkit-flex-basis:220px;-ms-flex-preferred-size:220px;flex-basis:220px;min-width:25%}.table-team .member-stats{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:6;-webkit-flex:6;-ms-flex:6;flex:6;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.table-team .attribute{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;position:relative;text-align:center}.table-team .attribute .icon{color:#050505;font-size:1.8rem}.table-team .attribute .points{color:#444}.table-team .attribute .top{color:#9dce0a;opacity:1}.table-team .attribute:hover .popover{display:block}.table-team .leave-project{color:#b8b8b8;display:block}.table-team .leave-project .icon{margin-right:.2rem}.table-team .leave-project:hover .icon{color:red;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .hero{width:100%}.table-team .hero .row{background:#f5f5f5;border-bottom:0;margin:1rem 0}.table-team .avatar{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.table-team .avatar img{-webkit-flex-basis:66px;-ms-flex-preferred-size:66px;flex-basis:66px;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;max-width:66px}.table-team .avatar figcaption{margin-left:1rem;width:65%}.table-team .avatar figcaption span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%}.table-team .avatar .name,.table-team .avatar .position{display:block;width:100%}.table-team .avatar .position{color:#b8b8b8}.table-team .popover{background:#050505;bottom:30px;color:#fff;display:none;left:0;list-style-type:none;margin:0;padding:10px;position:absolute;width:100%;z-index:99}.table-team .popover a{border-bottom:1px solid #444;color:#fff;display:block;padding:10px 2px}.table-team .popover a:last-child{border:0}.table-team .popover a:hover{color:#9dce0a;-webkit-transition:color .3s linear;transition:color .3s linear}.table-team .popover a:hover.point{color:#fff}.table-team .popover:after{background:#050505;bottom:-5px;content:'';height:15px;left:50%;position:absolute;-webkit-transform:rotate(45deg);transform:rotate(45deg);width:15px}.policy-table .policy-table-row{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center}.policy-table .policy-table-header{border-bottom:2px solid #b8b8b8}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none,.policy-table .policy-table-project{padding:1rem}.policy-table .policy-table-project{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:3;-webkit-flex-grow:3;-ms-flex-positive:3;flex-grow:3}.policy-table .policy-table-all,.policy-table .policy-table-involved,.policy-table .policy-table-none{-webkit-flex-basis:0;-ms-flex-preferred-size:0;flex-basis:0;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1}.policy-table input{display:none}.policy-table input:checked+label{background:#72a114;-webkit-transition:background .3s linear;transition:background .3s linear}.policy-table label{background:#b8b8b8;border-radius:5px;color:#fff;display:block;padding:.5rem}.policy-table label:hover{background:#9dce0a;cursor:pointer;-webkit-transition:background .3s linear;transition:background .3s linear}.user-change-password fieldset{margin-bottom:1rem;width:50%}.user-change-password fieldset:last-child{margin-top:2rem}.user-change-password label{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;display:block;margin-bottom:.5rem}.user-change-password .button-green{color:#fff;display:block;padding:12px;text-align:center}.user-profile .use-default-image{font-size:.75rem}.user-profile .loading-spinner{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;max-height:1rem;max-width:1rem;border:0;-webkit-transform-origin:center center;transform-origin:center center}.user-profile{max-width:780px}.user-profile form{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.user-profile fieldset{margin-bottom:1rem}.user-profile label{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;display:block;margin-bottom:.2rem}.user-profile .project-details-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;width:180px;margin-right:2rem}.user-profile .project-details-image .image,.user-profile .submit-button,.wiki-nav li .loading{width:100%}.user-profile .change-image{display:block}.user-profile .image-container{position:relative;margin-bottom:.5rem}.user-profile .loading-overlay{display:none}.user-profile .loading-overlay.active{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:rgba(5,5,5,.8);bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;left:0;position:absolute;right:0;top:0;width:100%}.user-profile .use-default-image{display:block;margin-top:.25rem;text-align:center}.user-profile .use-default-image:hover{color:red}.user-profile .project-details-form-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;max-width:500px}@media (max-width:767px){.user-profile form{display:block}}.user-profile .delete-account{font-size:.9rem;display:block;margin-top:1rem}.wiki-nav li input{font-size:1rem}.attachment-list .attachment-settings .editable-settings,.attachment-list .attachment-settings .settings,.attachment-list .icon-delete,.wiki-nav li{font-size:1.2rem}.wiki-nav li{font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif;border-bottom:1px solid #b8b8b8;text-transform:uppercase}.wiki-nav li:hover .icon{opacity:1;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li a{display:block;padding:1rem 0 1rem 1rem}.wiki-nav li a span{cursor:pointer}.wiki-nav li .icon{color:#050505;float:right;opacity:0;-webkit-transition:opacity 1s linear;transition:opacity 1s linear}.wiki-nav li input{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif;background:#444;color:#f5f5f5}.attachment-gallery .single-attachment .attachment-name,.attachments-header .size-info{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.wiki-nav li input::-webkit-input-placeholder{color:#b8b8b8}.wiki-nav li input::-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-moz-placeholder{color:#b8b8b8}.wiki-nav li input:-ms-input-placeholder{color:#b8b8b8}.wiki-nav li .loading{margin:0;padding:8px;text-align:center}.wiki-nav .add-button{color:#fff;display:block;margin-bottom:.5rem;text-align:center}.wiki-summary .wiki-user-modification,.wiki-summary div{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.wiki-summary .username{font-size:1.2rem;color:#9dce0a;white-space:nowrap}.wiki-summary{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary div{display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-right:1rem}.wiki-summary .number{line-height:2rem;top:0}.wiki-summary .wiki-user-modification{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.wiki-summary figure{margin-right:.3rem;width:32px}.attachment-gallery{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start;margin-top:1rem}.attachment-gallery .single-attachment{margin-bottom:.5rem;margin-right:.5rem;max-width:200px}.attachment-gallery .single-attachment:hover .icon-delete{opacity:1}.attachment-gallery .single-attachment .attachment-image{display:inline-block}.attachment-gallery .single-attachment img{height:150px;margin-bottom:.2rem;width:200px}.attachment-gallery .single-attachment img:hover{-webkit-filter:saturate(150%) hue-rotate(60deg);filter:saturate(150%) hue-rotate(60deg);-webkit-transition:all .3s cubic-bezier(.01,.7,1,1);transition:all .3s cubic-bezier(.01,.7,1,1)}.attachment-gallery .single-attachment.deprecated img{opacity:.5}.attachment-gallery .single-attachment.deprecated .attachment-name{color:#b8b8b8}.attachment-gallery .single-attachment .attachment-data{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.attachment-gallery .single-attachment .attachment-name{max-width:175px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:inline-block}.attachment-gallery .single-attachment .icon-delete{color:#ff8282;margin-left:auto;opacity:0;-webkit-transition:opacity .3s ease-in;transition:opacity .3s ease-in;-webkit-transition-delay:.2s;transition-delay:.2s}.attachment-gallery .single-attachment .icon-delete:hover{color:red}.attachment-gallery .single-attachment .loading-container{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:150px;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;margin:0 .5rem .5rem 0;width:200px}.attachment-gallery .single-attachment .loading-spinner{margin:0 auto;max-height:3rem;max-width:3rem}.attachment-list .single-attachment{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:.5rem 0 .5rem .5rem;position:relative}.attachment-list .single-attachment:hover .settings{opacity:1;-webkit-transition:opacity .2s ease-in;transition:opacity .2s ease-in}.attachment-list .single-attachment.deprecated,.attachment-list .single-attachment.deprecated .attachment-name a{color:#b8b8b8}.attachment-list .attachment-name{max-width:90%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-webkit-flex-basis:25%;-ms-flex-preferred-size:25%;flex-basis:25%;-webkit-box-flex:1;-webkit-flex-grow:1;-ms-flex-positive:1;flex-grow:1;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;padding-right:1rem}.attachment-list .attachment-comments,.attachment-list .editable-attachment-comment{-webkit-box-flex:2;-webkit-flex:2;-ms-flex:2;flex:2;-webkit-flex-basis:50%;-ms-flex-preferred-size:50%;flex-basis:50%;margin-right:.5rem}.attachment-list .attachment-comments span,.attachment-list .editable-attachment-comment span{color:#555}.attachment-list .attachment-size{-webkit-flex-basis:125px;-ms-flex-preferred-size:125px;flex-basis:125px;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.attachment-list .attachment-settings{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:10%;-ms-flex-preferred-size:10%;flex-basis:10%;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around;margin-left:auto}.attachment-list .attachment-settings .editable-settings,.attachment-list .attachment-settings .settings{color:#b8b8b8}.attachment-list .attachment-settings .editable-settings:hover,.attachment-list .attachment-settings .settings:hover{color:#72a114}.attachment-list .attachment-settings .settings{opacity:0}.attachment-list .attachment-settings .editable-settings{opacity:1}.attachment-list .attachment-settings .icon-delete:hover{color:red}.attachment-list .attachment-settings .icon-drag-v{cursor:move}.attachment-list .icon-delete{color:#b8b8b8}.attachment-list .icon-delete:hover{color:red}.attachment-list .editable-attachment-deprecated{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding-left:1rem}.attachment-list .editable-attachment-deprecated span{color:#b8b8b8}.attachment-list .editable-attachment-deprecated input{margin-right:.2rem;vertical-align:middle}.attachment-list .editable-attachment-deprecated input:checked+span{color:#444}.attachment-list .percentage{background:rgba(114,161,20,.1);bottom:0;height:40px;left:0;position:absolute;top:0;width:45%}.attachments-header .size-info,.more-attachments,.single-attachment{font-size:.9rem}.attachments-header .attachments-title{font-size:1rem;color:#444;padding:0 1rem}.attachments-empty,.attachments-header .attachments-title,.live-announcement-inner .title,.live-announcement-inner .warning a,.single-attachment .attachment-name{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.attachments{margin-bottom:2rem}.attachments-header{-webkit-align-content:space-between;-ms-flex-line-pack:justify;align-content:space-between;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:36px}.attachments-header .options{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.attachments-header label{cursor:pointer;margin-left:.25rem}.attachments-header label.add-attachment-button{background:#555;border:0;display:inline-block;padding:.5rem;-webkit-transition:background .25s;transition:background .25s}.attachments-header label.add-attachment-button:hover{background:#9dce0a}.attachments-header label svg{fill:#fff;height:1.25rem;margin-bottom:-.2rem;width:1.25rem}.attachments-header button{background:0 0;margin-right:.2rem}.attachments-header button.is-active svg,.attachments-header button:hover svg{fill:#9dce0a}.attachments-header button svg{fill:#b8b8b8;height:1.6rem;margin-bottom:-.2rem;width:1.6rem}.attachments-header .size-info{color:#555;padding-left:1rem}.more-attachments span,.single-attachment .attachment-size{color:#b8b8b8}.attachments-header input{display:none}.attachments-empty{font-size:1.2rem;border:3px dashed #f5f5f5;color:#b8b8b8;margin-top:.5rem;padding:1rem;text-align:center}.single-attachment.ui-sortable-helper{background:#f6fceb;box-shadow:1px 1px 10px rgba(0,0,0,.1);-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.single-attachment.sortable-placeholder{background:#f5f5f5;height:40px}.single-attachment .attachment-name{padding-right:1rem}.single-attachment .attachment-name .icon{margin-right:.25rem}.single-attachment .attachment-name svg{height:1.2rem;width:1.2rem}.more-attachments{border-bottom:1px solid #b8b8b8;display:block;padding:1rem 0 1rem 1rem}.live-announcement,.live-announcement-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.more-attachments .more-attachments-num{color:#72a114;margin-left:.5rem}.more-attachments:hover{background:#f6fceb;-webkit-transition:background .2s ease-in;transition:background .2s ease-in}.attachment-preview img{max-height:80vh;max-width:80vw}.live-announcement-inner .title{font-size:1.6rem;color:#107a8a;margin-bottom:.5rem}.live-announcement{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#98e0eb;display:flex;height:0;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;overflow:hidden;pointer-events:none;position:fixed;top:0;-webkit-transition:width .5s,height .5s;transition:width .5s,height .5s;-webkit-transition-delay:.5s;transition-delay:.5s;width:0;z-index:99}.live-announcement .live-announcement-inner{opacity:0;-webkit-transition:opacity .5s;transition:opacity .5s;width:100%}.live-announcement.visible{height:146px;pointer-events:auto;-webkit-transition-delay:0s;transition-delay:0s;width:100%}.live-announcement.visible .live-announcement-inner{opacity:1;-webkit-transition:opacity .5s .5s;transition:opacity .5s .5s}.live-announcement-inner{display:flex;max-width:1200px}.live-announcement-inner .announcement-decoration{-webkit-align-self:flex-end;-ms-flex-item-align:end;align-self:flex-end;margin-right:1rem}.live-announcement-inner .text{padding:1.25rem 3rem 1.25rem 2rem;position:relative;width:100%}.live-announcement-inner .warning,.live-announcement-inner .warning a{color:#107a8a}.live-announcement-inner .close{height:2.5rem;position:absolute;right:0;top:1rem;width:2.5rem}.live-announcement-inner .close svg{fill:#18b7cf;-webkit-transition:fill .2s;transition:fill .2s}.live-announcement-inner .close svg:hover{fill:#107a8a}.discover-header .project-number{font-size:1.2rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;color:#72a114}.discover-header{background:url(../images/discover.png) bottom left repeat-x #f5f5f5;margin-bottom:2.5rem;padding:1rem 1rem 2rem;text-align:center}.discover-header .discover-header-inner{max-width:1200px;min-width:768px;margin:0 auto}.discover-header .title{font-size:3rem;margin-bottom:0}.discover-header form{margin:0 30%;position:relative}@media (max-width:767px){.discover-header .discover-header-inner{width:90%;min-width:0}.discover-header form{margin:0 .5rem}}.discover-header input[type=text]{background:#fff;border:0;padding:1rem;width:100%}.discover-header input[type=text]:focus{outline-color:#9dce0a}.discover-header input[type=text]:-webkit-autofill{background:rgba(135,155,137,.5)}.discover-header .search-button{position:absolute;right:1rem;top:1rem}.discover-header .search-button:hover svg{fill:#72a114}.discover-header svg{fill:#b8b8b8;height:1.5rem;-webkit-transition:all .2;transition:all .2;width:1.5rem}.discover-search-subfilter .results{font-size:.9rem}.discover-results-header .title{font-size:1.6rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;text-transform:uppercase}.discover-results-header .discover-results-header-inner{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.discover-results-header svg{width:1.1rem;height:1.1rem;fill:#b8b8b8}.discover-results-header h2{display:inline-block}.filter-discover-search .discover-search-filter{margin-right:1rem}.filter-discover-search .discover-search-filter.active{color:#72a114}.discover-search-subfilter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:relative}.discover-search-subfilter:after,.discover-search-subfilter:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.discover-search-subfilter:after{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:8px;margin-left:-8px}.discover-search-subfilter:before{border-color:rgba(245,245,245,0);border-bottom-color:#f5f5f5;border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.discover-search-subfilter.most-liked-subfilter::after,.discover-search-subfilter.most-liked-subfilter::before{left:85%}.discover-search-subfilter.most-active-subfilter::after,.discover-search-subfilter.most-active-subfilter::before{left:95%}.discover-search-subfilter.ng-enter{-webkit-animation:dropdownFade .2s;animation:dropdownFade .2s}.discover-search-subfilter .results{color:#ff8282;display:block;padding:.5rem 1rem;-webkit-transition:all .2s;transition:all .2s}.discover-search-subfilter .results:hover{color:red}.discover-search-subfilter .filter-list{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 0 0 auto}.discover-search-subfilter .filter-list a{display:block;padding:.5rem 1rem;-webkit-transition:all .2s;transition:all .2s}.featured-project,.featured-projects-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.discover-search-subfilter .filter-list a:hover{background:#b8b8b8;color:currentColor}.discover-search-subfilter .filter-list a.active{background:#9dce0a;color:#f5f5f5}.featured-project .project-card-description,.featured-project .statistic{font-size:.9rem}.featured-project .project-card-name a{font-size:1.2rem}.featured-project .project-card-description{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.featured-projects .title{font-size:1.6rem;font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#444;text-align:center}.featured-projects{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.featured-projects{width:90%;min-width:0}}.featured-projects-inner{-webkit-box-align:stretch;-webkit-align-items:stretch;-ms-flex-align:stretch;align-items:stretch;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.featured-project{background:#fff;border:1px solid #f5f5f5;margin:.5rem;display:flex;-webkit-flex-basis:23%;-ms-flex-preferred-size:23%;flex-basis:23%;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;max-width:23%}.featured-project .tags-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.3rem}.featured-project .project-tag{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.featured-project .project-card-inner{padding:1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.featured-project .project-card-description{color:#555}.featured-project .project-card-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:auto}.featured-project .project-card-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.featured-project .project-card-statistics .svg-eye-closed{display:none}.featured-project .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.featured-project .project-card-name a,.featured-project .statistic.active{color:#72a114}.featured-project .statistic.active svg{fill:#72a114}.featured-project .project-card-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.featured-project .project-card-logo{display:inline-block;-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:50px;height:50px;margin-right:.5rem}.featured-project .project-card-logo img{width:100%}.featured-project .project-card-name{line-height:.9}.featured-project .project-card-name a:hover{color:#9dce0a}.featured-project .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8;margin:0 .5rem}@media (max-width:767px){.featured-project{-webkit-flex-basis:45%;-ms-flex-preferred-size:45%;flex-basis:45%}}@media (max-width:480px){.featured-project{-webkit-flex-basis:100%;-ms-flex-preferred-size:100%;flex-basis:100%}}.filter-highlighted li,.highlighted-project .project-description,.highlighted-project .statistic{font-size:.9rem}.highlighted-project .project-title{font-size:1.2rem}.highlighted .title{font-size:1.6rem}.highlighted .empty-highlighted-project span{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted-project .project-title{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.highlighted{margin:1rem auto 4rem;max-width:1200px;min-width:768px;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-justify-content:space-around;-ms-flex-pack:distribute;justify-content:space-around}@media (max-width:767px){.highlighted{width:90%;min-width:0;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.highlighted tg-most-active{margin-top:4rem}}.highlighted tg-most-active,.highlighted tg-most-liked{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.highlighted tg-most-liked{margin-right:8%}@media (max-width:767px){.highlighted tg-most-liked{margin-right:0}}.highlighted .most-active,.highlighted .most-liked{-webkit-align-content:stretch;-ms-flex-line-pack:stretch;align-content:stretch;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.highlighted .header{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1rem}.highlighted .header svg{width:1.5rem;height:1.5rem;fill:#b8b8b8;margin:.5rem}.highlighted .title-wrapper{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.highlighted .title{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;color:#444;display:inline-block;margin:0}.empty-discover-results .title,.home-project .project-card-description,.home-wrapper .title-bar,.projects-empty p,.watching-empty p,.working-on-empty p{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.highlighted .highlighted-projects-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:start;-webkit-justify-content:flex-start;-ms-flex-pack:start;justify-content:flex-start}.highlighted .loading-container{margin-top:calc(50% - 1rem)}.highlighted .loading-spinner{display:block;margin:2rem auto;max-height:3rem;max-width:3rem}.highlighted .view-more-projects{margin-top:auto;width:100%}.highlighted .empty-highlighted-project{border:2px dashed #f5f5f5;padding:2rem;text-align:center}.highlighted .empty-highlighted-project svg{width:2rem;height:2rem;display:block;fill:#b8b8b8;margin:1rem auto}.highlighted .empty-highlighted-project span{color:#555;display:block}.filter-highlighted{position:relative}.filter-highlighted .current-filter{padding:1rem}.filter-highlighted .current-filter span{margin-left:.2rem;position:relative;top:.2rem}.filter-highlighted .filter-list{background:#000;position:absolute;right:0;top:1.5rem}.filter-highlighted .filter-list.ng-enter{-webkit-animation:dropdownFade .2s ease-in;animation:dropdownFade .2s ease-in}.filter-highlighted .filter-list.ng-leave{-webkit-animation:dropdownFade .2s ease-in;animation:dropdownFade .2s ease-in;-webkit-animation-direction:reverse;animation-direction:reverse}.filter-highlighted li{color:#fff;cursor:pointer;min-width:8rem;padding:.25rem .5rem}.filter-highlighted li:hover{background:rgba(157,206,10,.4)}.highlighted-project{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:9rem;-ms-flex-preferred-size:9rem;flex-basis:9rem;min-height:9rem;padding:1.5rem 0}.highlighted-project:nth-last-child(-n+2){border-bottom:0}.highlighted-project .project-logo{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;height:auto;margin-right:1rem;width:3rem}.highlighted-project .project-logo img{width:100%}.highlighted-project .project-data-container{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.highlighted-project .single-project-header{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.highlighted-project .project-title{display:inline-block;margin-bottom:.5rem}.highlighted-project .project-title a{color:#72a114}.highlighted-project .project-title a:hover{color:#9dce0a}.highlighted-project .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8;margin-left:.5rem}.highlighted-project .project-description{color:#555;margin-bottom:0}.highlighted-project .project-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:140px;-ms-flex-preferred-size:140px;flex-basis:140px;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.highlighted-project .project-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.highlighted-project .project-statistics .svg-eye-closed{display:none}.highlighted-project .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.highlighted-project .statistic.active{color:#72a114}.highlighted-project .statistic.active svg{fill:#72a114}.discover-results .statistic{font-size:.9rem}.discover-search .discover-header form{margin:0 8rem;position:relative}.discover-search .discover-header .search-button{left:1rem;right:auto}.discover-search .discover-header .searchbox input{padding-left:3.5rem;padding-right:23rem}.discover-search .searchbox-filters{position:absolute;right:1rem;top:.7rem;width:auto}.discover-search .searchbox-filters input{display:none}.discover-search .searchbox-filters label{border-radius:4px;color:#b8b8b8;cursor:pointer;display:inline-block;padding:.4rem .75rem;-webkit-transition:all .2s;transition:all .2s;-webkit-transition-delay:.2s;transition-delay:.2s}.discover-search .searchbox-filters label.active{background:#9dce0a;color:#fff}.discover-search .searchbox-filters label:hover{background:#f5f5f5;color:#555}.discover-results{margin:1rem auto;max-width:1200px;min-width:768px}@media (max-width:767px){.discover-results{width:90%;min-width:0}}.discover-results .discover-results-inner .spin{margin-top:4rem}.discover-results .list-itemtype-project{border-bottom:1px solid #b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:1rem 0}.discover-results .list-itemtype-project:last-child{border-bottom:0}.discover-results .list-itemtype-project-left{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%}.discover-results .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.discover-results .list-itemtype-project-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;vertical-align:middle}.discover-results .look-for-people{margin-left:.5rem}.discover-results .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8}.discover-results .project-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-basis:300px;-ms-flex-preferred-size:300px;flex-basis:300px;-webkit-box-pack:end;-webkit-justify-content:flex-end;-ms-flex-pack:end;justify-content:flex-end}.discover-results .project-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.discover-results .project-statistics .svg-eye-closed{display:none}.discover-results .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.discover-results .statistic.active{color:#72a114}.discover-results .statistic.active svg{fill:#72a114}.discover-results .more-results{display:block;margin:0 20rem;-webkit-transition:inherit;transition:inherit}.discover-results div[tg-loading] img{display:block;margin:0 auto}.empty-discover-results{margin:4rem auto 1rem;max-width:1200px;min-width:768px;text-align:center}@media (max-width:767px){.empty-discover-results{width:90%;min-width:0}}.empty-discover-results img{margin-bottom:1rem}.empty-discover-results .title{font-size:1.2rem;margin:0;text-transform:uppercase}.external-app-wrapper .app-card a,.external-app-wrapper .app-card p,.external-app-wrapper .user-card a{font-size:.75rem}.external-app-wrapper .cancel{font-size:.9rem}.external-app-wrapper .app-card h3,.external-app-wrapper .user-card h3{font-size:1.2rem}.external-app-wrapper{margin:2rem auto;text-align:center;width:480px}.external-app-wrapper .logo{height:6rem;margin:0 auto;width:6rem}.external-app-wrapper h1{margin-bottom:0}.external-app-wrapper .app-card,.external-app-wrapper .user-card{line-height:1.4;margin-bottom:2rem;text-align:left}.external-app-wrapper .app-card .card-inner,.external-app-wrapper .user-card .card-inner{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.external-app-wrapper .app-card a,.external-app-wrapper .button-green,.external-app-wrapper .user-card a{display:block}.external-app-wrapper .app-card img,.external-app-wrapper .user-card img{width:100%}.external-app-wrapper .app-card h3,.external-app-wrapper .app-card p,.external-app-wrapper .user-card h3,.external-app-wrapper .user-card p{margin:0}.external-app-wrapper .app-card a,.external-app-wrapper .user-card .card-inner{margin-bottom:.5rem}.external-app-wrapper .app-card .app-image{-webkit-flex-basis:100px;-ms-flex-preferred-size:100px;flex-basis:100px;margin-right:1rem;max-width:105px}.external-app-wrapper .app-card .app-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.external-app-wrapper .user-card{background:#fff8e4;border:1px solid #f1e8cd;padding:1rem}.external-app-wrapper .user-card .user-image{-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;margin-right:1rem;max-width:55px}.external-app-wrapper .cancel{display:block;margin-top:.5rem;text-align:left}@media (max-width:480px){.external-app-wrapper{margin:0;min-width:100%;padding:2rem 1rem;text-align:center;width:100%}}.watching,.working-on{margin-bottom:2rem}.watching .duty-single,.working-on .duty-single{border-bottom:1px solid #f5f5f5;cursor:pointer;-webkit-transition:background .2s;transition:background .2s;-webkit-transition-delay:.2s;transition-delay:.2s}.watching .duty-single:hover,.working-on .duty-single:hover{background:rgba(157,206,10,.1)}.watching .duty-single:last-child,.working-on .duty-single:last-child{border:0}.watching .duty-single>a,.working-on .duty-single>a{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;border-bottom:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.empty-ticket .data,.home-project .project-card-inner{-webkit-box-orient:vertical;-webkit-box-direction:normal}.watching .duty-single>a.blocked,.working-on .duty-single>a.blocked{background:rgba(255,130,130,.2);color:red}.watching .see-more,.working-on .see-more{display:block;margin:2rem 30%}.home-wrapper,.home-wrapper .title-bar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-wrapper{display:flex}.home-wrapper .duty-summary{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.home-wrapper .project-list{width:250px}.home-wrapper .see-more-projects-btn{display:block}.home-wrapper .title-bar{font-size:1.6rem;-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;background:#f5f5f5;display:flex;margin:0 0 .5rem;padding:.9rem 1rem}.home-project .project-card-description,.home-project .statistic,.projects-empty p{font-size:.9rem}.home-project{background:#fff;border:1px solid #f5f5f5;margin:.5rem .5rem 1rem;cursor:pointer;-webkit-transition:.2s;transition:.2s;-webkit-transition-delay:.1s;transition-delay:.1s}.home-project .tags-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;height:.3rem}.home-project .project-tag{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.home-project .project-card-inner{padding:1rem;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;width:100%}.home-project .project-card-description{color:#555}.home-project .project-card-statistics{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-top:auto}.home-project .project-card-statistics svg{width:.8rem;height:.8rem;fill:#b8b8b8}.home-project .project-card-statistics .svg-eye-closed{display:none}.home-project .statistic{color:#b8b8b8;display:inline-block;margin-right:.5rem}.empty-ticket,.home-project .project-card-header{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.home-project .statistic.active{color:#72a114}.home-project .statistic.active svg{fill:#72a114}.home-project .project-card-header{display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0}.home-project .project-card-logo{display:inline-block;-webkit-flex-basis:50px;-ms-flex-preferred-size:50px;flex-basis:50px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:50px;height:50px;margin-right:.5rem}.home-project .project-card-logo img{width:100%}.home-project .project-card-name{line-height:.9}.home-project .project-card-name a{font-size:1.2rem;color:#72a114}.home-project .project-card-name a:hover{color:#9dce0a}.home-project .look-for-people svg{width:1rem;height:1rem;fill:#b8b8b8;margin:0 .5rem}.home-project:hover{border:1px solid #9dce0a}.projects-empty{text-align:center}.projects-empty svg{height:100px;margin:1rem auto;text-align:center;width:100%}.projects-empty svg path{fill:#f5f5f5}.projects-empty .create-project-button{display:block;margin-bottom:.25rem}.projects-empty .import-project-button{display:block}.watching-empty,.working-on-empty{margin-bottom:4rem}.watching-empty p,.working-on-empty p{margin:2rem 9rem 1rem;text-align:center}.empty-ticket{display:flex}.empty-ticket .data,.navbar{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.empty-ticket:not(:last-child){border-bottom:1px solid #f5f5f5;padding:1rem 0}.empty-ticket:last-child{padding:1rem 0 0}.empty-ticket .avatar{background:#e8e8e8;-webkit-flex-basis:48px;-ms-flex-preferred-size:48px;flex-basis:48px;height:48px;margin-right:1rem;width:48px}.empty-ticket .data{display:flex;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.empty-ticket .line{background:#f5f5f5;height:1rem;margin-bottom:1rem;width:40vw}.empty-ticket .line:last-child{margin:0;width:20vw}.navbar{display:flex;height:40px;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;position:relative}.navbar::after{background-size:200%;bottom:0;content:'';height:100%;left:0;position:absolute;right:0;top:0;z-index:-1}.navbar .nav-left,.navbar .nav-right{-webkit-align-content:center;-ms-flex-line-pack:center;align-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.navbar .nav-left>a{color:#fff;padding:.5rem 1.5rem}.navbar .nav-left>a.logo{background:rgba(0,0,0,.2);padding:.4rem .75rem}.navbar .nav-left>a svg{height:1.6rem;max-height:1.6rem;max-width:2rem;width:1.6rem}.navbar .nav-left>a path{fill:#fff}.navbar .nav-right{margin-left:auto}.navbar .nav-right a{color:#fff;padding:.5rem 2rem}.navbar a{color:#fff;display:inline-block;-webkit-transition:all .2s linear;transition:all .2s linear}.navbar a svg path{fill:#718874}.navbar a:hover{background:rgba(0,0,0,.2);color:#9dce0a}.navbar a:hover svg path{fill:#fff}.navbar a.user-avatar{min-width:200px;padding:0 0 0 2rem;text-align:right}.navbar a.user-avatar span{padding-right:1rem}.navbar img{height:2.5rem;padding-left:.5rem;vertical-align:middle}.navbar svg{height:1.2rem;max-height:1.2rem;max-width:1.2rem;width:1.2rem}.navbar svg path{fill:#11241f;-webkit-transition:all .2s;transition:all .2s}.navbar .topnav-dropdown-wrapper{position:relative}.navbar .topnav-dropdown-wrapper:hover .navbar-dropdown{-webkit-animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;animation:dropdownFade .2s cubic-bezier(.09,0,.99,.01) both;display:block}.navbar .navbar-dropdown a{padding:.8rem .5rem}.navbar .navbar-dropdown{border-radius:2px;display:none;left:calc(50% - 350px/2);min-width:350px;position:absolute;top:2.4rem;z-index:999}.navbar-dropdown{background:#050505;border:1px solid #000;padding:.3rem}.navbar-dropdown.dropdown-user{left:calc(50% - 200px/2);min-width:200px}.navbar-dropdown.dropdown-user ul{margin-bottom:0}.navbar-dropdown ul{margin:0 0 .5rem;padding:0}.navbar-dropdown ul:after,.navbar-dropdown ul:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none;border-color:rgba(5,5,5,0);border-bottom-color:#050505}.navbar-dropdown ul:after{border-width:8px;margin-left:-8px}.navbar-dropdown ul:before{border-width:calc(8px + 1px);margin-left:calc(-8px + 1px)}.navbar-dropdown a{color:#b8b8b8;display:block;padding:.8rem .5rem}.navbar-dropdown .create-options,.profile-filter{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.navbar-dropdown a:hover{background:rgba(255,255,255,.1);color:#9dce0a}.navbar-dropdown a.create-organization-btn,.navbar-dropdown a.create-project-btn,.navbar-dropdown a.see-more-projects-btn{color:#fff;text-align:center}.navbar-dropdown a.create-organization-btn:hover,.navbar-dropdown a.create-project-btn:hover,.navbar-dropdown a.see-more-projects-btn:hover{color:#fff}.navbar-dropdown a.see-more-projects-btn{margin-bottom:.3rem}.navbar-dropdown a.create-project-btn{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.navbar-dropdown a.import-project-button{padding-left:.75rem;padding-right:.75rem}.navbar-dropdown .create-options{display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.profile-favs{border-top:1px solid #f5f5f5}.profile-filter{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:1rem 0;padding:.5rem 1rem}.profile,.profile-filter .searchbox{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox}.profile-filter .searchbox{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-filter .searchbox .icon-search{color:grayer;margin-right:.5rem}.profile-filter .searchbox input{border:0;border-bottom:1px solid transparent;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:1rem}.profile-bar .profile-stats,.profile-contacts,.profile-content-tabs,.profile-projects,.profile-timeline{border-top:1px solid #f5f5f5}.profile-filter .searchbox input:focus{border-bottom:1px solid #b8b8b8;outline:0;-webkit-transition:border-bottom .3s ease-in;transition:border-bottom .3s ease-in}.profile-filter .filters a{color:#b8b8b8;display:inline-block;padding:0 .5rem}.profile-filter .filters a.active,.profile-filter .filters a:hover{color:#050505}.profile .timeline-wrapper .spin img{animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32;max-height:3rem;max-width:3rem}.profile{display:flex;min-height:calc(100vh - 40px);padding:2rem 0}.profile .profile-bar{margin-right:1rem;width:200px}.profile .main{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;padding:0}.profile .timeline-wrapper{background:#fff;margin-right:3.5rem;width:768px}.profile .timeline-wrapper>div{opacity:1;padding-top:0;position:relative;-webkit-transition:all .3s cubic-bezier(.09,.43,.35,.95);transition:all .3s cubic-bezier(.09,.43,.35,.95)}.profile .timeline-wrapper>div.ng-hide{opacity:0;padding-top:.5vh}.profile .timeline-wrapper .spin{margin:10% auto;width:3rem}.profile .profile-sidebar{-webkit-flex-basis:150px;-ms-flex-preferred-size:150px;flex-basis:150px;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:150px}.profile .profile-sidebar .button-gray{display:block;margin-bottom:2rem;padding-left:2rem;padding-right:2rem}.profile .empty-tab{padding:5vh;text-align:center}.profile .empty-tab svg{margin:2rem auto;max-width:160px;text-align:center}.profile .empty-tab p{font-size:.9rem}.profile-bar .profile-stats .stat-name{font-size:.9rem;font-family:OpenSans-CondLight,Arial,Helvetica,sans-serif}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username{font-size:1.2rem}.profile-bar h2{font-size:1.6rem}.profile-bar .profile-stats .stat-number,.profile-bar h1{font-size:2rem}.profile-bar .profile-edition,.profile-bar .profile-quote,.profile-bar .username,.profile-bar h2{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-bar .profile-organizations h3,.profile-bar .profile-stats .stat-number,.profile-bar h1{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-bar .profile-image-wrapper{height:200px;margin-bottom:1rem;overflow:hidden;position:relative}.profile-bar .profile-image-wrapper.is-current-user:hover img{-webkit-filter:brightness(40%) saturate(150%) hue-rotate(60deg);filter:brightness(40%) saturate(150%) hue-rotate(60deg);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1)}.profile-bar .profile-image-wrapper.is-current-user:hover .profile-edition{opacity:1;-webkit-transform:translateY(0);transform:translateY(0);-webkit-transition:all .2s cubic-bezier(.01,.7,1,1);transition:all .2s cubic-bezier(.01,.7,1,1);-webkit-transition-delay:.3s;transition-delay:.3s}.profile-bar .profile-img{max-width:100%;width:100%}.profile-bar .profile-edition{background:rgba(0,0,0,.4);bottom:0;color:#fff;left:0;opacity:0;overflow:hidden;padding:1rem;position:absolute;-webkit-transform:translateY(100%);transform:translateY(100%);width:100%}.profile-bar .profile-edition:hover{background:rgba(0,0,0,.8);-webkit-transition:all .3s cubic-bezier(.01,.7,1,1);transition:all .3s cubic-bezier(.01,.7,1,1)}.profile-bar .button-green{display:block;margin-bottom:1rem}.profile-bar .profile-data{position:relative}.profile-bar .flag{position:absolute;right:0;top:0;width:12px}.profile-bar .flag path{fill:#b8b8b8;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar .flag:hover path{fill:red;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-bar h1{line-height:1.2;margin-bottom:.25rem;text-transform:none}.profile-bar h2{color:#555;line-height:1.2;margin-bottom:1rem}.profile-bar .location,.profile-bar .username{color:#b8b8b8;margin-bottom:1rem}.profile-bar .location svg{position:relative;top:2px;width:.75rem}.profile-bar .location path{fill:#b8b8b8}.profile-bar .profile-stats{border-bottom:1px solid #f5f5f5;color:#555;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin-bottom:1.25rem;padding:1rem .5rem}.profile-bar .profile-stats .stat{padding:0 .2rem;text-align:center}.profile-bar .profile-stats .stat-number{display:block;line-height:1}.profile-bar .profile-stats .stat-name{display:block}.profile-bar .profile-organizations{border-bottom:1px solid #f5f5f5;border-top:1px solid #f5f5f5;margin-bottom:1rem;padding:1rem 0}.profile-bar .profile-organizations h3{margin-bottom:.5rem}.profile-bar .profile-organizations .profile-organizations-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between}.profile-bar .profile-organizations .organization{background:#b8b8b8;border-radius:5px;height:45px;margin-right:.2rem;width:45px}.profile-bar .profile-quote{background:url(../images/quote.png) top left no-repeat;line-height:1.4;padding:.5rem}.profile-contact-single .profile-contact-data h1 span{font-size:.9rem}.profile-contact-single .profile-contact-data .extra-info{font-family:OpenSans-Light,Arial,Helvetica,sans-serif}.profile-contact-single .profile-contact-data h1,.profile-contact-single .profile-contact-data h1 span{font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.profile-contacts{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.profile-contact-filters{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.profile-contact-filters a{border-bottom:2px solid #fff;color:#b8b8b8;display:inline-block;padding:1rem 1.5rem;-webkit-transition:all .2s linear;transition:all .2s linear}.profile-contact-filters a.active,.profile-contact-filters a:hover{border-bottom:2px solid #b8b8b8;color:#72a114}.profile-contact-single{border-bottom:1px solid #f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;padding:.8rem 1rem}.profile-contact-single .profile-contact-picture{-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-right:1rem;max-width:54px}.profile-contact-single .profile-contact-picture img{border-radius:.2rem;width:100%}.profile-contact-single .profile-contact-data{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-contact-single .profile-contact-data h1{font-size:1.2rem;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;line-height:1.6;margin-bottom:0;text-transform:none}.profile-contact-single .profile-contact-data h1 span{background:#f5f5f5;color:#555;margin-left:1rem;padding:.1rem .3rem}.profile-contact-single .profile-contact-data p{color:#555;margin-bottom:0}.profile-contact-single .profile-contact-data .extra-info{color:#555}.profile-contact-single .profile-contact-data .position{margin-right:.3rem}.profile-contact-single .profile-project-stats{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:0;-webkit-flex-grow:0;-ms-flex-positive:0;flex-grow:0;margin-left:auto;width:100px}.profile-contact-single .profile-project-stats div{color:#b8b8b8;margin-right:.5rem}.profile-contact-single .profile-project-stats div .icon{margin-right:.2rem;vertical-align:center}.profile-content-tabs{z-index:9}.profile-content-tabs .tab{color:#b8b8b8;display:inline-block;padding:1rem}.profile-content-tabs .tab.active,.profile-content-tabs .tab:hover{color:#444;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active{background:#fff;border-left:1px solid #f5f5f5;border-right:1px solid #f5f5f5;position:relative;top:1px;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .tab.active .icon{color:#72a114;-webkit-transition:color .2s linear;transition:color .2s linear}.profile-content-tabs .icon{margin-right:.4rem}.profile-sidebar h4{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif;background:#f5f5f5;color:#555;margin-bottom:.5rem;padding:.5rem}.profile-sidebar h4 .icon{color:#b8b8b8;margin-right:.3rem;vertical-align:text-bottom}.profile-sidebar p{font-size:.9rem;color:#b8b8b8}.profile-sidebar a{color:#72a114}.profile-sidebar .trans-button{margin-bottom:1rem}.profile-projects .list-itemtype-project{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;min-height:10rem}.profile-projects .list-itemtype-project .project-list-single-title-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.profile-projects .list-itemtype-project .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0}.profile-projects .list-itemtype-project .list-itemtype-project-right{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:200px}.project-list-wrapper .help-area{font-size:.9rem;color:#b8b8b8;width:200px}.project-list-wrapper .drag{font-size:1.2rem}.project-list-wrapper{position:relative}.project-list-wrapper .project-list-title{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;background:#f5f5f5;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-webkit-justify-content:space-between;-ms-flex-pack:justify;justify-content:space-between;margin:2rem 0 1rem;padding:.9rem 1rem}.project-list-wrapper .project-list-title h1{font-size:1.6rem;font-family:OpenSans-Light,Arial,Helvetica,sans-serif;margin:0}.project-list-wrapper .create-options a.create-project-btn{margin-right:.25rem;padding:.6rem 2.5rem}.project-list-wrapper .create-options a.import-project-button{padding:.53rem .8rem}.project-list-wrapper .create-options a.import-project-button:hover{background:#444}.project-list-wrapper .create-options a.import-project-button .icon-upload{margin:0}.project-list-wrapper .project-list-section{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-list-wrapper .project-list{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1;margin-right:2rem}.project-list-wrapper .placeholder{background-color:#fdfdfd;height:5rem}.project-list-wrapper .list-itemtype-project{background:rgba(255,255,255,.6)}.project-list-wrapper .list-itemtype-project:hover{background:#fcfef8;cursor:move;-webkit-transition:background .3s;transition:background .3s}.master,body{background:#fff}.project-list-wrapper .list-itemtype-project:hover .drag{opacity:1}.project-list-wrapper .list-itemtype-project .list-itemtype-project-data-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.project-list-wrapper .list-itemtype-project .list-itemtype-project-image{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem}.project-list-wrapper .drag{-webkit-align-self:center;-ms-flex-item-align:center;align-self:center;color:#b8b8b8;opacity:0;-webkit-transition:opacity .2s;transition:opacity .2s}.profile-timeline .single-attachment span{font-size:1rem;font-family:OpenSans-Regular,Arial,Helvetica,sans-serif}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child,.profile-timeline .activity-member-view a{font-family:OpenSans-Semibold,Arial,Helvetica,sans-serif}.profile-timeline .spin img{-webkit-animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;animation:rotate 1.5s cubic-bezier(0,.05,.87,1.04) infinite alternate;margin:0 auto;-webkit-transform-origin:32 32;transform-origin:32 32}.profile-timeline .activity-item{border-bottom:1px solid #f5f5f5;padding:1rem .5rem 1rem 0;position:relative}.profile-timeline .activity-item p{margin-bottom:0}.profile-timeline .activity-item .username,.profile-timeline .activity-item a{color:#72a114}.profile-timeline .activity-item .username:first-child,.profile-timeline .activity-item a:first-child{color:#555}.profile-timeline .activity-item a:hover{color:#9dce0a}.profile-timeline .activity-item blockquote{line-height:1.4rem;margin-bottom:0;margin-left:calc(35px + 1rem);margin-top:.5rem;overflow-x:auto;overflow-y:hidden;white-space:pre-line}.profile-timeline .activity-item img{max-height:640px;max-width:640px}.profile-timeline .activity-item .activity-info{-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;color:#b8b8b8;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-right:130px}.profile-timeline .activity-item .activity-date{color:#b8b8b8;font-size:.75rem;position:absolute;right:.5rem;top:1.2rem}.profile-timeline .activity-item .profile-contact-picture,.profile-timeline .activity-item .profile-member-picture{border-radius:.1rem;-webkit-flex-basis:2rem;-ms-flex-preferred-size:2rem;flex-basis:2rem;-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;margin-right:1rem;vertical-align:center;width:2rem}.profile-timeline .activity-item .profile-contact-picture img,.profile-timeline .activity-item .profile-member-picture img{width:100%}.profile-timeline .activity-member-view{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin-bottom:.5rem;margin-left:calc(35px + 1rem);margin-top:.5rem}.profile-timeline .activity-member-view .profile-member-picture{-webkit-flex-basis:3rem;-ms-flex-preferred-size:3rem;flex-basis:3rem;width:3rem}.profile-timeline .activity-member-view .activity-member-info{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.profile-timeline .activity-member-view p{color:#b8b8b8}a,body{color:#444}.profile-timeline .single-attachment{border:0;padding:0}.profile-timeline .single-attachment span{display:inline-block;max-width:95%;overflow:hidden;text-overflow:ellipsis;vertical-align:middle;white-space:nowrap}.profile-timeline .single-attachment .icon{margin-right:.3rem}.profile-timeline .spin{margin:10% auto;width:3rem}.profile-timeline .spin img{max-height:3rem;max-width:3rem}.markItUpEditor{font-size:.9rem;line-height:1.5;font-family:monospace}:root .taskboard-table-body .task-row,_:-ms-fullscreen .task-row{min-height:auto}.menu-secondary{background:#f5f5f5}.menu-tertiary{background-color:#879b89}.extrabar{background:#f5f5f5}h1,h2,h3,h4,h5,h6{color:#050505}a:hover{color:#72a114}input[type=number],input[type=text],input[type=password],input[type=email],input[type=date],select,textarea{background:#f5f5f5;border-color:#b8b8b8;color:#444}input[type=number]::-webkit-input-placeholder,input[type=text]::-webkit-input-placeholder,input[type=password]::-webkit-input-placeholder,input[type=email]::-webkit-input-placeholder,input[type=date]::-webkit-input-placeholder,select::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#9f9f9f}input[type=number]::-moz-placeholder,input[type=text]::-moz-placeholder,input[type=password]::-moz-placeholder,input[type=email]::-moz-placeholder,input[type=date]::-moz-placeholder,select::-moz-placeholder,textarea::-moz-placeholder{color:#9f9f9f}input[type=number]:-moz-placeholder,input[type=text]:-moz-placeholder,input[type=password]:-moz-placeholder,input[type=email]:-moz-placeholder,input[type=date]:-moz-placeholder,select:-moz-placeholder,textarea:-moz-placeholder{color:#9f9f9f}input[type=number]:-ms-input-placeholder,input[type=text]:-ms-input-placeholder,input[type=password]:-ms-input-placeholder,input[type=email]:-ms-input-placeholder,input[type=date]:-ms-input-placeholder,select:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#9f9f9f}input[type=number].checksley-error,input[type=text].checksley-error,input[type=password].checksley-error,input[type=email].checksley-error,input[type=date].checksley-error,select.checksley-error,textarea.checksley-error{border:1px solid red}.checksley-error-list{font-family:OpenSans-Light,Arial,Helvetica,sans-serif;background:rgba(255,0,0,.7);color:#fff}blockquote{border-left:5px solid #f5f5f5}blockquote,blockquote p,cite{color:#555}.summary{background:#444;color:#fff}.kanban-table-header .task-colum-name .icon,.taskboard-table-header .task-colum-name .icon{color:#b8b8b8}.navbar{background:rgba(0,0,0,.5)}.navbar::after{background:url(../images/menu-vert.png) top left}tg-project-menu{background-color:#879b89;background-image:url(../images/menu.png)}.kanban-table-body .kanban-uses-box,.kanban-table-header .task-colum-name,.taskboard-table-body .taskboard-tasks-box{background:#f5f5f5}.main-nav svg path{fill:#fff}.taskboard-table-header .task-colum-name{background:#f5f5f5;border-top:3px solid #b8b8b8}.kanban-table-header .task-colum-name{border-top:3px solid #b8b8b8} \ No newline at end of file diff --git a/dist/v-1454172424320/svg/activity.svg b/dist/v-1454396495445/svg/activity.svg similarity index 100% rename from dist/v-1454172424320/svg/activity.svg rename to dist/v-1454396495445/svg/activity.svg diff --git a/dist/v-1454172424320/svg/add.svg b/dist/v-1454396495445/svg/add.svg similarity index 100% rename from dist/v-1454172424320/svg/add.svg rename to dist/v-1454396495445/svg/add.svg diff --git a/dist/v-1454172424320/svg/attachment.svg b/dist/v-1454396495445/svg/attachment.svg similarity index 100% rename from dist/v-1454172424320/svg/attachment.svg rename to dist/v-1454396495445/svg/attachment.svg diff --git a/dist/v-1454172424320/svg/check.svg b/dist/v-1454396495445/svg/check.svg similarity index 100% rename from dist/v-1454172424320/svg/check.svg rename to dist/v-1454396495445/svg/check.svg diff --git a/dist/v-1454172424320/svg/client-requirement.svg b/dist/v-1454396495445/svg/client-requirement.svg similarity index 100% rename from dist/v-1454172424320/svg/client-requirement.svg rename to dist/v-1454396495445/svg/client-requirement.svg diff --git a/dist/v-1454172424320/svg/dashboard.svg b/dist/v-1454396495445/svg/dashboard.svg similarity index 100% rename from dist/v-1454172424320/svg/dashboard.svg rename to dist/v-1454396495445/svg/dashboard.svg diff --git a/dist/v-1454172424320/svg/discover.svg b/dist/v-1454396495445/svg/discover.svg similarity index 100% rename from dist/v-1454172424320/svg/discover.svg rename to dist/v-1454396495445/svg/discover.svg diff --git a/dist/v-1454172424320/svg/empty-project.svg b/dist/v-1454396495445/svg/empty-project.svg similarity index 100% rename from dist/v-1454172424320/svg/empty-project.svg rename to dist/v-1454396495445/svg/empty-project.svg diff --git a/dist/v-1454172424320/svg/eye.svg b/dist/v-1454396495445/svg/eye.svg similarity index 100% rename from dist/v-1454172424320/svg/eye.svg rename to dist/v-1454396495445/svg/eye.svg diff --git a/dist/v-1454172424320/svg/flag.svg b/dist/v-1454396495445/svg/flag.svg similarity index 100% rename from dist/v-1454172424320/svg/flag.svg rename to dist/v-1454396495445/svg/flag.svg diff --git a/dist/v-1454172424320/svg/gallery.svg b/dist/v-1454396495445/svg/gallery.svg similarity index 100% rename from dist/v-1454172424320/svg/gallery.svg rename to dist/v-1454396495445/svg/gallery.svg diff --git a/dist/v-1454172424320/svg/graph.svg b/dist/v-1454396495445/svg/graph.svg similarity index 100% rename from dist/v-1454172424320/svg/graph.svg rename to dist/v-1454396495445/svg/graph.svg diff --git a/dist/v-1454172424320/svg/help.svg b/dist/v-1454396495445/svg/help.svg similarity index 100% rename from dist/v-1454172424320/svg/help.svg rename to dist/v-1454396495445/svg/help.svg diff --git a/dist/v-1454172424320/svg/hide.svg b/dist/v-1454396495445/svg/hide.svg similarity index 100% rename from dist/v-1454172424320/svg/hide.svg rename to dist/v-1454396495445/svg/hide.svg diff --git a/dist/v-1454172424320/svg/iocaine.svg b/dist/v-1454396495445/svg/iocaine.svg similarity index 100% rename from dist/v-1454172424320/svg/iocaine.svg rename to dist/v-1454396495445/svg/iocaine.svg diff --git a/dist/v-1454172424320/svg/like.svg b/dist/v-1454396495445/svg/like.svg similarity index 100% rename from dist/v-1454172424320/svg/like.svg rename to dist/v-1454396495445/svg/like.svg diff --git a/dist/v-1454172424320/svg/list.svg b/dist/v-1454396495445/svg/list.svg similarity index 100% rename from dist/v-1454172424320/svg/list.svg rename to dist/v-1454396495445/svg/list.svg diff --git a/dist/v-1454172424320/svg/location.svg b/dist/v-1454396495445/svg/location.svg similarity index 100% rename from dist/v-1454172424320/svg/location.svg rename to dist/v-1454396495445/svg/location.svg diff --git a/dist/v-1454172424320/svg/lock.svg b/dist/v-1454396495445/svg/lock.svg similarity index 100% rename from dist/v-1454172424320/svg/lock.svg rename to dist/v-1454396495445/svg/lock.svg diff --git a/dist/v-1454172424320/svg/logo-color.svg b/dist/v-1454396495445/svg/logo-color.svg similarity index 100% rename from dist/v-1454172424320/svg/logo-color.svg rename to dist/v-1454396495445/svg/logo-color.svg diff --git a/dist/v-1454172424320/svg/logo-moustache.svg b/dist/v-1454396495445/svg/logo-moustache.svg similarity index 100% rename from dist/v-1454172424320/svg/logo-moustache.svg rename to dist/v-1454396495445/svg/logo-moustache.svg diff --git a/dist/v-1454172424320/svg/logo-nav.svg b/dist/v-1454396495445/svg/logo-nav.svg similarity index 100% rename from dist/v-1454172424320/svg/logo-nav.svg rename to dist/v-1454396495445/svg/logo-nav.svg diff --git a/dist/v-1454172424320/svg/logo.svg b/dist/v-1454396495445/svg/logo.svg similarity index 100% rename from dist/v-1454172424320/svg/logo.svg rename to dist/v-1454396495445/svg/logo.svg diff --git a/dist/v-1454172424320/svg/organizations.svg b/dist/v-1454396495445/svg/organizations.svg similarity index 100% rename from dist/v-1454172424320/svg/organizations.svg rename to dist/v-1454396495445/svg/organizations.svg diff --git a/dist/v-1454172424320/svg/pattern.svg b/dist/v-1454396495445/svg/pattern.svg similarity index 100% rename from dist/v-1454172424320/svg/pattern.svg rename to dist/v-1454396495445/svg/pattern.svg diff --git a/dist/v-1454172424320/svg/project.svg b/dist/v-1454396495445/svg/project.svg similarity index 100% rename from dist/v-1454172424320/svg/project.svg rename to dist/v-1454396495445/svg/project.svg diff --git a/dist/v-1454172424320/svg/projects.svg b/dist/v-1454396495445/svg/projects.svg similarity index 100% rename from dist/v-1454172424320/svg/projects.svg rename to dist/v-1454396495445/svg/projects.svg diff --git a/dist/v-1454172424320/svg/promote.svg b/dist/v-1454396495445/svg/promote.svg similarity index 100% rename from dist/v-1454172424320/svg/promote.svg rename to dist/v-1454396495445/svg/promote.svg diff --git a/dist/v-1454172424320/svg/recruit.svg b/dist/v-1454396495445/svg/recruit.svg similarity index 100% rename from dist/v-1454172424320/svg/recruit.svg rename to dist/v-1454396495445/svg/recruit.svg diff --git a/dist/v-1454172424320/svg/remove.svg b/dist/v-1454396495445/svg/remove.svg similarity index 100% rename from dist/v-1454172424320/svg/remove.svg rename to dist/v-1454396495445/svg/remove.svg diff --git a/dist/v-1454172424320/svg/search.svg b/dist/v-1454396495445/svg/search.svg similarity index 100% rename from dist/v-1454172424320/svg/search.svg rename to dist/v-1454396495445/svg/search.svg diff --git a/dist/v-1454172424320/svg/spinner-circle.svg b/dist/v-1454396495445/svg/spinner-circle.svg similarity index 100% rename from dist/v-1454172424320/svg/spinner-circle.svg rename to dist/v-1454396495445/svg/spinner-circle.svg diff --git a/dist/v-1454172424320/svg/spinner.svg b/dist/v-1454396495445/svg/spinner.svg similarity index 100% rename from dist/v-1454172424320/svg/spinner.svg rename to dist/v-1454396495445/svg/spinner.svg diff --git a/dist/v-1454172424320/svg/team-requirement.svg b/dist/v-1454396495445/svg/team-requirement.svg similarity index 100% rename from dist/v-1454172424320/svg/team-requirement.svg rename to dist/v-1454396495445/svg/team-requirement.svg diff --git a/dist/v-1454172424320/svg/team.svg b/dist/v-1454396495445/svg/team.svg similarity index 100% rename from dist/v-1454172424320/svg/team.svg rename to dist/v-1454396495445/svg/team.svg diff --git a/dist/v-1454172424320/svg/timeline.svg b/dist/v-1454396495445/svg/timeline.svg similarity index 100% rename from dist/v-1454172424320/svg/timeline.svg rename to dist/v-1454396495445/svg/timeline.svg diff --git a/dist/v-1454172424320/svg/trash.svg b/dist/v-1454396495445/svg/trash.svg similarity index 100% rename from dist/v-1454172424320/svg/trash.svg rename to dist/v-1454396495445/svg/trash.svg diff --git a/dist/v-1454172424320/svg/unlock.svg b/dist/v-1454396495445/svg/unlock.svg similarity index 100% rename from dist/v-1454172424320/svg/unlock.svg rename to dist/v-1454396495445/svg/unlock.svg diff --git a/dist/v-1454172424320/svg/unwatch.svg b/dist/v-1454396495445/svg/unwatch.svg similarity index 100% rename from dist/v-1454172424320/svg/unwatch.svg rename to dist/v-1454396495445/svg/unwatch.svg diff --git a/dist/v-1454172424320/svg/upvote.svg b/dist/v-1454396495445/svg/upvote.svg similarity index 100% rename from dist/v-1454172424320/svg/upvote.svg rename to dist/v-1454396495445/svg/upvote.svg diff --git a/dist/v-1454172424320/svg/watch.svg b/dist/v-1454396495445/svg/watch.svg similarity index 100% rename from dist/v-1454172424320/svg/watch.svg rename to dist/v-1454396495445/svg/watch.svg